]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/smart_ptr/test/sp_bml_unique_ptr_test.cpp
2 // sp_bml_unique_ptr_test.cpp
4 // Copyright (c) 2012, 2015 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/detail/lightweight_test.hpp>
14 #include <boost/move/unique_ptr.hpp>
15 #include <boost/type_traits/remove_reference.hpp>
19 struct X
: public boost::enable_shared_from_this
< X
>
36 X
& operator=( X
const & );
47 Y(): deleted_( false )
54 BOOST_TEST( deleted_
);
61 Y
& operator=( Y
const & );
68 void operator()( Y
* p
) const
77 BOOST_ERROR( "YD::operator()(0) called" );
82 template<class U
, class T
, class D
> static void test_null_unique_ptr( boost::movelib::unique_ptr
<T
, D
> p1
, boost::movelib::unique_ptr
<T
, D
> p2
)
84 BOOST_TEST( T::instances
== 0 );
86 boost::shared_ptr
<U
> sp( boost::move( p1
) );
88 BOOST_TEST( sp
.get() == 0 );
89 BOOST_TEST( sp
.use_count() == 0 );
91 sp
.reset( new T
, typename
boost::remove_reference
<D
>::type() );
93 BOOST_TEST( sp
.get() != 0 );
94 BOOST_TEST( sp
.use_count() == 1 );
96 BOOST_TEST( T::instances
== 1 );
98 sp
= boost::move( p2
);
100 BOOST_TEST( sp
.get() == 0 );
101 BOOST_TEST( sp
.use_count() == 0 );
103 BOOST_TEST( T::instances
== 0 );
109 BOOST_TEST( X::instances
== 0 );
111 boost::movelib::unique_ptr
<X
> p( new X
);
112 BOOST_TEST( X::instances
== 1 );
114 boost::shared_ptr
<X
> p2( boost::move( p
) );
115 BOOST_TEST( X::instances
== 1 );
116 BOOST_TEST( p
.get() == 0 );
118 boost::shared_ptr
<X
> p3
= p2
->shared_from_this();
119 BOOST_TEST( p2
== p3
);
120 BOOST_TEST( !(p2
< p3
) && !(p3
< p2
) );
124 BOOST_TEST( X::instances
== 0 );
126 p2
= boost::movelib::unique_ptr
<X
>( new X
);
127 BOOST_TEST( X::instances
== 1 );
129 p2
= boost::movelib::unique_ptr
<X
>( new X
);
130 BOOST_TEST( X::instances
== 1 );
132 p3
= p2
->shared_from_this();
133 BOOST_TEST( p2
== p3
);
134 BOOST_TEST( !(p2
< p3
) && !(p3
< p2
) );
138 BOOST_TEST( X::instances
== 0 );
142 BOOST_TEST( X::instances
== 0 );
144 boost::movelib::unique_ptr
<X
> p( new X
);
145 BOOST_TEST( X::instances
== 1 );
147 boost::shared_ptr
<X
const> p2( boost::move( p
) );
148 BOOST_TEST( X::instances
== 1 );
149 BOOST_TEST( p
.get() == 0 );
151 boost::shared_ptr
<X
const> p3
= p2
->shared_from_this();
152 BOOST_TEST( p2
== p3
);
153 BOOST_TEST( !(p2
< p3
) && !(p3
< p2
) );
157 BOOST_TEST( X::instances
== 0 );
159 p2
= boost::movelib::unique_ptr
<X
>( new X
);
160 BOOST_TEST( X::instances
== 1 );
162 p2
= boost::movelib::unique_ptr
<X
>( new X
);
163 BOOST_TEST( X::instances
== 1 );
165 p3
= p2
->shared_from_this();
166 BOOST_TEST( p2
== p3
);
167 BOOST_TEST( !(p2
< p3
) && !(p3
< p2
) );
171 BOOST_TEST( X::instances
== 0 );
175 BOOST_TEST( X::instances
== 0 );
177 boost::movelib::unique_ptr
<X
> p( new X
);
178 BOOST_TEST( X::instances
== 1 );
180 boost::shared_ptr
<void> p2( boost::move( p
) );
181 BOOST_TEST( X::instances
== 1 );
182 BOOST_TEST( p
.get() == 0 );
185 BOOST_TEST( X::instances
== 0 );
187 p2
= boost::movelib::unique_ptr
<X
>( new X
);
188 BOOST_TEST( X::instances
== 1 );
190 p2
= boost::movelib::unique_ptr
<X
>( new X
);
191 BOOST_TEST( X::instances
== 1 );
194 BOOST_TEST( X::instances
== 0 );
198 BOOST_TEST( Y::instances
== 0 );
200 boost::movelib::unique_ptr
<Y
, YD
> p( new Y
, YD() );
201 BOOST_TEST( Y::instances
== 1 );
203 boost::shared_ptr
<Y
> p2( boost::move( p
) );
204 BOOST_TEST( Y::instances
== 1 );
205 BOOST_TEST( p
.get() == 0 );
208 BOOST_TEST( Y::instances
== 0 );
210 p2
= boost::movelib::unique_ptr
<Y
, YD
>( new Y
, YD() );
211 BOOST_TEST( Y::instances
== 1 );
213 p2
= boost::movelib::unique_ptr
<Y
, YD
>( new Y
, YD() );
214 BOOST_TEST( Y::instances
== 1 );
217 BOOST_TEST( Y::instances
== 0 );
221 BOOST_TEST( Y::instances
== 0 );
225 boost::movelib::unique_ptr
<Y
, YD
&> p( new Y
, yd
);
226 BOOST_TEST( Y::instances
== 1 );
228 boost::shared_ptr
<Y
> p2( boost::move( p
) );
229 BOOST_TEST( Y::instances
== 1 );
230 BOOST_TEST( p
.get() == 0 );
233 BOOST_TEST( Y::instances
== 0 );
235 p2
= boost::movelib::unique_ptr
<Y
, YD
&>( new Y
, yd
);
236 BOOST_TEST( Y::instances
== 1 );
238 p2
= boost::movelib::unique_ptr
<Y
, YD
&>( new Y
, yd
);
239 BOOST_TEST( Y::instances
== 1 );
242 BOOST_TEST( Y::instances
== 0 );
246 BOOST_TEST( Y::instances
== 0 );
250 boost::movelib::unique_ptr
<Y
, YD
const&> p( new Y
, yd
);
251 BOOST_TEST( Y::instances
== 1 );
253 boost::shared_ptr
<Y
> p2( boost::move( p
) );
254 BOOST_TEST( Y::instances
== 1 );
255 BOOST_TEST( p
.get() == 0 );
258 BOOST_TEST( Y::instances
== 0 );
260 p2
= boost::movelib::unique_ptr
<Y
, YD
const&>( new Y
, yd
);
261 BOOST_TEST( Y::instances
== 1 );
263 p2
= boost::movelib::unique_ptr
<Y
, YD
const&>( new Y
, yd
);
264 BOOST_TEST( Y::instances
== 1 );
267 BOOST_TEST( Y::instances
== 0 );
271 test_null_unique_ptr
<X
>( boost::movelib::unique_ptr
<X
>(), boost::movelib::unique_ptr
<X
>() );
272 test_null_unique_ptr
<X
const>( boost::movelib::unique_ptr
<X
>(), boost::movelib::unique_ptr
<X
>() );
273 test_null_unique_ptr
<void>( boost::movelib::unique_ptr
<X
>(), boost::movelib::unique_ptr
<X
>() );
274 test_null_unique_ptr
<void const>( boost::movelib::unique_ptr
<X
>(), boost::movelib::unique_ptr
<X
>() );
278 test_null_unique_ptr
<Y
>( boost::movelib::unique_ptr
<Y
, YD
>( 0, YD() ), boost::movelib::unique_ptr
<Y
, YD
>( 0, YD() ) );
279 test_null_unique_ptr
<Y
const>( boost::movelib::unique_ptr
<Y
, YD
>( 0, YD() ), boost::movelib::unique_ptr
<Y
, YD
>( 0, YD() ) );
280 test_null_unique_ptr
<void>( boost::movelib::unique_ptr
<Y
, YD
>( 0, YD() ), boost::movelib::unique_ptr
<Y
, YD
>( 0, YD() ) );
281 test_null_unique_ptr
<void const>( boost::movelib::unique_ptr
<Y
, YD
>( 0, YD() ), boost::movelib::unique_ptr
<Y
, YD
>( 0, YD() ) );
287 test_null_unique_ptr
<Y
>( boost::movelib::unique_ptr
<Y
, YD
&>( 0, yd
), boost::movelib::unique_ptr
<Y
, YD
&>( 0, yd
) );
288 test_null_unique_ptr
<Y
const>( boost::movelib::unique_ptr
<Y
, YD
&>( 0, yd
), boost::movelib::unique_ptr
<Y
, YD
&>( 0, yd
) );
289 test_null_unique_ptr
<void>( boost::movelib::unique_ptr
<Y
, YD
&>( 0, yd
), boost::movelib::unique_ptr
<Y
, YD
&>( 0, yd
) );
290 test_null_unique_ptr
<void const>( boost::movelib::unique_ptr
<Y
, YD
&>( 0, yd
), boost::movelib::unique_ptr
<Y
, YD
&>( 0, yd
) );
293 return boost::report_errors();