// // local_sp_test.cpp // // Copyright 2002, 2003, 2017 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 #include struct X { static long instances; X() { ++instances; } ~X() { --instances; } private: X( X const & ); X & operator=( X const & ); }; long X::instances = 0; class incomplete; static void default_constructor() { { boost::local_shared_ptr p; BOOST_TEST( p? false: true ); BOOST_TEST( !p ); BOOST_TEST( p.get() == 0 ); BOOST_TEST( p.local_use_count() == 0 ); } { boost::local_shared_ptr p; BOOST_TEST( p? false: true ); BOOST_TEST( !p ); BOOST_TEST( p.get() == 0 ); BOOST_TEST( p.local_use_count() == 0 ); } { boost::local_shared_ptr p; BOOST_TEST( p? false: true ); BOOST_TEST( !p ); BOOST_TEST( p.get() == 0 ); BOOST_TEST( p.local_use_count() == 0 ); } BOOST_TEST( X::instances == 0 ); { boost::local_shared_ptr p; BOOST_TEST( X::instances == 0 ); BOOST_TEST( p? false: true ); BOOST_TEST( !p ); BOOST_TEST( p.get() == 0 ); BOOST_TEST( p.local_use_count() == 0 ); } } template static void pc0_test_() { boost::local_shared_ptr p( static_cast( 0 ) ); BOOST_TEST( p? false: true ); BOOST_TEST( !p ); BOOST_TEST( p.get() == 0 ); BOOST_TEST( p.local_use_count() == 1 ); } template static void pc0_test() { pc0_test_(); pc0_test_(); pc0_test_(); pc0_test_(); pc0_test_(); pc0_test_(); pc0_test_(); pc0_test_(); pc0_test_(); pc0_test_(); pc0_test_(); } template static void pc1_test_() { boost::local_shared_ptr p( new U() ); BOOST_TEST( p? true: false ); BOOST_TEST( !!p ); BOOST_TEST( p.get() != 0 ); BOOST_TEST( p.local_use_count() == 1 ); } template static void pc1_test() { pc1_test_(); pc1_test_(); pc1_test_(); pc1_test_(); pc1_test_(); pc1_test_(); pc1_test_(); pc1_test_(); pc1_test_(); pc1_test_(); pc1_test_(); } static void pointer_constructor() { pc0_test(); pc0_test(); pc1_test(); BOOST_TEST( X::instances == 0 ); pc1_test(); BOOST_TEST( X::instances == 0 ); } int m = 0; void deleter2( int * p ) { BOOST_TEST( p == &m ); ++*p; } template static void deleter2_test_() { { m = 0; boost::local_shared_ptr p( &m, deleter2 ); 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 deleter_constructor() { deleter2_test_(); deleter2_test_(); deleter2_test_(); deleter2_test_(); deleter2_test_(); deleter2_test_(); deleter2_test_(); deleter2_test_(); } template static void test_empty( boost::local_shared_ptr const & p ) { BOOST_TEST( p? false: true ); BOOST_TEST( !p ); BOOST_TEST( p.get() == 0 ); BOOST_TEST( p.local_use_count() == 0 ); } template static void empty_copy_test() { boost::local_shared_ptr p1; test_empty( 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_copy( boost::local_shared_ptr const & p1 ) { long k = p1.local_use_count(); { boost::local_shared_ptr 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 ); } BOOST_TEST( p1.local_use_count() == k ); } template static void null_copy_test() { boost::local_shared_ptr p1( static_cast(0) ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); } template static void new_copy_test() { boost::local_shared_ptr p1( new T() ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); test_nonempty_copy( p1 ); } static void copy_constructor() { empty_copy_test(); empty_copy_test(); empty_copy_test(); null_copy_test(); null_copy_test(); new_copy_test(); new_copy_test(); } int main() { default_constructor(); pointer_constructor(); deleter_constructor(); copy_constructor(); return boost::report_errors(); }