1 // allocate_local_shared_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/smart_ptr/local_shared_ptr.hpp>
22 #include <boost/weak_ptr.hpp>
30 X
& operator=( X
const & );
32 void * operator new( std::size_t n
)
34 // lack of this definition causes link errors on Comeau C++
35 BOOST_ERROR( "private X::new called" );
36 return ::operator new( n
);
39 void operator delete( void * p
)
41 // lack of this definition causes link errors on MSVC
42 BOOST_ERROR( "private X::delete called" );
43 ::operator delete( p
);
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
)
68 boost::local_shared_ptr
< int > pi
= boost::allocate_local_shared
< int >( std::allocator
<int>() );
70 BOOST_TEST( pi
.get() != 0 );
71 BOOST_TEST( *pi
== 0 );
75 boost::local_shared_ptr
< int > pi
= boost::allocate_local_shared_noinit
< int >( std::allocator
<int>() );
77 BOOST_TEST( pi
.get() != 0 );
81 boost::local_shared_ptr
< int > pi
= boost::allocate_local_shared
< int >( std::allocator
<int>(), 5 );
83 BOOST_TEST( pi
.get() != 0 );
84 BOOST_TEST( *pi
== 5 );
87 BOOST_TEST( X::instances
== 0 );
90 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>() );
91 boost::weak_ptr
<X
> wp( pi
);
93 BOOST_TEST( X::instances
== 1 );
94 BOOST_TEST( pi
.get() != 0 );
95 BOOST_TEST( pi
->v
== 0 );
99 BOOST_TEST( X::instances
== 0 );
103 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared_noinit
< X
>( std::allocator
<void>() );
104 boost::weak_ptr
<X
> wp( pi
);
106 BOOST_TEST( X::instances
== 1 );
107 BOOST_TEST( pi
.get() != 0 );
108 BOOST_TEST( pi
->v
== 0 );
112 BOOST_TEST( X::instances
== 0 );
116 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1 );
117 boost::weak_ptr
<X
> wp( pi
);
119 BOOST_TEST( X::instances
== 1 );
120 BOOST_TEST( pi
.get() != 0 );
121 BOOST_TEST( pi
->v
== 1 );
125 BOOST_TEST( X::instances
== 0 );
129 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2 );
130 boost::weak_ptr
<X
> wp( pi
);
132 BOOST_TEST( X::instances
== 1 );
133 BOOST_TEST( pi
.get() != 0 );
134 BOOST_TEST( pi
->v
== 1+2 );
138 BOOST_TEST( X::instances
== 0 );
142 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3 );
143 boost::weak_ptr
<X
> wp( pi
);
145 BOOST_TEST( X::instances
== 1 );
146 BOOST_TEST( pi
.get() != 0 );
147 BOOST_TEST( pi
->v
== 1+2+3 );
151 BOOST_TEST( X::instances
== 0 );
155 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4 );
156 boost::weak_ptr
<X
> wp( pi
);
158 BOOST_TEST( X::instances
== 1 );
159 BOOST_TEST( pi
.get() != 0 );
160 BOOST_TEST( pi
->v
== 1+2+3+4 );
164 BOOST_TEST( X::instances
== 0 );
168 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5 );
169 boost::weak_ptr
<X
> wp( pi
);
171 BOOST_TEST( X::instances
== 1 );
172 BOOST_TEST( pi
.get() != 0 );
173 BOOST_TEST( pi
->v
== 1+2+3+4+5 );
177 BOOST_TEST( X::instances
== 0 );
181 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5, 6 );
182 boost::weak_ptr
<X
> wp( pi
);
184 BOOST_TEST( X::instances
== 1 );
185 BOOST_TEST( pi
.get() != 0 );
186 BOOST_TEST( pi
->v
== 1+2+3+4+5+6 );
190 BOOST_TEST( X::instances
== 0 );
194 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5, 6, 7 );
195 boost::weak_ptr
<X
> wp( pi
);
197 BOOST_TEST( X::instances
== 1 );
198 BOOST_TEST( pi
.get() != 0 );
199 BOOST_TEST( pi
->v
== 1+2+3+4+5+6+7 );
203 BOOST_TEST( X::instances
== 0 );
207 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5, 6, 7, 8 );
208 boost::weak_ptr
<X
> wp( pi
);
210 BOOST_TEST( X::instances
== 1 );
211 BOOST_TEST( pi
.get() != 0 );
212 BOOST_TEST( pi
->v
== 1+2+3+4+5+6+7+8 );
216 BOOST_TEST( X::instances
== 0 );
220 boost::local_shared_ptr
< X
> pi
= boost::allocate_local_shared
< X
>( std::allocator
<void>(), 1, 2, 3, 4, 5, 6, 7, 8, 9 );
221 boost::weak_ptr
<X
> wp( pi
);
223 BOOST_TEST( X::instances
== 1 );
224 BOOST_TEST( pi
.get() != 0 );
225 BOOST_TEST( pi
->v
== 1+2+3+4+5+6+7+8+9 );
229 BOOST_TEST( X::instances
== 0 );
232 return boost::report_errors();