1 // allocate_local_shared_esft_test.cpp
3 // Copyright 2007-2009, 2017 Peter Dimov
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
9 #include <boost/config.hpp>
11 #if defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) || defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES )
19 #include <boost/core/lightweight_test.hpp>
20 #include <boost/smart_ptr/make_local_shared.hpp>
21 #include <boost/shared_ptr.hpp>
22 #include <boost/enable_shared_from_this.hpp>
25 class X
: public boost::enable_shared_from_this
<X
>
30 X
& operator=( X
const & );
36 explicit X( int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0 )
51 BOOST_TEST_EQ( X::instances
, 0 );
54 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>() );
55 BOOST_TEST_EQ( X::instances
, 1 );
59 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
61 BOOST_TEST_EQ( px
, qx
);
62 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
65 BOOST_TEST_EQ( X::instances
, 1 );
67 catch( boost::bad_weak_ptr
const& )
69 BOOST_ERROR( "px->shared_from_this() failed" );
73 BOOST_TEST_EQ( X::instances
, 0 );
76 boost::shared_ptr
< X
> px
= boost::allocate_local_shared_noinit
< X
>( std::allocator
<void>() );
77 BOOST_TEST_EQ( X::instances
, 1 );
81 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
83 BOOST_TEST_EQ( px
, qx
);
84 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
87 BOOST_TEST_EQ( X::instances
, 1 );
89 catch( boost::bad_weak_ptr
const& )
91 BOOST_ERROR( "px->shared_from_this() failed" );
95 BOOST_TEST_EQ( X::instances
, 0 );
98 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1 );
99 BOOST_TEST_EQ( X::instances
, 1 );
103 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
105 BOOST_TEST_EQ( px
, qx
);
106 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
109 BOOST_TEST_EQ( X::instances
, 1 );
111 catch( boost::bad_weak_ptr
const& )
113 BOOST_ERROR( "px->shared_from_this() failed" );
117 BOOST_TEST_EQ( X::instances
, 0 );
120 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2 );
121 BOOST_TEST_EQ( X::instances
, 1 );
125 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
127 BOOST_TEST_EQ( px
, qx
);
128 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
131 BOOST_TEST_EQ( X::instances
, 1 );
133 catch( boost::bad_weak_ptr
const& )
135 BOOST_ERROR( "px->shared_from_this() failed" );
139 BOOST_TEST_EQ( X::instances
, 0 );
142 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3 );
143 BOOST_TEST_EQ( X::instances
, 1 );
147 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
149 BOOST_TEST_EQ( px
, qx
);
150 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
153 BOOST_TEST_EQ( X::instances
, 1 );
155 catch( boost::bad_weak_ptr
const& )
157 BOOST_ERROR( "px->shared_from_this() failed" );
161 BOOST_TEST_EQ( X::instances
, 0 );
164 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4 );
165 BOOST_TEST_EQ( X::instances
, 1 );
169 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
171 BOOST_TEST_EQ( px
, qx
);
172 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
175 BOOST_TEST_EQ( X::instances
, 1 );
177 catch( boost::bad_weak_ptr
const& )
179 BOOST_ERROR( "px->shared_from_this() failed" );
183 BOOST_TEST_EQ( X::instances
, 0 );
186 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5 );
187 BOOST_TEST_EQ( X::instances
, 1 );
191 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
193 BOOST_TEST_EQ( px
, qx
);
194 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
197 BOOST_TEST_EQ( X::instances
, 1 );
199 catch( boost::bad_weak_ptr
const& )
201 BOOST_ERROR( "px->shared_from_this() failed" );
205 BOOST_TEST_EQ( X::instances
, 0 );
208 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5, 6 );
209 BOOST_TEST_EQ( X::instances
, 1 );
213 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
215 BOOST_TEST_EQ( px
, qx
);
216 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
219 BOOST_TEST_EQ( X::instances
, 1 );
221 catch( boost::bad_weak_ptr
const& )
223 BOOST_ERROR( "px->shared_from_this() failed" );
227 BOOST_TEST_EQ( X::instances
, 0 );
230 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5, 6, 7 );
231 BOOST_TEST_EQ( X::instances
, 1 );
235 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
237 BOOST_TEST_EQ( px
, qx
);
238 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
241 BOOST_TEST_EQ( X::instances
, 1 );
243 catch( boost::bad_weak_ptr
const& )
245 BOOST_ERROR( "px->shared_from_this() failed" );
249 BOOST_TEST_EQ( X::instances
, 0 );
252 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5, 6, 7, 8 );
253 BOOST_TEST_EQ( X::instances
, 1 );
257 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
259 BOOST_TEST_EQ( px
, qx
);
260 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
263 BOOST_TEST_EQ( X::instances
, 1 );
265 catch( boost::bad_weak_ptr
const& )
267 BOOST_ERROR( "px->shared_from_this() failed" );
271 BOOST_TEST_EQ( X::instances
, 0 );
274 boost::shared_ptr
< X
> px
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5, 6, 7, 8, 9 );
275 BOOST_TEST_EQ( X::instances
, 1 );
279 boost::shared_ptr
< X
> qx
= px
->shared_from_this();
281 BOOST_TEST_EQ( px
, qx
);
282 BOOST_TEST( !( px
< qx
) && !( qx
< px
) );
285 BOOST_TEST_EQ( X::instances
, 1 );
287 catch( boost::bad_weak_ptr
const& )
289 BOOST_ERROR( "px->shared_from_this() failed" );
293 BOOST_TEST_EQ( X::instances
, 0 );
295 return boost::report_errors();