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
13int 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
25class X
26{
27private:
28
29 X( X const & );
30 X & operator=( X const & );
31
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
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
46public:
47
48 static int instances;
49
50 int v;
51
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
57 ~X()
58 {
59 --instances;
60 }
61};
62
63int X::instances = 0;
64
65template<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
70int 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 >( args: 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 >( args: 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 >( args: 1, args: 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 >( args: 1, args: 2, args: 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 >( args: 1, args: 2, args: 3, args: 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 >( args: 1, args: 2, args: 3, args: 4, args: 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 >( args: 1, args: 2, args: 3, args: 4, args: 5, args: 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 >( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 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 >( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 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 >( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8, args: 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

source code of boost/libs/smart_ptr/test/make_local_shared_test.cpp