| /* |
| Copyright 2017-2018 Glen Joseph Fernandes |
| (glenjofe@gmail.com) |
| |
| Distributed under the Boost Software License, Version 1.0. |
| (http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| #include <boost/core/pointer_traits.hpp> |
| #include <boost/core/lightweight_test.hpp> |
| |
| template<class T> |
| class P1 { |
| public: |
| explicit P1(T* p) |
| : p_(p) { } |
| T* operator->() const BOOST_NOEXCEPT { |
| return p_; |
| } |
| private: |
| T* p_; |
| }; |
| |
| template<class T> |
| class P2 { |
| public: |
| explicit P2(T* p) |
| : p_(p) { } |
| P1<T> operator->() const BOOST_NOEXCEPT { |
| return p_; |
| } |
| private: |
| P1<T> p_; |
| }; |
| |
| #if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION) |
| template<class T> |
| class P3 { |
| public: |
| explicit P3(T* p) |
| : p_(p) { } |
| T* get() const BOOST_NOEXCEPT { |
| return p_; |
| } |
| private: |
| T* p_; |
| }; |
| |
| namespace boost { |
| template<class T> |
| struct pointer_traits<P3<T> > { |
| static T* to_address(const P3<T>& p) BOOST_NOEXCEPT { |
| return p.get(); |
| } |
| }; |
| } /* boost */ |
| |
| template<class T> |
| class P4 { |
| public: |
| explicit P4(T* p) |
| : p_(p) { } |
| T* operator->() const BOOST_NOEXCEPT { |
| return 0; |
| } |
| T* get() const BOOST_NOEXCEPT { |
| return p_; |
| } |
| private: |
| int* p_; |
| }; |
| |
| namespace boost { |
| template<class T> |
| struct pointer_traits<P4<T> > { |
| static T* to_address(const P4<T>& p) BOOST_NOEXCEPT { |
| return p.get(); |
| } |
| }; |
| } /* boost */ |
| |
| #if !defined(BOOST_NO_CXX11_POINTER_TRAITS) |
| template<class T> |
| class P5 { |
| public: |
| explicit P5(T* p) |
| : p_(p) { } |
| T* get() const BOOST_NOEXCEPT { |
| return p_; |
| } |
| private: |
| T* p_; |
| }; |
| |
| namespace std { |
| template<class T> |
| struct pointer_traits<P5<T> > { |
| static T* to_address(const P5<T>& p) BOOST_NOEXCEPT { |
| return p.get(); |
| } |
| }; |
| } /* std */ |
| |
| template<class T> |
| class P6 { |
| public: |
| explicit P6(T* p) |
| : p_(p) { } |
| T* get() const BOOST_NOEXCEPT { |
| return p_; |
| } |
| private: |
| T* p_; |
| }; |
| |
| namespace boost { |
| template<class T> |
| struct pointer_traits<P6<T> > { |
| static T* to_address(const P6<T>& p) BOOST_NOEXCEPT { |
| return p.get(); |
| } |
| }; |
| } /* boost */ |
| |
| namespace std { |
| template<class T> |
| struct pointer_traits<P6<T> > { |
| static T* to_address(const P6<T>& p) BOOST_NOEXCEPT { |
| return 0; |
| } |
| }; |
| } /* std */ |
| #endif |
| #endif |
| |
| int main() |
| { |
| int i = 0; |
| BOOST_TEST(boost::to_address(&i) == &i); |
| int* p = &i; |
| BOOST_TEST(boost::to_address(p) == &i); |
| P1<int> p1(&i); |
| BOOST_TEST(boost::to_address(p1) == &i); |
| P2<int> p2(&i); |
| BOOST_TEST(boost::to_address(p2) == &i); |
| #if !defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION) |
| P3<int> p3(&i); |
| BOOST_TEST(boost::to_address(p3) == &i); |
| P4<int> p4(&i); |
| BOOST_TEST(boost::to_address(p4) == &i); |
| #if !defined(BOOST_NO_CXX11_POINTER_TRAITS) |
| P5<int> p5(&i); |
| BOOST_TEST(boost::to_address(p5) == &i); |
| P6<int> p6(&i); |
| BOOST_TEST(boost::to_address(p6) == &i); |
| #endif |
| #endif |
| return boost::report_errors(); |
| } |