to_address_test.cpp 2.9 KB

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