mirror of
https://github.com/boostorg/smart_ptr.git
synced 2025-11-03 17:21:51 +01:00
@@ -48,5 +48,9 @@ import testing ;
|
||||
[ run ip_convertible_test.cpp ]
|
||||
[ run allocate_shared_test.cpp ]
|
||||
[ run sp_atomic_test.cpp ]
|
||||
[ run esft_void_test.cpp ]
|
||||
[ run esft_second_ptr_test.cpp ]
|
||||
[ run make_shared_esft_test.cpp ]
|
||||
[ run allocate_shared_esft_test.cpp ]
|
||||
;
|
||||
}
|
||||
|
||||
264
test/allocate_shared_esft_test.cpp
Normal file
264
test/allocate_shared_esft_test.cpp
Normal file
@@ -0,0 +1,264 @@
|
||||
// allocate_shared_esft_test.cpp
|
||||
//
|
||||
// Copyright 2007-2009 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
#include <memory>
|
||||
|
||||
class X: public boost::enable_shared_from_this<X>
|
||||
{
|
||||
private:
|
||||
|
||||
X( X const & );
|
||||
X & operator=( X const & );
|
||||
|
||||
public:
|
||||
|
||||
static int instances;
|
||||
|
||||
explicit X( int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0 )
|
||||
{
|
||||
++instances;
|
||||
}
|
||||
|
||||
~X()
|
||||
{
|
||||
--instances;
|
||||
}
|
||||
};
|
||||
|
||||
int X::instances = 0;
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>() );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1, 2 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5, 6 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7, 8 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::allocate_shared< X >( std::allocator<void>(), 1, 2, 3, 4, 5, 6, 7, 8, 9 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/weak_ptr.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
class X
|
||||
{
|
||||
@@ -18,6 +19,14 @@ private:
|
||||
X( X const & );
|
||||
X & operator=( X const & );
|
||||
|
||||
void * operator new( std::size_t );
|
||||
|
||||
void operator delete( void * p )
|
||||
{
|
||||
// lack of this definition causes link errors on MSVC
|
||||
::operator delete( p );
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
static int instances;
|
||||
|
||||
51
test/esft_second_ptr_test.cpp
Normal file
51
test/esft_second_ptr_test.cpp
Normal file
@@ -0,0 +1,51 @@
|
||||
//
|
||||
// esft_second_ptr_test.cpp
|
||||
//
|
||||
// This test has been extracted from a real
|
||||
// scenario that occurs in Boost.Python
|
||||
//
|
||||
// Copyright 2009 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
//
|
||||
|
||||
class X: public boost::enable_shared_from_this<X>
|
||||
{
|
||||
};
|
||||
|
||||
void null_deleter( void const* )
|
||||
{
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::shared_ptr<X> px( new X );
|
||||
|
||||
{
|
||||
boost::shared_ptr<X> px2( px.get(), null_deleter );
|
||||
BOOST_TEST( px == px2 );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
41
test/esft_void_test.cpp
Normal file
41
test/esft_void_test.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// esft_void_test.cpp
|
||||
//
|
||||
// Copyright 2009 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
//
|
||||
|
||||
class X: public boost::enable_shared_from_this<X>
|
||||
{
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::shared_ptr< void const volatile > pv( new X );
|
||||
boost::shared_ptr< void > pv2 = boost::const_pointer_cast< void >( pv );
|
||||
boost::shared_ptr< X > px = boost::static_pointer_cast< X >( pv2 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
263
test/make_shared_esft_test.cpp
Normal file
263
test/make_shared_esft_test.cpp
Normal file
@@ -0,0 +1,263 @@
|
||||
// make_shared_esft_test.cpp
|
||||
//
|
||||
// Copyright 2007-2009 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
|
||||
class X: public boost::enable_shared_from_this<X>
|
||||
{
|
||||
private:
|
||||
|
||||
X( X const & );
|
||||
X & operator=( X const & );
|
||||
|
||||
public:
|
||||
|
||||
static int instances;
|
||||
|
||||
explicit X( int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0 )
|
||||
{
|
||||
++instances;
|
||||
}
|
||||
|
||||
~X()
|
||||
{
|
||||
--instances;
|
||||
}
|
||||
};
|
||||
|
||||
int X::instances = 0;
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5, 6 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7, 8 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7, 8, 9 );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr< X > qx = px->shared_from_this();
|
||||
|
||||
BOOST_TEST( px == qx );
|
||||
BOOST_TEST( !( px < qx ) && !( qx < px ) );
|
||||
|
||||
px.reset();
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "px->shared_from_this() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <boost/make_shared.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/weak_ptr.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
class X
|
||||
{
|
||||
@@ -18,6 +19,14 @@ private:
|
||||
X( X const & );
|
||||
X & operator=( X const & );
|
||||
|
||||
void * operator new( std::size_t );
|
||||
|
||||
void operator delete( void * p )
|
||||
{
|
||||
// lack of this definition causes link errors on MSVC
|
||||
::operator delete( p );
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
static int instances;
|
||||
|
||||
@@ -55,16 +55,23 @@ void test()
|
||||
BOOST_TEST(py.get() != 0);
|
||||
BOOST_TEST(py.use_count() == 1);
|
||||
|
||||
boost::shared_ptr<X> px = py->getX();
|
||||
BOOST_TEST(px.get() != 0);
|
||||
BOOST_TEST(py.use_count() == 2);
|
||||
try
|
||||
{
|
||||
boost::shared_ptr<X> px = py->getX();
|
||||
BOOST_TEST(px.get() != 0);
|
||||
BOOST_TEST(py.use_count() == 2);
|
||||
|
||||
px->f();
|
||||
px->f();
|
||||
|
||||
boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px);
|
||||
BOOST_TEST(py.get() == py2.get());
|
||||
BOOST_TEST(!(py < py2 || py2 < py));
|
||||
BOOST_TEST(py.use_count() == 3);
|
||||
boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px);
|
||||
BOOST_TEST(py.get() == py2.get());
|
||||
BOOST_TEST(!(py < py2 || py2 < py));
|
||||
BOOST_TEST(py.use_count() == 3);
|
||||
}
|
||||
catch( boost::bad_weak_ptr const& )
|
||||
{
|
||||
BOOST_ERROR( "py->getX() failed" );
|
||||
}
|
||||
}
|
||||
|
||||
void test2();
|
||||
@@ -124,19 +131,25 @@ void test3()
|
||||
{
|
||||
boost::shared_ptr<V> p(new V);
|
||||
|
||||
boost::shared_ptr<V> q = p->shared_from_this();
|
||||
BOOST_TEST(p == q);
|
||||
BOOST_TEST(!(p < q) && !(q < p));
|
||||
try
|
||||
{
|
||||
boost::shared_ptr<V> q = p->shared_from_this();
|
||||
BOOST_TEST(p == q);
|
||||
BOOST_TEST(!(p < q) && !(q < p));
|
||||
}
|
||||
catch( boost::bad_weak_ptr const & )
|
||||
{
|
||||
BOOST_ERROR( "p->shared_from_this() failed" );
|
||||
}
|
||||
|
||||
V v2(*p);
|
||||
|
||||
try
|
||||
{
|
||||
boost::shared_ptr<V> r = v2.shared_from_this();
|
||||
BOOST_TEST( p < r || r < p );
|
||||
BOOST_TEST( r.get() == &v2 );
|
||||
BOOST_ERROR("v2.shared_from_this() failed to throw");
|
||||
}
|
||||
catch(boost::bad_weak_ptr const &)
|
||||
catch( boost::bad_weak_ptr const & )
|
||||
{
|
||||
}
|
||||
|
||||
@@ -147,7 +160,7 @@ void test3()
|
||||
BOOST_TEST(p == r);
|
||||
BOOST_TEST(!(p < r) && !(r < p));
|
||||
}
|
||||
catch(boost::bad_weak_ptr const &)
|
||||
catch( boost::bad_weak_ptr const & )
|
||||
{
|
||||
BOOST_ERROR("p->shared_from_this() threw bad_weak_ptr after *p = V()");
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
|
||||
#if defined( BOOST_HAS_RVALUE_REFS )
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
@@ -93,3 +95,12 @@ int main()
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
#else // !defined( BOOST_HAS_RVALUE_REFS )
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user