Add pointer_to_other.adoc

This commit is contained in:
Peter Dimov
2017-06-12 18:20:54 +03:00
parent 213c00aed7
commit a88d8b5b29
3 changed files with 107 additions and 2 deletions

View File

@ -13,7 +13,7 @@ http://www.boost.org/LICENSE_1_0.txt
:toc-title: :toc-title:
:idprefix: intrusive_ptr_ :idprefix: intrusive_ptr_
## Introduction ## Description
The `intrusive_ptr` class template stores a pointer to an object with an embedded reference count. The `intrusive_ptr` class template stores a pointer to an object with an embedded reference count.
Every new `intrusive_ptr` instance increments the reference count by using an unqualified call to the Every new `intrusive_ptr` instance increments the reference count by using an unqualified call to the
@ -38,6 +38,8 @@ As a general rule, if it isn't obvious whether `intrusive_ptr` better fits your
## Synopsis ## Synopsis
`intrusive_ptr` is defined in `<boost/smart_ptr/intrusive_ptr.hpp>`.
``` ```
namespace boost namespace boost
{ {

View File

@ -1,5 +1,6 @@
//// ////
Copyright 2017 Peter Dimov Copyright 2005, 2006 Ion Gaztañaga
Copyright 2005, 2006, 2017 Peter Dimov
Distributed under the Boost Software License, Version 1.0. Distributed under the Boost Software License, Version 1.0.
@ -13,3 +14,103 @@ http://www.boost.org/LICENSE_1_0.txt
:toc-title: :toc-title:
:idprefix: pointer_to_other_ :idprefix: pointer_to_other_
## Description
The `pointer_to_other` utility provides a way, given a source pointer type, to obtain a pointer of the same type
to another pointee type.
There is test/example code in link:../../test/pointer_to_other_test.cpp[pointer_to_other_test.cpp].
## Rationale
When building pointer independent classes, like memory managers, allocators, or containers, there is often a need to
define pointers generically, so that if a template parameter represents a pointer (for example, a raw or smart pointer
to an `int`), we can define another pointer of the same type to another pointee (a raw or smart pointer to a `float`.)
```
template <class IntPtr> class FloatPointerHolder
{
// Let's define a pointer to a float
typedef typename boost::pointer_to_other
<IntPtr, float>::type float_ptr_t;
float_ptr_t float_ptr;
};
```
## Synopsis
`pointer_to_other` is defined in `<boost/smart_ptr/pointer_to_other.hpp>`.
```
namespace boost
{
template<class T, class U> struct pointer_to_other;
template<class T, class U,
template <class> class Sp>
struct pointer_to_other< Sp<T>, U >
{
typedef Sp<U> type;
};
template<class T, class T2, class U,
template <class, class> class Sp>
struct pointer_to_other< Sp<T, T2>, U >
{
typedef Sp<U, T2> type;
};
template<class T, class T2, class T3, class U,
template <class, class, class> class Sp>
struct pointer_to_other< Sp<T, T2, T3>, U >
{
typedef Sp<U, T2, T3> type;
};
template<class T, class U>
struct pointer_to_other< T*, U >
{
typedef U* type;
};
} // namespace boost
```
If these definitions are not correct for a specific smart pointer, we can define a specialization of `pointer_to_other`.
## Example
```
// Let's define a memory allocator that can
// work with raw and smart pointers
#include <boost/pointer_to_other.hpp>
template <class VoidPtr>
class memory_allocator
{
// Predefine a memory_block
struct block;
// Define a pointer to a memory_block from a void pointer
// If VoidPtr is void *, block_ptr_t is block*
// If VoidPtr is smart_ptr<void>, block_ptr_t is smart_ptr<block>
typedef typename boost::pointer_to_other
<VoidPtr, block>::type block_ptr_t;
struct block
{
std::size_t size;
block_ptr_t next_block;
};
block_ptr_t free_blocks;
};
```
As we can see, using `pointer_to_other` we can create pointer independent code.

View File

@ -43,6 +43,8 @@ The class template is parameterized on `T`, the type of the object pointed to.
## Synopsis ## Synopsis
`scoped_array` is defined in `<boost/smart_ptr/scoped_array.hpp>`.
``` ```
namespace boost namespace boost
{ {