diff --git a/include/boost/smart_ptr/local_shared_ptr.hpp b/include/boost/smart_ptr/local_shared_ptr.hpp index 1d8e592..21cae2e 100644 --- a/include/boost/smart_ptr/local_shared_ptr.hpp +++ b/include/boost/smart_ptr/local_shared_ptr.hpp @@ -110,18 +110,28 @@ public: template local_shared_ptr( shared_ptr const & r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) - : px( r.get() ), pn( new boost::detail::local_counted_impl( r ) ) + : px( r.get() ), pn( 0 ) { boost::detail::sp_assert_convertible< Y, T >(); + + if( r.use_count() != 0 ) + { + pn = new boost::detail::local_counted_impl( r ); + } } #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) template local_shared_ptr( shared_ptr && r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) - : px( r.get() ), pn( new boost::detail::local_counted_impl( std::move(r) ) ) + : px( r.get() ), pn( 0 ) { boost::detail::sp_assert_convertible< Y, T >(); + + if( r.use_count() != 0 ) + { + pn = new boost::detail::local_counted_impl( std::move(r) ); + } } #endif diff --git a/test/local_sp_test.cpp b/test/local_sp_test.cpp index d3388f7..fbe441d 100644 --- a/test/local_sp_test.cpp +++ b/test/local_sp_test.cpp @@ -43,6 +43,8 @@ template static void test_empty( boost::local_shared_ptr const & p ) BOOST_TEST( p.local_use_count() == 0 ); } +// default constructor + static void default_constructor() { { @@ -71,6 +73,8 @@ static void default_constructor() } } +// nullptr_constructor + static void nullptr_constructor() { #if !defined( BOOST_NO_CXX11_NULLPTR ) @@ -103,6 +107,8 @@ static void nullptr_constructor() #endif } +// pointer constructor + template static void pc0_test_() { boost::local_shared_ptr p( static_cast( 0 ) ); @@ -171,6 +177,8 @@ static void pointer_constructor() BOOST_TEST( X::instances == 0 ); } +// deleter constructor + int m = 0; void deleter2( int * p ) @@ -207,6 +215,121 @@ static void deleter_constructor() deleter2_test_(); } +// nullptr_deleter_constructor + +#if !defined( BOOST_NO_CXX11_NULLPTR ) + +void deleter3( boost::detail::sp_nullptr_t ) +{ + ++m; +} + +template static void deleter3_test_() +{ + { + m = 0; + boost::local_shared_ptr p( nullptr, deleter3 ); + + BOOST_TEST( !p ); + BOOST_TEST( p.get() == 0 ); + BOOST_TEST( p.local_use_count() == 1 ); + } + + BOOST_TEST( m == 1 ); +} + +static void nullptr_deleter_constructor() +{ + deleter3_test_(); + deleter3_test_(); + deleter3_test_(); + deleter3_test_(); + + deleter3_test_(); + deleter3_test_(); + deleter3_test_(); + deleter3_test_(); +} + +#else + +static void nullptr_deleter_constructor() +{ +} + +#endif + +// allocator constructor + +template static void allocator_test_() +{ + { + m = 0; + boost::local_shared_ptr p( &m, deleter2, std::allocator() ); + + BOOST_TEST( p? true: false ); + BOOST_TEST( !!p ); + BOOST_TEST( p.get() == &m ); + BOOST_TEST( p.local_use_count() == 1 ); + } + + BOOST_TEST( m == 1 ); +} + +static void allocator_constructor() +{ + allocator_test_(); + allocator_test_(); + allocator_test_(); + allocator_test_(); + + allocator_test_(); + allocator_test_(); + allocator_test_(); + allocator_test_(); +} + +// nullptr_allocator_constructor + +#if !defined( BOOST_NO_CXX11_NULLPTR ) + +template static void allocator3_test_() +{ + { + m = 0; + boost::local_shared_ptr p( nullptr, deleter3, std::allocator() ); + + BOOST_TEST( !p ); + BOOST_TEST( p.get() == 0 ); + BOOST_TEST( p.local_use_count() == 1 ); + } + + BOOST_TEST( m == 1 ); +} + +static void nullptr_allocator_constructor() +{ + allocator3_test_(); + allocator3_test_(); + allocator3_test_(); + allocator3_test_(); + + allocator3_test_(); + allocator3_test_(); + allocator3_test_(); + allocator3_test_(); +} + +#else + +static void nullptr_allocator_constructor() +{ +} + +#endif + +// copy constructor + template static void empty_copy_test() { boost::local_shared_ptr p1; @@ -273,17 +396,106 @@ static void copy_constructor() empty_copy_test(); empty_copy_test(); empty_copy_test(); + BOOST_TEST( X::instances == 0 ); null_copy_test(); null_copy_test(); + BOOST_TEST( X::instances == 0 ); new_copy_test(); new_copy_test(); + BOOST_TEST( X::instances == 0 ); } +// move constructor + +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + +template static void empty_move_test() +{ + boost::local_shared_ptr p2(( boost::local_shared_ptr() )); + test_empty( p2 ); + + boost::local_shared_ptr p3(( boost::local_shared_ptr() )); + test_empty( p3 ); + + boost::local_shared_ptr p4(( boost::local_shared_ptr() )); + test_empty( p4 ); + + boost::local_shared_ptr p5( std::move(p3) ); + test_empty( p5 ); +} + +template static void test_nonempty_move( boost::local_shared_ptr && p1 ) +{ + U* q = p1.get(); + long k = p1.local_use_count(); + + boost::local_shared_ptr p2( std::move(p1) ); + + BOOST_TEST( p2.get() == q ); + BOOST_TEST( p2.local_use_count() == k ); + + BOOST_TEST( p1.get() == 0 ); + BOOST_TEST( p1.local_use_count() == 0 ); +} + +template static void null_move_test() +{ + test_nonempty_move( boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move( boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move( boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move( boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move( boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move( boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move( boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move( boost::local_shared_ptr( static_cast(0) ) ); +} + +template static void new_move_test() +{ + test_nonempty_move( boost::local_shared_ptr( new T() ) ); + test_nonempty_move( boost::local_shared_ptr( new T() ) ); + test_nonempty_move( boost::local_shared_ptr( new T() ) ); + test_nonempty_move( boost::local_shared_ptr( new T() ) ); + test_nonempty_move( boost::local_shared_ptr( new T() ) ); + test_nonempty_move( boost::local_shared_ptr( new T() ) ); + test_nonempty_move( boost::local_shared_ptr( new T() ) ); + test_nonempty_move( boost::local_shared_ptr( new T() ) ); +} + +static void move_constructor() +{ + empty_move_test(); + empty_move_test(); + empty_move_test(); + + BOOST_TEST( X::instances == 0 ); + + null_move_test(); + null_move_test(); + + BOOST_TEST( X::instances == 0 ); + + new_move_test(); + new_move_test(); + + BOOST_TEST( X::instances == 0 ); +} + +#else + +static void move_constructor() +{ +} + +#endif + +// aliasing constructor + template void test_aliasing_( boost::local_shared_ptr const & p1, U * p2 ) { boost::local_shared_ptr p3( p1, p2 ); @@ -413,6 +625,506 @@ static void aliasing_constructor() BOOST_TEST( X::instances == 0 ); } +// shared_ptr copy constructor + +template static void empty_shared_ptr_copy_test() +{ + boost::shared_ptr p1; + + boost::local_shared_ptr p2( p1 ); + test_empty( p2 ); + + boost::local_shared_ptr p3( p1 ); + test_empty( p3 ); + + boost::local_shared_ptr p4( p1 ); + test_empty( p4 ); + + boost::local_shared_ptr p5( p3 ); + test_empty( p5 ); +} + +template static void test_nonempty_shared_ptr_copy( boost::shared_ptr const & p1 ) +{ + long k = p1.use_count(); + + { + boost::local_shared_ptr p2( p1 ); + + BOOST_TEST( p2.get() == p1.get() ); + BOOST_TEST( p2.local_use_count() == 1 ); + + BOOST_TEST( p1.use_count() == k + 1 ); + } + + BOOST_TEST( p1.use_count() == k ); +} + +template static void null_shared_ptr_copy_test() +{ + boost::shared_ptr p1( static_cast(0) ); + + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); +} + +template static void new_shared_ptr_copy_test() +{ + boost::shared_ptr p1( new T() ); + + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); + test_nonempty_shared_ptr_copy( p1 ); +} + +static void shared_ptr_copy_constructor() +{ + empty_shared_ptr_copy_test(); + empty_shared_ptr_copy_test(); + empty_shared_ptr_copy_test(); + + BOOST_TEST( X::instances == 0 ); + + null_shared_ptr_copy_test(); + null_shared_ptr_copy_test(); + + BOOST_TEST( X::instances == 0 ); + + new_shared_ptr_copy_test(); + new_shared_ptr_copy_test(); + + BOOST_TEST( X::instances == 0 ); +} + +// shared_ptr_move constructor + +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + +template static void empty_shared_ptr_move_test() +{ + boost::local_shared_ptr p2(( boost::shared_ptr() )); + test_empty( p2 ); + + boost::local_shared_ptr p3(( boost::shared_ptr() )); + test_empty( p3 ); + + boost::local_shared_ptr p4(( boost::shared_ptr() )); + test_empty( p4 ); + + boost::local_shared_ptr p5( std::move(p3) ); + test_empty( p5 ); +} + +template static void test_nonempty_shared_ptr_move( boost::shared_ptr && p1 ) +{ + U* q = p1.get(); + + boost::local_shared_ptr p2( std::move(p1) ); + + BOOST_TEST( p2.get() == q ); + BOOST_TEST( p2.local_use_count() == 1 ); + + BOOST_TEST( p1.get() == 0 ); + BOOST_TEST( p1.use_count() == 0 ); +} + +template static void null_shared_ptr_move_test() +{ + test_nonempty_shared_ptr_move( boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( static_cast(0) ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( static_cast(0) ) ); +} + +template static void new_shared_ptr_move_test() +{ + test_nonempty_shared_ptr_move( boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( new T() ) ); + test_nonempty_shared_ptr_move( boost::shared_ptr( new T() ) ); +} + +static void shared_ptr_move_constructor() +{ + empty_shared_ptr_move_test(); + empty_shared_ptr_move_test(); + empty_shared_ptr_move_test(); + + BOOST_TEST( X::instances == 0 ); + + null_shared_ptr_move_test(); + null_shared_ptr_move_test(); + + BOOST_TEST( X::instances == 0 ); + + new_shared_ptr_move_test(); + new_shared_ptr_move_test(); + + BOOST_TEST( X::instances == 0 ); +} + +#else + +static void shared_ptr_move_constructor() +{ +} + +#endif + +// copy assignment + +template static void empty_copy_assign_test() +{ + boost::local_shared_ptr p1; + test_empty( p1 ); + + boost::local_shared_ptr p2; + + p2 = p1; + test_empty( p2 ); + + boost::local_shared_ptr p3; + + p3 = p1; + test_empty( p3 ); + + boost::local_shared_ptr p4; + + p4 = p1; + test_empty( p4 ); + + boost::local_shared_ptr p5; + + p5 = p3; + test_empty( p5 ); +} + +template static void empty_copy_assign_test_() +{ + boost::local_shared_ptr p1; + test_empty( p1 ); + + boost::local_shared_ptr p2( static_cast(0) ); + + p2 = p1; + test_empty( p2 ); + + boost::local_shared_ptr p3( static_cast(0) ); + + p3 = p1; + test_empty( p3 ); + + boost::local_shared_ptr p4( static_cast(0) ); + + p4 = p1; + test_empty( p4 ); + + boost::local_shared_ptr p5( static_cast(0) ); + + p5 = p3; + test_empty( p5 ); +} + +template static void test_nonempty_copy_assign( boost::local_shared_ptr p2, boost::local_shared_ptr const & p1 ) +{ + long k = p1.local_use_count(); + + p2 = p1; + + BOOST_TEST( p2.get() == p1.get() ); + BOOST_TEST( p2.local_use_count() == p1.local_use_count() ); + BOOST_TEST( p2.local_use_count() == k + 1 ); + + p2.reset(); + + BOOST_TEST( p1.local_use_count() == k ); +} + +template static void null_copy_assign_test() +{ + boost::local_shared_ptr p1( static_cast(0) ); + + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + + test_nonempty_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); +} + +template static void new_copy_assign_test() +{ + boost::local_shared_ptr p1( new T() ); + + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + + test_nonempty_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( static_cast(0) ), p1 ); + + test_nonempty_copy_assign( boost::local_shared_ptr( new T() ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( new T const() ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( new T volatile() ), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr( new T const volatile() ), p1 ); + + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); + test_nonempty_copy_assign( boost::local_shared_ptr(), p1 ); +} + +static void copy_assignment() +{ + empty_copy_assign_test(); + empty_copy_assign_test(); + empty_copy_assign_test_(); + empty_copy_assign_test(); + empty_copy_assign_test_(); + + BOOST_TEST( X::instances == 0 ); + + null_copy_assign_test(); + null_copy_assign_test(); + + BOOST_TEST( X::instances == 0 ); + + new_copy_assign_test(); + new_copy_assign_test(); + + BOOST_TEST( X::instances == 0 ); +} + +// move assignment + +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + +template static void empty_move_assign_test() +{ + boost::local_shared_ptr p2; + + p2 = boost::local_shared_ptr(); + test_empty( p2 ); + + boost::local_shared_ptr p3; + + p3 = boost::local_shared_ptr(); + test_empty( p3 ); + + boost::local_shared_ptr p4; + + p4 = boost::local_shared_ptr(); + test_empty( p4 ); + + boost::local_shared_ptr p5; + + p5 = std::move( p3 ); + test_empty( p5 ); +} + +template static void empty_move_assign_test_() +{ + boost::local_shared_ptr p2( static_cast(0) ); + + p2 = boost::local_shared_ptr(); + test_empty( p2 ); + + boost::local_shared_ptr p3( static_cast(0) ); + + p3 = boost::local_shared_ptr(); + test_empty( p3 ); + + boost::local_shared_ptr p4( static_cast(0) ); + + p4 = boost::local_shared_ptr(); + test_empty( p4 ); + + boost::local_shared_ptr p5( static_cast(0) ); + + p5 = std::move( p3 ); + test_empty( p5 ); +} + +template static void test_nonempty_move_assign( boost::local_shared_ptr p2, boost::local_shared_ptr && p1 ) +{ + U* q = p1.get(); + long k = p1.local_use_count(); + + p2 = std::move( p1 ); + + BOOST_TEST( p2.get() == q ); + BOOST_TEST( p2.local_use_count() == k ); + + BOOST_TEST( p1.get() == 0 ); + BOOST_TEST( p1.local_use_count() == 0 ); +} + +template static void null_move_assign_test() +{ + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( static_cast(0) ) ); + + test_nonempty_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::local_shared_ptr( static_cast(0) ) ); + + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( static_cast(0) ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( static_cast(0) ) ); +} + +template static void new_move_assign_test() +{ + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( new T() ) ); + + test_nonempty_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr( static_cast(0) ), boost::local_shared_ptr( new T() ) ); + + test_nonempty_move_assign( boost::local_shared_ptr( new T() ), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr( new T const() ), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr( new T volatile() ), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr( new T const volatile() ), boost::local_shared_ptr( new T() ) ); + + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( new T() ) ); + test_nonempty_move_assign( boost::local_shared_ptr(), boost::local_shared_ptr( new T() ) ); +} + +static void move_assignment() +{ + empty_move_assign_test(); + empty_move_assign_test(); + empty_move_assign_test_(); + empty_move_assign_test(); + empty_move_assign_test_(); + + BOOST_TEST( X::instances == 0 ); + + null_move_assign_test(); + null_move_assign_test(); + + BOOST_TEST( X::instances == 0 ); + + new_move_assign_test(); + new_move_assign_test(); + + BOOST_TEST( X::instances == 0 ); +} + +#else + +static void move_assignment() +{ +} + +#endif + +// nullptr assignment + +#if !defined( BOOST_NO_CXX11_NULLPTR ) + +template static void test_nullptr_assign( boost::local_shared_ptr p1 ) +{ + p1 = nullptr; + + BOOST_TEST( p1.get() == 0 ); + BOOST_TEST( p1.local_use_count() == 0 ); +} + +template static void empty_nullptr_assign_test() +{ + test_nullptr_assign( boost::local_shared_ptr() ); + test_nullptr_assign( boost::local_shared_ptr() ); + test_nullptr_assign( boost::local_shared_ptr() ); + test_nullptr_assign( boost::local_shared_ptr() ); +} + +template static void null_nullptr_assign_test() +{ + test_nullptr_assign( boost::local_shared_ptr( static_cast(0) ) ); + test_nullptr_assign( boost::local_shared_ptr( static_cast(0) ) ); + test_nullptr_assign( boost::local_shared_ptr( static_cast(0) ) ); + test_nullptr_assign( boost::local_shared_ptr( static_cast(0) ) ); +} + +template static void new_nullptr_assign_test() +{ + test_nullptr_assign( boost::local_shared_ptr( new T() ) ); + test_nullptr_assign( boost::local_shared_ptr( new T const() ) ); + test_nullptr_assign( boost::local_shared_ptr( new T volatile() ) ); + test_nullptr_assign( boost::local_shared_ptr( new T const volatile() ) ); +} + +static void nullptr_assignment() +{ + empty_nullptr_assign_test(); + empty_nullptr_assign_test(); + empty_nullptr_assign_test(); + empty_nullptr_assign_test(); + + BOOST_TEST( X::instances == 0 ); + + null_nullptr_assign_test(); + null_nullptr_assign_test(); + + BOOST_TEST( X::instances == 0 ); + + new_nullptr_assign_test(); + new_nullptr_assign_test(); + + BOOST_TEST( X::instances == 0 ); +} + +#else + +static void nullptr_assignment() +{ +} + +#endif + +// main + int main() { default_constructor(); @@ -420,7 +1132,31 @@ int main() pointer_constructor(); deleter_constructor(); copy_constructor(); + move_constructor(); aliasing_constructor(); + nullptr_deleter_constructor(); + allocator_constructor(); + nullptr_allocator_constructor(); + shared_ptr_copy_constructor(); + shared_ptr_move_constructor(); + // unique_ptr_constructor(); + + copy_assignment(); + move_assignment(); + nullptr_assignment(); + // shared_ptr_copy_assignment(); + // shared_ptr_move_assignment(); + // unique_ptr_assignment(); + + // pointer_reset(); + // deleter_reset(); + // allocator_reset(); + // aliasing_reset(); + + // element_access(); + // swap_test(); + // owner_before_test(); + // equal_test(); return boost::report_errors(); }