blob: 7b57e0d0cc9d36db088b944fb507d3946ed1c05a [file] [log] [blame]
Brian Silverman407d3cd2018-08-04 17:48:52 -07001[/
2Copyright 2017-2018 Glen Joseph Fernandes
3(glenjofe@gmail.com)
4
5Distributed under the Boost Software License, Version 1.0.
6(http://www.boost.org/LICENSE_1_0.txt)
7]
8
9[section:pointer_traits pointer_traits]
10
11[simplesect Authors]
12
13* Glen Fernandes
14
15[endsimplesect]
16
17[section Overview]
18
19The header <boost/core/pointer_traits.hpp> provides the class template
20`boost::pointer_traits` to facilitate use of pointer-like types. The C++11
21standard library introduced `std::pointer_traits` along with an allocator
22model which supported pointer-like types in addition to plain raw pointers.
23This implementation also supports C++98.
24
25It also provides the function template `boost::to_address` to obtain a raw
26pointer from an object of any pointer-like type.
27
28[endsect]
29
30[section Examples]
31
32The following example allocates storage and constructs an object in that
33storage using an allocator.
34
35```
36template<class Allocator>
37void function(Allocator& a)
38{
39 auto p = a.allocate(1);
40 std::allocator_traits<Allocator>::construct(a, boost::to_address(p));
41}
42```
43
44[endsect]
45
46[section Reference]
47
48```
49namespace boost {
50 template<class T> struct pointer_traits {
51 typedef T pointer;
52 typedef ``['see below]`` element_type;
53 typedef ``['see below]`` difference_type;
54
55 template<class U> struct rebind_to { typedef ``['see below]`` type; };
56 template<class U> using rebind = typename rebind_to<U>::type;
57
58 static pointer pointer_to(``['see below]`` v);
59 };
60
61 template<class T> struct pointer_traits<T*> {
62 typedef T* pointer;
63 typedef T element_type;
64 typedef std::ptrdiff_t difference_type;
65
66 template<class U> struct rebind_to { typedef U* type; };
67 template<class U> using rebind = typename rebind_to<U>::type;
68
69 static pointer pointer_to(``['see below]`` v) noexcept;
70 };
71
72 template<class T>
73 constexpr T* to_address(T* v) noexcept;
74
75 template<class T>
76 auto to_address(const T& v) noexcept;
77}
78```
79
80[section Member types]
81
82[variablelist
83[[`typedef` ['see below] `element_type;`]
84[`T::element_type` if such a type exists; otherwise `U` if `T` is a class
85 template instantiation of the form `Pointer<U, Args>`, where `Args` is zero
86 or more type arguments; otherwise the specialization is ill-formed.]]
87[[`typedef` ['see below] `difference_type;`]
88[`T::difference_type` if such a type exists; otherwise `std::ptrdiff_t`.]]
89[[`template<class U> struct rebind_to { typedef` ['see below] `type; };`]
90[`type` is `T::rebind<U>` if such a type exists; otherwise, `Pointer<V, Args>`
91 if `T` is a class template instantiation of the form `Pointer<T, Args>`,
92 where `Args` is zero or more type arguments; otherwise, the instantiation of
93 `rebind_to` is ill-formed.]]]
94
95[endsect]
96
97[section Member functions]
98
99[variablelist
100[[`static pointer pointer_traits::pointer_to(`['see below] `v);`]
101[[variablelist
102[[Remark]
103[If `element_type` is a void type, the type of `v` is unspecified; otherwise,
104 it is `element_type&`.]]
105[[Returns]
106[A pointer to `v` obtained by calling `T::pointer_to(v)`.]]]]]
107[[`static pointer pointer_traits<T*>::pointer_to(`['see below] `v) noexcept;`]
108[[variablelist
109[[Remark]
110[If `element_type` is a void type, the type of `v` is unspecified; otherwise,
111 it is `element_type&`.]]
112[[Returns] [`addressof(v)`.]]]]]]
113
114[endsect]
115
116[section Optional members]
117
118[variablelist
119[[`static element_type* to_address(pointer v) noexcept;`]
120[[variablelist
121[[Returns]
122[A pointer of type `element_type*` that references the same location as the
123 argument `p`.]]
124[[Note]
125[This function should be the inverse of `pointer_to`. If defined, it
126 customizes the behavior of the non-member function `to_address`.]]]]]]
127
128[endsect]
129
130[section Free functions]
131
132[variablelist
133[[`template<class T> constexpr T* to_address(T* v) noexcept;`]
134[[variablelist [[Returns] [`v`.]]]]]
135[[`template<class T> auto to_address(const T& v) noexcept;`]
136[[variablelist [[Returns] [`pointer_traits<T>::to_address(v)` if that
137 expression is well-formed, otherwise `to_address(v.operator->())`.]]]]]]
138
139[endsect]
140
141[endsect]
142
143[section Acknowledgments]
144
145Glen Fernandes implemented `pointer_traits` and `to_address` with reviews and
146guidance from Peter Dimov.
147
148[endsect]
149
150[endsect]