1 //
2 //  sp_nullptr_test.cpp
3 //
4 //  Copyright 2012 Peter Dimov
5 //
6 // Distributed under the Boost Software License, Version 1.0. (See
7 // accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //
10 
11 #include <boost/shared_ptr.hpp>
12 #include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
13 #include <boost/detail/lightweight_test.hpp>
14 #include <cstddef>
15 #include <memory>
16 
17 #if !defined( BOOST_NO_CXX11_NULLPTR )
18 
19 struct X
20 {
21     static int instances;
22 
XX23     X()
24     {
25         ++instances;
26     }
27 
~XX28     ~X()
29     {
30         --instances;
31     }
32 
33 private:
34 
35     X( X const & );
36     X & operator=( X const & );
37 };
38 
39 int X::instances = 0;
40 
f(boost::detail::sp_nullptr_t)41 void f( boost::detail::sp_nullptr_t )
42 {
43 }
44 
main()45 int main()
46 {
47     {
48         boost::shared_ptr<void> p( nullptr );
49 
50         BOOST_TEST( p.get() == 0 );
51         BOOST_TEST( p.use_count() == 0 );
52 
53         BOOST_TEST( p == nullptr );
54         BOOST_TEST( nullptr == p );
55         BOOST_TEST( !( p != nullptr ) );
56         BOOST_TEST( !( nullptr != p ) );
57     }
58 
59     {
60         boost::shared_ptr<int> p( nullptr, f );
61 
62         BOOST_TEST( p.get() == 0 );
63         BOOST_TEST( p.use_count() == 1 );
64 
65         BOOST_TEST( p == nullptr );
66         BOOST_TEST( nullptr == p );
67         BOOST_TEST( !( p != nullptr ) );
68         BOOST_TEST( !( nullptr != p ) );
69     }
70 
71     {
72         boost::shared_ptr<int> p( nullptr, f, std::allocator<int>() );
73 
74         BOOST_TEST( p.get() == 0 );
75         BOOST_TEST( p.use_count() == 1 );
76 
77         BOOST_TEST( p == nullptr );
78         BOOST_TEST( nullptr == p );
79         BOOST_TEST( !( p != nullptr ) );
80         BOOST_TEST( !( nullptr != p ) );
81     }
82 
83     {
84         boost::shared_ptr<int> p( new int );
85 
86         BOOST_TEST( p.get() != 0 );
87         BOOST_TEST( p.use_count() == 1 );
88 
89         BOOST_TEST( p != nullptr );
90         BOOST_TEST( nullptr != p );
91         BOOST_TEST( !( p == nullptr ) );
92         BOOST_TEST( !( nullptr == p ) );
93 
94         p = nullptr;
95 
96         BOOST_TEST( p.get() == 0 );
97         BOOST_TEST( p.use_count() == 0 );
98 
99         BOOST_TEST( p == nullptr );
100         BOOST_TEST( nullptr == p );
101         BOOST_TEST( !( p != nullptr ) );
102         BOOST_TEST( !( nullptr != p ) );
103     }
104 
105     {
106         BOOST_TEST( X::instances == 0 );
107 
108         boost::shared_ptr<X> p( new X );
109         BOOST_TEST( X::instances == 1 );
110 
111         BOOST_TEST( p.get() != 0 );
112         BOOST_TEST( p.use_count() == 1 );
113 
114         BOOST_TEST( p != nullptr );
115         BOOST_TEST( nullptr != p );
116         BOOST_TEST( !( p == nullptr ) );
117         BOOST_TEST( !( nullptr == p ) );
118 
119         p = nullptr;
120         BOOST_TEST( X::instances == 0 );
121 
122         BOOST_TEST( p.get() == 0 );
123         BOOST_TEST( p.use_count() == 0 );
124 
125         BOOST_TEST( p == nullptr );
126         BOOST_TEST( nullptr == p );
127         BOOST_TEST( !( p != nullptr ) );
128         BOOST_TEST( !( nullptr != p ) );
129     }
130 
131     return boost::report_errors();
132 }
133 
134 #else
135 
main()136 int main()
137 {
138     return 0;
139 }
140 
141 #endif
142