1// make_local_shared_const_test.cpp
2//
3// Copyright 2007-2009, 2017, 2018 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 const> pi = boost::make_local_shared<int const>();
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 const> pi = boost::make_local_shared<int const>( args: 5 );
84
85 BOOST_TEST( pi.get() != 0 );
86 BOOST_TEST( pi.local_use_count() == 1 );
87 BOOST_TEST( use_count( pi ) == 1 );
88
89 BOOST_TEST( *pi == 5 );
90 }
91
92 BOOST_TEST( X::instances == 0 );
93
94 {
95 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>();
96 boost::weak_ptr<X const> wp( pi );
97
98 BOOST_TEST( X::instances == 1 );
99 BOOST_TEST( pi.get() != 0 );
100 BOOST_TEST( pi.local_use_count() == 1 );
101 BOOST_TEST( use_count( pi ) == 1 );
102 BOOST_TEST( pi->v == 0 );
103
104 pi.reset();
105
106 BOOST_TEST( X::instances == 0 );
107 }
108
109 {
110 boost::local_shared_ptr<X const> pi = boost::make_local_shared_noinit<X const>();
111 boost::weak_ptr<X const> wp( pi );
112
113 BOOST_TEST( X::instances == 1 );
114 BOOST_TEST( pi.get() != 0 );
115 BOOST_TEST( pi.local_use_count() == 1 );
116 BOOST_TEST( use_count( pi ) == 1 );
117 BOOST_TEST( pi->v == 0 );
118
119 pi.reset();
120
121 BOOST_TEST( X::instances == 0 );
122 }
123
124 {
125 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1 );
126 boost::weak_ptr<X const> wp( pi );
127
128 BOOST_TEST( X::instances == 1 );
129 BOOST_TEST( pi.get() != 0 );
130 BOOST_TEST( pi.local_use_count() == 1 );
131 BOOST_TEST( use_count( pi ) == 1 );
132 BOOST_TEST( pi->v == 1 );
133
134 pi.reset();
135
136 BOOST_TEST( X::instances == 0 );
137 }
138
139 {
140 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1, args: 2 );
141 boost::weak_ptr<X const> wp( pi );
142
143 BOOST_TEST( X::instances == 1 );
144 BOOST_TEST( pi.get() != 0 );
145 BOOST_TEST( pi.local_use_count() == 1 );
146 BOOST_TEST( use_count( pi ) == 1 );
147 BOOST_TEST( pi->v == 1+2 );
148
149 pi.reset();
150
151 BOOST_TEST( X::instances == 0 );
152 }
153
154 {
155 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1, args: 2, args: 3 );
156 boost::weak_ptr<X const> wp( pi );
157
158 BOOST_TEST( X::instances == 1 );
159 BOOST_TEST( pi.get() != 0 );
160 BOOST_TEST( pi.local_use_count() == 1 );
161 BOOST_TEST( use_count( pi ) == 1 );
162 BOOST_TEST( pi->v == 1+2+3 );
163
164 pi.reset();
165
166 BOOST_TEST( X::instances == 0 );
167 }
168
169 {
170 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1, args: 2, args: 3, args: 4 );
171 boost::weak_ptr<X const> wp( pi );
172
173 BOOST_TEST( X::instances == 1 );
174 BOOST_TEST( pi.get() != 0 );
175 BOOST_TEST( pi.local_use_count() == 1 );
176 BOOST_TEST( use_count( pi ) == 1 );
177 BOOST_TEST( pi->v == 1+2+3+4 );
178
179 pi.reset();
180
181 BOOST_TEST( X::instances == 0 );
182 }
183
184 {
185 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5 );
186 boost::weak_ptr<X const> wp( pi );
187
188 BOOST_TEST( X::instances == 1 );
189 BOOST_TEST( pi.get() != 0 );
190 BOOST_TEST( pi.local_use_count() == 1 );
191 BOOST_TEST( use_count( pi ) == 1 );
192 BOOST_TEST( pi->v == 1+2+3+4+5 );
193
194 pi.reset();
195
196 BOOST_TEST( X::instances == 0 );
197 }
198
199 {
200 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6 );
201 boost::weak_ptr<X const> wp( pi );
202
203 BOOST_TEST( X::instances == 1 );
204 BOOST_TEST( pi.get() != 0 );
205 BOOST_TEST( pi.local_use_count() == 1 );
206 BOOST_TEST( use_count( pi ) == 1 );
207 BOOST_TEST( pi->v == 1+2+3+4+5+6 );
208
209 pi.reset();
210
211 BOOST_TEST( X::instances == 0 );
212 }
213
214 {
215 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7 );
216 boost::weak_ptr<X const> wp( pi );
217
218 BOOST_TEST( X::instances == 1 );
219 BOOST_TEST( pi.get() != 0 );
220 BOOST_TEST( pi.local_use_count() == 1 );
221 BOOST_TEST( use_count( pi ) == 1 );
222 BOOST_TEST( pi->v == 1+2+3+4+5+6+7 );
223
224 pi.reset();
225
226 BOOST_TEST( X::instances == 0 );
227 }
228
229 {
230 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8 );
231 boost::weak_ptr<X const> wp( pi );
232
233 BOOST_TEST( X::instances == 1 );
234 BOOST_TEST( pi.get() != 0 );
235 BOOST_TEST( pi.local_use_count() == 1 );
236 BOOST_TEST( use_count( pi ) == 1 );
237 BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8 );
238
239 pi.reset();
240
241 BOOST_TEST( X::instances == 0 );
242 }
243
244 {
245 boost::local_shared_ptr<X const> pi = boost::make_local_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8, args: 9 );
246 boost::weak_ptr<X const> wp( pi );
247
248 BOOST_TEST( X::instances == 1 );
249 BOOST_TEST( pi.get() != 0 );
250 BOOST_TEST( pi.local_use_count() == 1 );
251 BOOST_TEST( use_count( pi ) == 1 );
252 BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8+9 );
253
254 pi.reset();
255
256 BOOST_TEST( X::instances == 0 );
257 }
258
259 return boost::report_errors();
260}
261
262#endif
263

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