1/*
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#include <boost/core/pointer_traits.hpp>
9#include <boost/core/lightweight_test.hpp>
10
11template<class T>
12class P1 {
13public:
14 explicit P1(T* p)
15 : p_(p) { }
16
17 T* operator->() const BOOST_NOEXCEPT {
18 return p_;
19 }
20
21private:
22 T* p_;
23};
24
25template<class T>
26class P2 {
27public:
28 explicit P2(T* p)
29 : p_(p) { }
30
31 P1<T> operator->() const BOOST_NOEXCEPT {
32 return p_;
33 }
34
35private:
36 P1<T> p_;
37};
38
39#if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION)
40template<class T>
41class P3 {
42public:
43 explicit P3(T* p)
44 : p_(p) { }
45
46 T* get() const BOOST_NOEXCEPT {
47 return p_;
48 }
49
50private:
51 T* p_;
52};
53
54namespace boost {
55
56template<class T>
57struct pointer_traits<P3<T> > {
58 static T* to_address(const P3<T>& p) BOOST_NOEXCEPT {
59 return p.get();
60 }
61};
62
63} /* boost */
64
65template<class T>
66class P4 {
67public:
68 explicit P4(T* p)
69 : p_(p) { }
70
71 T* operator->() const BOOST_NOEXCEPT {
72 return 0;
73 }
74
75 T* get() const BOOST_NOEXCEPT {
76 return p_;
77 }
78
79private:
80 int* p_;
81};
82
83namespace boost {
84
85template<class T>
86struct pointer_traits<P4<T> > {
87 static T* to_address(const P4<T>& p) BOOST_NOEXCEPT {
88 return p.get();
89 }
90};
91
92} /* boost */
93#endif
94
95int main()
96{
97 int i = 0;
98 BOOST_TEST(boost::to_address(&i) == &i);
99 int* p = &i;
100 BOOST_TEST(boost::to_address(p) == &i);
101 P1<int> p1(&i);
102 BOOST_TEST(boost::to_address(p1) == &i);
103 P2<int> p2(&i);
104 BOOST_TEST(boost::to_address(p2) == &i);
105#if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION)
106 P3<int> p3(&i);
107 BOOST_TEST(boost::to_address(p3) == &i);
108 P4<int> p4(&i);
109 BOOST_TEST(boost::to_address(p4) == &i);
110#endif
111 return boost::report_errors();
112}
113

source code of boost/libs/core/test/to_address_test.cpp