]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/smart_ptr/test/esft_regtest.cpp
4 // A regression test for enable_shared_from_this
6 // Copyright (c) 2008 Peter Dimov
8 // Distributed under the Boost Software License, Version 1.0.
10 // See accompanying file LICENSE_1_0.txt or copy at
11 // http://www.boost.org/LICENSE_1_0.txt)
14 #include <boost/enable_shared_from_this.hpp>
15 #include <boost/shared_ptr.hpp>
16 #include <boost/weak_ptr.hpp>
17 #include <boost/detail/lightweight_test.hpp>
18 #include <boost/config.hpp>
22 class X
: public boost::enable_shared_from_this
< X
>
33 X
& operator=( X
const& );
41 explicit X( int expected
): destroyed_( 0 ), deleted_( 0 ), expected_( expected
)
48 BOOST_TEST( deleted_
== expected_
);
49 BOOST_TEST( destroyed_
== 0 );
54 typedef void (*deleter_type
)( X
* );
56 static void deleter( X
* px
)
61 static void deleter2( X
* px
)
72 BOOST_TEST( X::instances
== 0 );
76 BOOST_TEST( X::instances
== 1 );
79 BOOST_TEST( X::instances
== 0 );
81 #if !defined( BOOST_NO_AUTO_PTR )
84 std::auto_ptr
<X
> px( new X( 0 ) );
85 BOOST_TEST( X::instances
== 1 );
90 BOOST_TEST( X::instances
== 0 );
93 boost::shared_ptr
<X
> px( new X( 0 ) );
94 BOOST_TEST( X::instances
== 1 );
96 boost::weak_ptr
<X
> wp( px
);
97 BOOST_TEST( !wp
.expired() );
101 BOOST_TEST( wp
.expired() );
104 BOOST_TEST( X::instances
== 0 );
108 boost::shared_ptr
<X
> px( &x
, X::deleter
);
109 BOOST_TEST( X::instances
== 1 );
111 X::deleter_type
* pd
= boost::get_deleter
<X::deleter_type
>( px
);
112 BOOST_TEST( pd
!= 0 && *pd
== X::deleter
);
114 boost::weak_ptr
<X
> wp( px
);
115 BOOST_TEST( !wp
.expired() );
119 BOOST_TEST( wp
.expired() );
122 BOOST_TEST( X::instances
== 0 );
125 boost::shared_ptr
<X
> px( new X( 1 ), X::deleter2
);
126 BOOST_TEST( X::instances
== 1 );
128 X::deleter_type
* pd
= boost::get_deleter
<X::deleter_type
>( px
);
129 BOOST_TEST( pd
!= 0 && *pd
== X::deleter2
);
131 boost::weak_ptr
<X
> wp( px
);
132 BOOST_TEST( !wp
.expired() );
136 BOOST_TEST( wp
.expired() );
139 BOOST_TEST( X::instances
== 0 );
142 struct V
: public boost::enable_shared_from_this
<V
>
160 boost::shared_ptr
<W
> p( new W
);
166 boost::shared_ptr
<void> pv( p
);
167 BOOST_TEST( pv
.get() == p
);
168 BOOST_TEST( pv
.use_count() == 1 );
173 void operator()( void const* ) const {}
178 boost::shared_ptr
<V
> pv( new V
);
179 boost::shared_ptr
<V
> pv2( pv
.get(), null_deleter() );
180 BOOST_TEST( pv2
.get() == pv
.get() );
181 BOOST_TEST( pv2
.use_count() == 1 );
188 boost::shared_ptr
<V
> p1( &v
, null_deleter() );
189 BOOST_TEST( p1
.get() == &v
);
190 BOOST_TEST( p1
.use_count() == 1 );
194 p1
->shared_from_this();
198 BOOST_ERROR( "p1->shared_from_this() failed" );
203 boost::shared_ptr
<V
> p2( &v
, null_deleter() );
204 BOOST_TEST( p2
.get() == &v
);
205 BOOST_TEST( p2
.use_count() == 1 );
209 p2
->shared_from_this();
213 BOOST_ERROR( "p2->shared_from_this() failed" );
225 return boost::report_errors();