• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright David Abrahams 2004. Use, modification and distribution is
2 // subject to the Boost Software License, Version 1.0. (See accompanying
3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4 
5 #include <boost/pointee.hpp>
6 #include <boost/type_traits/add_const.hpp>
7 #include "static_assert_same.hpp"
8 #include <memory>
9 #include <list>
10 
11 template <class T, class Ref>
12 struct proxy_ptr
13 {
14     typedef T element_type;
15     struct proxy
16     {
17         operator Ref() const;
18     };
19     proxy operator*() const;
20 };
21 
22 template <class T>
23 struct proxy_ref_ptr : proxy_ptr<T,T&>
24 {
25 };
26 
27 template <class T>
28 struct proxy_value_ptr : proxy_ptr<T,T>
29 {
30     typedef typename boost::add_const<T>::type element_type;
31 };
32 
33 struct X {
34     template <class T> X(T const&);
35     template <class T> operator T&() const;
36 };
37 
38 
main()39 int main()
40 {
41     STATIC_ASSERT_SAME(boost::pointee<proxy_ref_ptr<int> >::type, int);
42     STATIC_ASSERT_SAME(boost::pointee<proxy_ref_ptr<X> >::type, X);
43 
44     STATIC_ASSERT_SAME(boost::pointee<proxy_ref_ptr<int const> >::type, int const);
45     STATIC_ASSERT_SAME(boost::pointee<proxy_ref_ptr<X const> >::type, X const);
46 
47     STATIC_ASSERT_SAME(boost::pointee<proxy_value_ptr<int> >::type, int const);
48     STATIC_ASSERT_SAME(boost::pointee<proxy_value_ptr<X> >::type, X const);
49 
50     STATIC_ASSERT_SAME(boost::pointee<proxy_value_ptr<int const> >::type, int const);
51     STATIC_ASSERT_SAME(boost::pointee<proxy_value_ptr<X const> >::type, X const);
52 
53     STATIC_ASSERT_SAME(boost::pointee<int*>::type, int);
54     STATIC_ASSERT_SAME(boost::pointee<int const*>::type, int const);
55 
56     STATIC_ASSERT_SAME(boost::pointee<X*>::type, X);
57     STATIC_ASSERT_SAME(boost::pointee<X const*>::type, X const);
58 
59 #if defined(BOOST_NO_CXX11_SMART_PTR)
60 
61     STATIC_ASSERT_SAME(boost::pointee<std::auto_ptr<int> >::type, int);
62     STATIC_ASSERT_SAME(boost::pointee<std::auto_ptr<X> >::type, X);
63 
64     STATIC_ASSERT_SAME(boost::pointee<std::auto_ptr<int const> >::type, int const);
65     STATIC_ASSERT_SAME(boost::pointee<std::auto_ptr<X const> >::type, X const);
66 
67 #else
68 
69     STATIC_ASSERT_SAME(boost::pointee<std::unique_ptr<int> >::type, int);
70     STATIC_ASSERT_SAME(boost::pointee<std::unique_ptr<X> >::type, X);
71 
72     STATIC_ASSERT_SAME(boost::pointee<std::unique_ptr<int const> >::type, int const);
73     STATIC_ASSERT_SAME(boost::pointee<std::unique_ptr<X const> >::type, X const);
74 
75 #endif
76 
77     STATIC_ASSERT_SAME(boost::pointee<std::list<int>::iterator >::type, int);
78     STATIC_ASSERT_SAME(boost::pointee<std::list<X>::iterator >::type, X);
79 
80     STATIC_ASSERT_SAME(boost::pointee<std::list<int>::const_iterator >::type, int const);
81     STATIC_ASSERT_SAME(boost::pointee<std::list<X>::const_iterator >::type, X const);
82     return 0;
83 }
84