]>
Commit | Line | Data |
---|---|---|
b32b8144 | 1 | /* |
11fdf7f2 | 2 | Copyright 2017-2018 Glen Joseph Fernandes |
b32b8144 FG |
3 | (glenjofe@gmail.com) |
4 | ||
5 | Distributed under the Boost Software License, Version 1.0. | |
6 | (http://www.boost.org/LICENSE_1_0.txt) | |
7 | */ | |
8 | #include <boost/core/pointer_traits.hpp> | |
9 | #include <boost/core/lightweight_test.hpp> | |
10 | ||
11 | template<class T> | |
11fdf7f2 | 12 | class P1 { |
b32b8144 | 13 | public: |
11fdf7f2 TL |
14 | explicit P1(T* p) |
15 | : p_(p) { } | |
16 | T* operator->() const BOOST_NOEXCEPT { | |
17 | return p_; | |
b32b8144 FG |
18 | } |
19 | private: | |
11fdf7f2 | 20 | T* p_; |
b32b8144 FG |
21 | }; |
22 | ||
23 | template<class T> | |
11fdf7f2 | 24 | class P2 { |
b32b8144 | 25 | public: |
11fdf7f2 TL |
26 | explicit P2(T* p) |
27 | : p_(p) { } | |
28 | P1<T> operator->() const BOOST_NOEXCEPT { | |
29 | return p_; | |
30 | } | |
31 | private: | |
32 | P1<T> p_; | |
33 | }; | |
34 | ||
35 | #if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION) | |
36 | template<class T> | |
37 | class P3 { | |
38 | public: | |
39 | explicit P3(T* p) | |
40 | : p_(p) { } | |
b32b8144 | 41 | T* get() const BOOST_NOEXCEPT { |
11fdf7f2 | 42 | return p_; |
b32b8144 FG |
43 | } |
44 | private: | |
11fdf7f2 | 45 | T* p_; |
b32b8144 FG |
46 | }; |
47 | ||
48 | namespace boost { | |
b32b8144 | 49 | template<class T> |
11fdf7f2 TL |
50 | struct pointer_traits<P3<T> > { |
51 | static T* to_address(const P3<T>& p) BOOST_NOEXCEPT { | |
52 | return p.get(); | |
b32b8144 FG |
53 | } |
54 | }; | |
b32b8144 FG |
55 | } /* boost */ |
56 | ||
11fdf7f2 TL |
57 | template<class T> |
58 | class P4 { | |
59 | public: | |
60 | explicit P4(T* p) | |
61 | : p_(p) { } | |
62 | T* operator->() const BOOST_NOEXCEPT { | |
63 | return 0; | |
b32b8144 | 64 | } |
11fdf7f2 TL |
65 | T* get() const BOOST_NOEXCEPT { |
66 | return p_; | |
b32b8144 | 67 | } |
11fdf7f2 TL |
68 | private: |
69 | int* p_; | |
70 | }; | |
71 | ||
72 | namespace boost { | |
73 | template<class T> | |
74 | struct pointer_traits<P4<T> > { | |
75 | static T* to_address(const P4<T>& p) BOOST_NOEXCEPT { | |
76 | return p.get(); | |
b32b8144 | 77 | } |
11fdf7f2 TL |
78 | }; |
79 | } /* boost */ | |
80 | ||
81 | #if !defined(BOOST_NO_CXX11_POINTER_TRAITS) | |
82 | template<class T> | |
83 | class P5 { | |
84 | public: | |
85 | explicit P5(T* p) | |
86 | : p_(p) { } | |
87 | T* get() const BOOST_NOEXCEPT { | |
88 | return p_; | |
b32b8144 | 89 | } |
11fdf7f2 TL |
90 | private: |
91 | T* p_; | |
92 | }; | |
93 | ||
94 | namespace std { | |
95 | template<class T> | |
96 | struct pointer_traits<P5<T> > { | |
97 | static T* to_address(const P5<T>& p) BOOST_NOEXCEPT { | |
98 | return p.get(); | |
b32b8144 | 99 | } |
11fdf7f2 TL |
100 | }; |
101 | } /* std */ | |
102 | ||
103 | template<class T> | |
104 | class P6 { | |
105 | public: | |
106 | explicit P6(T* p) | |
107 | : p_(p) { } | |
108 | T* get() const BOOST_NOEXCEPT { | |
109 | return p_; | |
b32b8144 | 110 | } |
11fdf7f2 TL |
111 | private: |
112 | T* p_; | |
113 | }; | |
114 | ||
115 | namespace boost { | |
116 | template<class T> | |
117 | struct pointer_traits<P6<T> > { | |
118 | static T* to_address(const P6<T>& p) BOOST_NOEXCEPT { | |
119 | return p.get(); | |
b32b8144 | 120 | } |
11fdf7f2 TL |
121 | }; |
122 | } /* boost */ | |
123 | ||
124 | namespace std { | |
125 | template<class T> | |
126 | struct pointer_traits<P6<T> > { | |
127 | static T* to_address(const P6<T>& p) BOOST_NOEXCEPT { | |
128 | return 0; | |
b32b8144 | 129 | } |
11fdf7f2 TL |
130 | }; |
131 | } /* std */ | |
132 | #endif | |
133 | #endif | |
134 | ||
135 | int main() | |
136 | { | |
137 | int i = 0; | |
138 | BOOST_TEST(boost::to_address(&i) == &i); | |
139 | int* p = &i; | |
140 | BOOST_TEST(boost::to_address(p) == &i); | |
141 | P1<int> p1(&i); | |
142 | BOOST_TEST(boost::to_address(p1) == &i); | |
143 | P2<int> p2(&i); | |
144 | BOOST_TEST(boost::to_address(p2) == &i); | |
145 | #if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION) | |
146 | P3<int> p3(&i); | |
147 | BOOST_TEST(boost::to_address(p3) == &i); | |
148 | P4<int> p4(&i); | |
149 | BOOST_TEST(boost::to_address(p4) == &i); | |
150 | #if !defined(BOOST_NO_CXX11_POINTER_TRAITS) | |
151 | P5<int> p5(&i); | |
152 | BOOST_TEST(boost::to_address(p5) == &i); | |
153 | P6<int> p6(&i); | |
154 | BOOST_TEST(boost::to_address(p6) == &i); | |
155 | #endif | |
156 | #endif | |
b32b8144 FG |
157 | return boost::report_errors(); |
158 | } |