]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/smart_ptr/test/sp_unique_ptr_test.cpp
2 // sp_unique_ptr_test.cpp
4 // Copyright (c) 2012 Peter Dimov
6 // Distributed under the Boost Software License, Version 1.0.
7 // See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt
11 #include <boost/shared_ptr.hpp>
12 #include <boost/enable_shared_from_this.hpp>
13 #include <boost/core/lightweight_test.hpp>
14 #include <boost/type_traits/remove_reference.hpp>
18 #if !defined( BOOST_NO_CXX11_SMART_PTR ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
20 struct X
: public boost::enable_shared_from_this
< X
>
37 X
& operator=( X
const & );
48 Y(): deleted_( false )
55 BOOST_TEST( deleted_
);
62 Y
& operator=( Y
const & );
69 void operator()( Y
* p
) const
78 BOOST_ERROR( "YD::operator()(0) called" );
83 template<class U
, class T
, class D
> static void test_null_unique_ptr( std::unique_ptr
<T
, D
> p1
, std::unique_ptr
<T
, D
> p2
)
85 BOOST_TEST( T::instances
== 0 );
87 boost::shared_ptr
<U
> sp( std::move( p1
) );
89 BOOST_TEST( sp
.get() == 0 );
90 BOOST_TEST( sp
.use_count() == 0 );
92 sp
.reset( new T
, typename
boost::remove_reference
<D
>::type() );
94 BOOST_TEST( sp
.get() != 0 );
95 BOOST_TEST( sp
.use_count() == 1 );
97 BOOST_TEST( T::instances
== 1 );
101 BOOST_TEST( sp
.get() == 0 );
102 BOOST_TEST( sp
.use_count() == 0 );
104 BOOST_TEST( T::instances
== 0 );
110 BOOST_TEST( X::instances
== 0 );
112 std::unique_ptr
<X
> p( new X
);
113 BOOST_TEST( X::instances
== 1 );
115 boost::shared_ptr
<X
> p2( std::move( p
) );
116 BOOST_TEST( X::instances
== 1 );
117 BOOST_TEST( p
.get() == 0 );
119 boost::shared_ptr
<X
> p3
= p2
->shared_from_this();
120 BOOST_TEST( p2
== p3
);
121 BOOST_TEST( !(p2
< p3
) && !(p3
< p2
) );
125 BOOST_TEST( X::instances
== 0 );
127 p2
= std::unique_ptr
<X
>( new X
);
128 BOOST_TEST( X::instances
== 1 );
130 p2
= std::unique_ptr
<X
>( new X
);
131 BOOST_TEST( X::instances
== 1 );
134 BOOST_TEST( X::instances
== 0 );
138 BOOST_TEST( X::instances
== 0 );
140 std::unique_ptr
<X
> p( new X
);
141 BOOST_TEST( X::instances
== 1 );
143 boost::shared_ptr
<X
const> p2( std::move( p
) );
144 BOOST_TEST( X::instances
== 1 );
145 BOOST_TEST( p
.get() == 0 );
147 boost::shared_ptr
<X
const> p3
= p2
->shared_from_this();
148 BOOST_TEST( p2
== p3
);
149 BOOST_TEST( !(p2
< p3
) && !(p3
< p2
) );
153 BOOST_TEST( X::instances
== 0 );
155 p2
= std::unique_ptr
<X
>( new X
);
156 BOOST_TEST( X::instances
== 1 );
158 p2
= std::unique_ptr
<X
>( new X
);
159 BOOST_TEST( X::instances
== 1 );
162 BOOST_TEST( X::instances
== 0 );
166 BOOST_TEST( X::instances
== 0 );
168 std::unique_ptr
<X
> p( new X
);
169 BOOST_TEST( X::instances
== 1 );
171 boost::shared_ptr
<void> p2( std::move( p
) );
172 BOOST_TEST( X::instances
== 1 );
173 BOOST_TEST( p
.get() == 0 );
176 BOOST_TEST( X::instances
== 0 );
178 p2
= std::unique_ptr
<X
>( new X
);
179 BOOST_TEST( X::instances
== 1 );
181 p2
= std::unique_ptr
<X
>( new X
);
182 BOOST_TEST( X::instances
== 1 );
185 BOOST_TEST( X::instances
== 0 );
189 BOOST_TEST( Y::instances
== 0 );
191 std::unique_ptr
<Y
, YD
> p( new Y
, YD() );
192 BOOST_TEST( Y::instances
== 1 );
194 boost::shared_ptr
<Y
> p2( std::move( p
) );
195 BOOST_TEST( Y::instances
== 1 );
196 BOOST_TEST( p
.get() == 0 );
199 BOOST_TEST( Y::instances
== 0 );
201 p2
= std::unique_ptr
<Y
, YD
>( new Y
, YD() );
202 BOOST_TEST( Y::instances
== 1 );
204 p2
= std::unique_ptr
<Y
, YD
>( new Y
, YD() );
205 BOOST_TEST( Y::instances
== 1 );
208 BOOST_TEST( Y::instances
== 0 );
212 BOOST_TEST( Y::instances
== 0 );
216 std::unique_ptr
<Y
, YD
&> p( new Y
, yd
);
217 BOOST_TEST( Y::instances
== 1 );
219 boost::shared_ptr
<Y
> p2( std::move( p
) );
220 BOOST_TEST( Y::instances
== 1 );
221 BOOST_TEST( p
.get() == 0 );
224 BOOST_TEST( Y::instances
== 0 );
226 p2
= std::unique_ptr
<Y
, YD
&>( new Y
, yd
);
227 BOOST_TEST( Y::instances
== 1 );
229 p2
= std::unique_ptr
<Y
, YD
&>( new Y
, yd
);
230 BOOST_TEST( Y::instances
== 1 );
233 BOOST_TEST( Y::instances
== 0 );
237 BOOST_TEST( Y::instances
== 0 );
241 std::unique_ptr
<Y
, YD
const&> p( new Y
, yd
);
242 BOOST_TEST( Y::instances
== 1 );
244 boost::shared_ptr
<Y
> p2( std::move( p
) );
245 BOOST_TEST( Y::instances
== 1 );
246 BOOST_TEST( p
.get() == 0 );
249 BOOST_TEST( Y::instances
== 0 );
251 p2
= std::unique_ptr
<Y
, YD
const&>( new Y
, yd
);
252 BOOST_TEST( Y::instances
== 1 );
254 p2
= std::unique_ptr
<Y
, YD
const&>( new Y
, yd
);
255 BOOST_TEST( Y::instances
== 1 );
258 BOOST_TEST( Y::instances
== 0 );
262 test_null_unique_ptr
<X
>( std::unique_ptr
<X
>(), std::unique_ptr
<X
>() );
263 test_null_unique_ptr
<X
const>( std::unique_ptr
<X
>(), std::unique_ptr
<X
>() );
264 test_null_unique_ptr
<void>( std::unique_ptr
<X
>(), std::unique_ptr
<X
>() );
265 test_null_unique_ptr
<void const>( std::unique_ptr
<X
>(), std::unique_ptr
<X
>() );
269 test_null_unique_ptr
<Y
>( std::unique_ptr
<Y
, YD
>( 0, YD() ), std::unique_ptr
<Y
, YD
>( 0, YD() ) );
270 test_null_unique_ptr
<Y
const>( std::unique_ptr
<Y
, YD
>( 0, YD() ), std::unique_ptr
<Y
, YD
>( 0, YD() ) );
271 test_null_unique_ptr
<void>( std::unique_ptr
<Y
, YD
>( 0, YD() ), std::unique_ptr
<Y
, YD
>( 0, YD() ) );
272 test_null_unique_ptr
<void const>( std::unique_ptr
<Y
, YD
>( 0, YD() ), std::unique_ptr
<Y
, YD
>( 0, YD() ) );
278 test_null_unique_ptr
<Y
>( std::unique_ptr
<Y
, YD
&>( 0, yd
), std::unique_ptr
<Y
, YD
&>( 0, yd
) );
279 test_null_unique_ptr
<Y
const>( std::unique_ptr
<Y
, YD
&>( 0, yd
), std::unique_ptr
<Y
, YD
&>( 0, yd
) );
280 test_null_unique_ptr
<void>( std::unique_ptr
<Y
, YD
&>( 0, yd
), std::unique_ptr
<Y
, YD
&>( 0, yd
) );
281 test_null_unique_ptr
<void const>( std::unique_ptr
<Y
, YD
&>( 0, yd
), std::unique_ptr
<Y
, YD
&>( 0, yd
) );
284 return boost::report_errors();
287 #else // !defined( BOOST_NO_CXX11_SMART_PTR ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )