1// allocate_shared_esft_test.cpp
2//
3// Copyright 2007-2009 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/core/lightweight_test.hpp>
10#include <boost/make_shared.hpp>
11#include <boost/shared_ptr.hpp>
12#include <boost/enable_shared_from_this.hpp>
13#include <memory>
14
15class X: public boost::enable_shared_from_this<X>
16{
17private:
18
19 X( X const & );
20 X & operator=( X const & );
21
22public:
23
24 static int instances;
25
26 explicit X( int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0 )
27 {
28 ++instances;
29 }
30
31 ~X()
32 {
33 --instances;
34 }
35};
36
37int X::instances = 0;
38
39int main()
40{
41 BOOST_TEST( X::instances == 0 );
42
43 {
44 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>() );
45 BOOST_TEST( X::instances == 1 );
46
47 try
48 {
49 boost::shared_ptr< X > qx = px->shared_from_this();
50
51 BOOST_TEST( px == qx );
52 BOOST_TEST( !( px < qx ) && !( qx < px ) );
53
54 px.reset();
55 BOOST_TEST( X::instances == 1 );
56 }
57 catch( boost::bad_weak_ptr const& )
58 {
59 BOOST_ERROR( "px->shared_from_this() failed" );
60 }
61 }
62
63 BOOST_TEST( X::instances == 0 );
64
65 {
66 boost::shared_ptr< X > px = boost::allocate_shared_noinit< X >( a: std::allocator<void>() );
67 BOOST_TEST( X::instances == 1 );
68
69 try
70 {
71 boost::shared_ptr< X > qx = px->shared_from_this();
72
73 BOOST_TEST( px == qx );
74 BOOST_TEST( !( px < qx ) && !( qx < px ) );
75
76 px.reset();
77 BOOST_TEST( X::instances == 1 );
78 }
79 catch( boost::bad_weak_ptr const& )
80 {
81 BOOST_ERROR( "px->shared_from_this() failed" );
82 }
83 }
84
85 BOOST_TEST( X::instances == 0 );
86
87 {
88 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1 );
89 BOOST_TEST( X::instances == 1 );
90
91 try
92 {
93 boost::shared_ptr< X > qx = px->shared_from_this();
94
95 BOOST_TEST( px == qx );
96 BOOST_TEST( !( px < qx ) && !( qx < px ) );
97
98 px.reset();
99 BOOST_TEST( X::instances == 1 );
100 }
101 catch( boost::bad_weak_ptr const& )
102 {
103 BOOST_ERROR( "px->shared_from_this() failed" );
104 }
105 }
106
107 BOOST_TEST( X::instances == 0 );
108
109 {
110 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1, args: 2 );
111 BOOST_TEST( X::instances == 1 );
112
113 try
114 {
115 boost::shared_ptr< X > qx = px->shared_from_this();
116
117 BOOST_TEST( px == qx );
118 BOOST_TEST( !( px < qx ) && !( qx < px ) );
119
120 px.reset();
121 BOOST_TEST( X::instances == 1 );
122 }
123 catch( boost::bad_weak_ptr const& )
124 {
125 BOOST_ERROR( "px->shared_from_this() failed" );
126 }
127 }
128
129 BOOST_TEST( X::instances == 0 );
130
131 {
132 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1, args: 2, args: 3 );
133 BOOST_TEST( X::instances == 1 );
134
135 try
136 {
137 boost::shared_ptr< X > qx = px->shared_from_this();
138
139 BOOST_TEST( px == qx );
140 BOOST_TEST( !( px < qx ) && !( qx < px ) );
141
142 px.reset();
143 BOOST_TEST( X::instances == 1 );
144 }
145 catch( boost::bad_weak_ptr const& )
146 {
147 BOOST_ERROR( "px->shared_from_this() failed" );
148 }
149 }
150
151 BOOST_TEST( X::instances == 0 );
152
153 {
154 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1, args: 2, args: 3, args: 4 );
155 BOOST_TEST( X::instances == 1 );
156
157 try
158 {
159 boost::shared_ptr< X > qx = px->shared_from_this();
160
161 BOOST_TEST( px == qx );
162 BOOST_TEST( !( px < qx ) && !( qx < px ) );
163
164 px.reset();
165 BOOST_TEST( X::instances == 1 );
166 }
167 catch( boost::bad_weak_ptr const& )
168 {
169 BOOST_ERROR( "px->shared_from_this() failed" );
170 }
171 }
172
173 BOOST_TEST( X::instances == 0 );
174
175 {
176 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5 );
177 BOOST_TEST( X::instances == 1 );
178
179 try
180 {
181 boost::shared_ptr< X > qx = px->shared_from_this();
182
183 BOOST_TEST( px == qx );
184 BOOST_TEST( !( px < qx ) && !( qx < px ) );
185
186 px.reset();
187 BOOST_TEST( X::instances == 1 );
188 }
189 catch( boost::bad_weak_ptr const& )
190 {
191 BOOST_ERROR( "px->shared_from_this() failed" );
192 }
193 }
194
195 BOOST_TEST( X::instances == 0 );
196
197 {
198 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5, args: 6 );
199 BOOST_TEST( X::instances == 1 );
200
201 try
202 {
203 boost::shared_ptr< X > qx = px->shared_from_this();
204
205 BOOST_TEST( px == qx );
206 BOOST_TEST( !( px < qx ) && !( qx < px ) );
207
208 px.reset();
209 BOOST_TEST( X::instances == 1 );
210 }
211 catch( boost::bad_weak_ptr const& )
212 {
213 BOOST_ERROR( "px->shared_from_this() failed" );
214 }
215 }
216
217 BOOST_TEST( X::instances == 0 );
218
219 {
220 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7 );
221 BOOST_TEST( X::instances == 1 );
222
223 try
224 {
225 boost::shared_ptr< X > qx = px->shared_from_this();
226
227 BOOST_TEST( px == qx );
228 BOOST_TEST( !( px < qx ) && !( qx < px ) );
229
230 px.reset();
231 BOOST_TEST( X::instances == 1 );
232 }
233 catch( boost::bad_weak_ptr const& )
234 {
235 BOOST_ERROR( "px->shared_from_this() failed" );
236 }
237 }
238
239 BOOST_TEST( X::instances == 0 );
240
241 {
242 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8 );
243 BOOST_TEST( X::instances == 1 );
244
245 try
246 {
247 boost::shared_ptr< X > qx = px->shared_from_this();
248
249 BOOST_TEST( px == qx );
250 BOOST_TEST( !( px < qx ) && !( qx < px ) );
251
252 px.reset();
253 BOOST_TEST( X::instances == 1 );
254 }
255 catch( boost::bad_weak_ptr const& )
256 {
257 BOOST_ERROR( "px->shared_from_this() failed" );
258 }
259 }
260
261 BOOST_TEST( X::instances == 0 );
262
263 {
264 boost::shared_ptr< X > px = boost::allocate_shared< X >( a: std::allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8, args: 9 );
265 BOOST_TEST( X::instances == 1 );
266
267 try
268 {
269 boost::shared_ptr< X > qx = px->shared_from_this();
270
271 BOOST_TEST( px == qx );
272 BOOST_TEST( !( px < qx ) && !( qx < px ) );
273
274 px.reset();
275 BOOST_TEST( X::instances == 1 );
276 }
277 catch( boost::bad_weak_ptr const& )
278 {
279 BOOST_ERROR( "px->shared_from_this() failed" );
280 }
281 }
282
283 BOOST_TEST( X::instances == 0 );
284
285 return boost::report_errors();
286}
287

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