]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/core/test/to_address_test.cpp
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / boost / libs / core / test / to_address_test.cpp
CommitLineData
b32b8144 1/*
11fdf7f2 2Copyright 2017-2018 Glen Joseph Fernandes
b32b8144
FG
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>
11fdf7f2 12class P1 {
b32b8144 13public:
11fdf7f2
TL
14 explicit P1(T* p)
15 : p_(p) { }
16 T* operator->() const BOOST_NOEXCEPT {
17 return p_;
b32b8144
FG
18 }
19private:
11fdf7f2 20 T* p_;
b32b8144
FG
21};
22
23template<class T>
11fdf7f2 24class P2 {
b32b8144 25public:
11fdf7f2
TL
26 explicit P2(T* p)
27 : p_(p) { }
28 P1<T> operator->() const BOOST_NOEXCEPT {
29 return p_;
30 }
31private:
32 P1<T> p_;
33};
34
35#if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION)
36template<class T>
37class P3 {
38public:
39 explicit P3(T* p)
40 : p_(p) { }
b32b8144 41 T* get() const BOOST_NOEXCEPT {
11fdf7f2 42 return p_;
b32b8144
FG
43 }
44private:
11fdf7f2 45 T* p_;
b32b8144
FG
46};
47
48namespace boost {
b32b8144 49template<class T>
11fdf7f2
TL
50struct 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
57template<class T>
58class P4 {
59public:
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
68private:
69 int* p_;
70};
71
72namespace boost {
73template<class T>
74struct 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)
82template<class T>
83class P5 {
84public:
85 explicit P5(T* p)
86 : p_(p) { }
87 T* get() const BOOST_NOEXCEPT {
88 return p_;
b32b8144 89 }
11fdf7f2
TL
90private:
91 T* p_;
92};
93
94namespace std {
95template<class T>
96struct 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
103template<class T>
104class P6 {
105public:
106 explicit P6(T* p)
107 : p_(p) { }
108 T* get() const BOOST_NOEXCEPT {
109 return p_;
b32b8144 110 }
11fdf7f2
TL
111private:
112 T* p_;
113};
114
115namespace boost {
116template<class T>
117struct 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
124namespace std {
125template<class T>
126struct 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
135int 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}