]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/smart_ptr/test/shared_from_raw_test2.cpp
2 // shared_from_raw_test2.cpp - based on esft_regtest.cpp
4 // Copyright (c) 2008, 2014 Peter Dimov
6 // Distributed under the Boost Software License, Version 1.0.
8 // See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt
12 #include <boost/smart_ptr/enable_shared_from_raw.hpp>
13 #include <boost/shared_ptr.hpp>
14 #include <boost/weak_ptr.hpp>
15 #include <boost/detail/lightweight_test.hpp>
16 #include <boost/config.hpp>
20 class X
: public boost::enable_shared_from_raw
31 X
& operator=( X
const& );
39 explicit X( int expected
): destroyed_( 0 ), deleted_( 0 ), expected_( expected
)
46 BOOST_TEST( deleted_
== expected_
);
47 BOOST_TEST( destroyed_
== 0 );
52 typedef void (*deleter_type
)( X
* );
54 static void deleter( X
* px
)
59 static void deleter2( X
* px
)
70 BOOST_TEST( X::instances
== 0 );
74 BOOST_TEST( X::instances
== 1 );
77 BOOST_TEST( X::instances
== 0 );
79 #if !defined( BOOST_NO_AUTO_PTR )
82 std::auto_ptr
<X
> px( new X( 0 ) );
83 BOOST_TEST( X::instances
== 1 );
88 BOOST_TEST( X::instances
== 0 );
91 boost::shared_ptr
<X
> px( new X( 0 ) );
92 BOOST_TEST( X::instances
== 1 );
94 boost::weak_ptr
<X
> wp( px
);
95 BOOST_TEST( !wp
.expired() );
99 BOOST_TEST( wp
.expired() );
102 BOOST_TEST( X::instances
== 0 );
106 boost::shared_ptr
<X
> px( &x
, X::deleter
);
107 BOOST_TEST( X::instances
== 1 );
109 X::deleter_type
* pd
= boost::get_deleter
<X::deleter_type
>( px
);
110 BOOST_TEST( pd
!= 0 && *pd
== X::deleter
);
112 boost::weak_ptr
<X
> wp( px
);
113 BOOST_TEST( !wp
.expired() );
117 BOOST_TEST( wp
.expired() );
120 BOOST_TEST( X::instances
== 0 );
123 boost::shared_ptr
<X
> px( new X( 1 ), X::deleter2
);
124 BOOST_TEST( X::instances
== 1 );
126 X::deleter_type
* pd
= boost::get_deleter
<X::deleter_type
>( px
);
127 BOOST_TEST( pd
!= 0 && *pd
== X::deleter2
);
129 boost::weak_ptr
<X
> wp( px
);
130 BOOST_TEST( !wp
.expired() );
134 BOOST_TEST( wp
.expired() );
137 BOOST_TEST( X::instances
== 0 );
140 struct V
: public boost::enable_shared_from_raw
158 boost::shared_ptr
<W
> p( new W
);
164 boost::shared_ptr
<void> pv( p
);
165 BOOST_TEST( pv
.get() == p
);
166 BOOST_TEST( pv
.use_count() == 1 );
171 void operator()( void const* ) const {}
176 boost::shared_ptr
<V
> pv( new V
);
177 boost::shared_ptr
<V
> pv2( pv
.get(), null_deleter() );
178 BOOST_TEST( pv2
.get() == pv
.get() );
179 BOOST_TEST( pv2
.use_count() == 1 );
186 boost::shared_ptr
<V
> p1( &v
, null_deleter() );
187 BOOST_TEST( p1
.get() == &v
);
188 BOOST_TEST( p1
.use_count() == 1 );
192 boost::shared_from_raw( p1
.get() );
196 BOOST_ERROR( "shared_from_raw( p1.get() ) failed" );
201 boost::shared_ptr
<V
> p2( &v
, null_deleter() );
202 BOOST_TEST( p2
.get() == &v
);
203 BOOST_TEST( p2
.use_count() == 1 );
207 boost::shared_from_raw( p2
.get() );
211 BOOST_ERROR( "shared_from_raw( p2.get() ) failed" );
223 return boost::report_errors();