1 // make_local_shared_test.cpp
2 //
3 // Copyright 2007-2009, 2017 Peter Dimov
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
8 
9 #include <boost/config.hpp>
10 
11 #if defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) || defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES )
12 
main()13 int main()
14 {
15 }
16 
17 #else
18 
19 #include <boost/core/lightweight_test.hpp>
20 #include <boost/smart_ptr/make_local_shared.hpp>
21 #include <boost/smart_ptr/local_shared_ptr.hpp>
22 #include <boost/weak_ptr.hpp>
23 #include <cstddef>
24 
25 class X
26 {
27 private:
28 
29     X( X const & );
30     X & operator=( X const & );
31 
operator new(std::size_t n)32     void * operator new( std::size_t n )
33     {
34         // lack of this definition causes link errors on Comeau C++
35         BOOST_ERROR( "private X::new called" );
36         return ::operator new( n );
37     }
38 
operator delete(void * p)39     void operator delete( void * p )
40     {
41         // lack of this definition causes link errors on MSVC
42         BOOST_ERROR( "private X::delete called" );
43         ::operator delete( p );
44     }
45 
46 public:
47 
48     static int instances;
49 
50     int v;
51 
X(int a1=0,int a2=0,int a3=0,int a4=0,int a5=0,int a6=0,int a7=0,int a8=0,int a9=0)52     explicit X( int a1 = 0, int a2 = 0, int a3 = 0, int a4 = 0, int a5 = 0, int a6 = 0, int a7 = 0, int a8 = 0, int a9 = 0 ): v( a1+a2+a3+a4+a5+a6+a7+a8+a9 )
53     {
54         ++instances;
55     }
56 
~X()57     ~X()
58     {
59         --instances;
60     }
61 };
62 
63 int X::instances = 0;
64 
use_count(boost::local_shared_ptr<T> const & p)65 template<class T> static long use_count( boost::local_shared_ptr<T> const & p )
66 {
67     return boost::shared_ptr<T>( p ).use_count() - 1;
68 }
69 
main()70 int main()
71 {
72     {
73         boost::local_shared_ptr< int > pi = boost::make_local_shared< int >();
74 
75         BOOST_TEST( pi.get() != 0 );
76         BOOST_TEST( pi.local_use_count() == 1 );
77         BOOST_TEST( use_count( pi ) == 1 );
78 
79         BOOST_TEST( *pi == 0 );
80     }
81 
82     {
83         boost::local_shared_ptr< int > pi = boost::make_local_shared_noinit< int >();
84 
85         BOOST_TEST( pi.get() != 0 );
86     }
87 
88     {
89         boost::local_shared_ptr< int > pi = boost::make_local_shared< int >( 5 );
90 
91         BOOST_TEST( pi.get() != 0 );
92         BOOST_TEST( pi.local_use_count() == 1 );
93         BOOST_TEST( use_count( pi ) == 1 );
94 
95         BOOST_TEST( *pi == 5 );
96     }
97 
98     BOOST_TEST( X::instances == 0 );
99 
100     {
101         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >();
102         boost::weak_ptr<X> wp( pi );
103 
104         BOOST_TEST( X::instances == 1 );
105         BOOST_TEST( pi.get() != 0 );
106         BOOST_TEST( pi.local_use_count() == 1 );
107         BOOST_TEST( use_count( pi ) == 1 );
108         BOOST_TEST( pi->v == 0 );
109 
110         pi.reset();
111 
112         BOOST_TEST( X::instances == 0 );
113     }
114 
115     {
116         boost::local_shared_ptr< X > pi = boost::make_local_shared_noinit< X >();
117         boost::weak_ptr<X> wp( pi );
118 
119         BOOST_TEST( X::instances == 1 );
120         BOOST_TEST( pi.get() != 0 );
121         BOOST_TEST( pi.local_use_count() == 1 );
122         BOOST_TEST( use_count( pi ) == 1 );
123         BOOST_TEST( pi->v == 0 );
124 
125         pi.reset();
126 
127         BOOST_TEST( X::instances == 0 );
128     }
129 
130     {
131         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1 );
132         boost::weak_ptr<X> wp( pi );
133 
134         BOOST_TEST( X::instances == 1 );
135         BOOST_TEST( pi.get() != 0 );
136         BOOST_TEST( pi.local_use_count() == 1 );
137         BOOST_TEST( use_count( pi ) == 1 );
138         BOOST_TEST( pi->v == 1 );
139 
140         pi.reset();
141 
142         BOOST_TEST( X::instances == 0 );
143     }
144 
145     {
146         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1, 2 );
147         boost::weak_ptr<X> wp( pi );
148 
149         BOOST_TEST( X::instances == 1 );
150         BOOST_TEST( pi.get() != 0 );
151         BOOST_TEST( pi.local_use_count() == 1 );
152         BOOST_TEST( use_count( pi ) == 1 );
153         BOOST_TEST( pi->v == 1+2 );
154 
155         pi.reset();
156 
157         BOOST_TEST( X::instances == 0 );
158     }
159 
160     {
161         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1, 2, 3 );
162         boost::weak_ptr<X> wp( pi );
163 
164         BOOST_TEST( X::instances == 1 );
165         BOOST_TEST( pi.get() != 0 );
166         BOOST_TEST( pi.local_use_count() == 1 );
167         BOOST_TEST( use_count( pi ) == 1 );
168         BOOST_TEST( pi->v == 1+2+3 );
169 
170         pi.reset();
171 
172         BOOST_TEST( X::instances == 0 );
173     }
174 
175     {
176         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1, 2, 3, 4 );
177         boost::weak_ptr<X> wp( pi );
178 
179         BOOST_TEST( X::instances == 1 );
180         BOOST_TEST( pi.get() != 0 );
181         BOOST_TEST( pi.local_use_count() == 1 );
182         BOOST_TEST( use_count( pi ) == 1 );
183         BOOST_TEST( pi->v == 1+2+3+4 );
184 
185         pi.reset();
186 
187         BOOST_TEST( X::instances == 0 );
188     }
189 
190     {
191         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1, 2, 3, 4, 5 );
192         boost::weak_ptr<X> wp( pi );
193 
194         BOOST_TEST( X::instances == 1 );
195         BOOST_TEST( pi.get() != 0 );
196         BOOST_TEST( pi.local_use_count() == 1 );
197         BOOST_TEST( use_count( pi ) == 1 );
198         BOOST_TEST( pi->v == 1+2+3+4+5 );
199 
200         pi.reset();
201 
202         BOOST_TEST( X::instances == 0 );
203     }
204 
205     {
206         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1, 2, 3, 4, 5, 6 );
207         boost::weak_ptr<X> wp( pi );
208 
209         BOOST_TEST( X::instances == 1 );
210         BOOST_TEST( pi.get() != 0 );
211         BOOST_TEST( pi.local_use_count() == 1 );
212         BOOST_TEST( use_count( pi ) == 1 );
213         BOOST_TEST( pi->v == 1+2+3+4+5+6 );
214 
215         pi.reset();
216 
217         BOOST_TEST( X::instances == 0 );
218     }
219 
220     {
221         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1, 2, 3, 4, 5, 6, 7 );
222         boost::weak_ptr<X> wp( pi );
223 
224         BOOST_TEST( X::instances == 1 );
225         BOOST_TEST( pi.get() != 0 );
226         BOOST_TEST( pi.local_use_count() == 1 );
227         BOOST_TEST( use_count( pi ) == 1 );
228         BOOST_TEST( pi->v == 1+2+3+4+5+6+7 );
229 
230         pi.reset();
231 
232         BOOST_TEST( X::instances == 0 );
233     }
234 
235     {
236         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1, 2, 3, 4, 5, 6, 7, 8 );
237         boost::weak_ptr<X> wp( pi );
238 
239         BOOST_TEST( X::instances == 1 );
240         BOOST_TEST( pi.get() != 0 );
241         BOOST_TEST( pi.local_use_count() == 1 );
242         BOOST_TEST( use_count( pi ) == 1 );
243         BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8 );
244 
245         pi.reset();
246 
247         BOOST_TEST( X::instances == 0 );
248     }
249 
250     {
251         boost::local_shared_ptr< X > pi = boost::make_local_shared< X >( 1, 2, 3, 4, 5, 6, 7, 8, 9 );
252         boost::weak_ptr<X> wp( pi );
253 
254         BOOST_TEST( X::instances == 1 );
255         BOOST_TEST( pi.get() != 0 );
256         BOOST_TEST( pi.local_use_count() == 1 );
257         BOOST_TEST( use_count( pi ) == 1 );
258         BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8+9 );
259 
260         pi.reset();
261 
262         BOOST_TEST( X::instances == 0 );
263     }
264 
265     return boost::report_errors();
266 }
267 
268 #endif
269