#include #if defined(BOOST_MSVC) #pragma warning(disable: 4786) // identifier truncated in debug info #pragma warning(disable: 4710) // function not inlined #pragma warning(disable: 4711) // function selected for automatic inline expansion #pragma warning(disable: 4514) // unreferenced inline removed #pragma warning(disable: 4355) // 'this' : used in base member initializer list #if (BOOST_MSVC >= 1310) #pragma warning(disable: 4675) // resolved overload found with Koenig lookup #endif #endif // // weak_ptr_test.cpp // // Copyright (c) 2002-2005 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 #include #include #include // namespace n_element_type { void f(int &) { } void test() { typedef boost::weak_ptr::element_type T; T t; f(t); } } // namespace n_element_type class incomplete; boost::shared_ptr create_incomplete(); struct X { int dummy; }; struct Y { int dummy2; }; struct Z: public X, public virtual Y { }; namespace n_constructors { void default_constructor() { { boost::weak_ptr wp; BOOST_TEST(wp.use_count() == 0); } { boost::weak_ptr wp; BOOST_TEST(wp.use_count() == 0); } { boost::weak_ptr wp; BOOST_TEST(wp.use_count() == 0); } } void shared_ptr_constructor() { { boost::shared_ptr sp; boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); boost::weak_ptr wp2(sp); BOOST_TEST(wp2.use_count() == sp.use_count()); } { boost::shared_ptr sp(static_cast(0)); { boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } { boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } } { boost::shared_ptr sp(new int); { boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } { boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } } { boost::shared_ptr sp; boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); } { boost::shared_ptr sp(static_cast(0)); boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } { boost::shared_ptr sp(new int); boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } { boost::shared_ptr sp; boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); boost::weak_ptr wp2(sp); BOOST_TEST(wp2.use_count() == sp.use_count()); } { boost::shared_ptr sp = create_incomplete(); { boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } { boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } } { boost::shared_ptr sp = create_incomplete(); boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == sp.use_count()); BOOST_TEST(wp.use_count() == 1); boost::shared_ptr sp2(wp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!(sp < sp2 || sp2 < sp)); } } void copy_constructor() { { boost::weak_ptr wp; boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 0); } { boost::weak_ptr wp; boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 0); } { boost::weak_ptr wp; boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 0); } { boost::shared_ptr sp(static_cast(0)); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp(new int); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp(static_cast(0)); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp(new int); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp = create_incomplete(); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } } void conversion_constructor() { { boost::weak_ptr wp; boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 0); } { boost::weak_ptr wp; boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 0); } { boost::weak_ptr wp; boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 0); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); } { boost::shared_ptr sp(static_cast(0)); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp(new int); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp = create_incomplete(); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp(static_cast(0)); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp(static_cast(0)); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp(new Z); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } { boost::shared_ptr sp(new Z); boost::weak_ptr wp(sp); boost::weak_ptr wp2(wp); BOOST_TEST(wp2.use_count() == wp.use_count()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp2 || wp2 < wp)); sp.reset(); BOOST_TEST(!(wp < wp2 || wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(wp3.use_count() == wp.use_count()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); } } void test() { default_constructor(); shared_ptr_constructor(); copy_constructor(); conversion_constructor(); } } // namespace n_constructors namespace n_assignment { template void copy_assignment(boost::shared_ptr & sp) { BOOST_TEST(sp.unique()); boost::weak_ptr p1; p1 = p1; BOOST_TEST(p1.use_count() == 0); boost::weak_ptr p2; p1 = p2; BOOST_TEST(p1.use_count() == 0); boost::weak_ptr p3(p1); p1 = p3; BOOST_TEST(p1.use_count() == 0); boost::weak_ptr p4(sp); p4 = p4; BOOST_TEST(p4.use_count() == 1); p1 = p4; BOOST_TEST(p1.use_count() == 1); p4 = p2; BOOST_TEST(p4.use_count() == 0); sp.reset(); p1 = p1; BOOST_TEST(p1.use_count() == 0); p4 = p1; BOOST_TEST(p4.use_count() == 0); } void conversion_assignment() { { boost::weak_ptr p1; boost::weak_ptr p2; p1 = p2; BOOST_TEST(p1.use_count() == 0); boost::shared_ptr sp = create_incomplete(); boost::weak_ptr p3(sp); p1 = p3; BOOST_TEST(p1.use_count() == 1); sp.reset(); p1 = p3; BOOST_TEST(p1.use_count() == 0); p1 = p2; BOOST_TEST(p1.use_count() == 0); } { boost::weak_ptr p1; boost::weak_ptr p2; p1 = p2; BOOST_TEST(p1.use_count() == 0); boost::shared_ptr sp(new Z); boost::weak_ptr p3(sp); p1 = p3; BOOST_TEST(p1.use_count() == 1); sp.reset(); p1 = p3; BOOST_TEST(p1.use_count() == 0); p1 = p2; BOOST_TEST(p1.use_count() == 0); } { boost::weak_ptr p1; boost::weak_ptr p2; p1 = p2; BOOST_TEST(p1.use_count() == 0); boost::shared_ptr sp(new Z); boost::weak_ptr p3(sp); p1 = p3; BOOST_TEST(p1.use_count() == 1); sp.reset(); p1 = p3; BOOST_TEST(p1.use_count() == 0); p1 = p2; BOOST_TEST(p1.use_count() == 0); } } template void shared_ptr_assignment(boost::shared_ptr & sp, T * = 0) { BOOST_TEST(sp.unique()); boost::weak_ptr p1; boost::weak_ptr p2(p1); boost::weak_ptr p3(sp); boost::weak_ptr p4(p3); p1 = sp; BOOST_TEST(p1.use_count() == 1); p2 = sp; BOOST_TEST(p2.use_count() == 1); p3 = sp; BOOST_TEST(p3.use_count() == 1); p4 = sp; BOOST_TEST(p4.use_count() == 1); sp.reset(); BOOST_TEST(p1.use_count() == 0); BOOST_TEST(p2.use_count() == 0); BOOST_TEST(p3.use_count() == 0); BOOST_TEST(p4.use_count() == 0); p1 = sp; } void test() { { boost::shared_ptr p( new int ); copy_assignment( p ); } { boost::shared_ptr p( new X ); copy_assignment( p ); } { boost::shared_ptr p( new int ); copy_assignment( p ); } { boost::shared_ptr p = create_incomplete(); copy_assignment( p ); } conversion_assignment(); { boost::shared_ptr p( new int ); shared_ptr_assignment( p ); } { boost::shared_ptr p( new int ); shared_ptr_assignment( p ); } { boost::shared_ptr p( new X ); shared_ptr_assignment( p ); } { boost::shared_ptr p( new X ); shared_ptr_assignment( p ); } { boost::shared_ptr p( new int ); shared_ptr_assignment( p ); } { boost::shared_ptr p = create_incomplete(); shared_ptr_assignment( p ); } { boost::shared_ptr p = create_incomplete(); shared_ptr_assignment( p ); } } } // namespace n_assignment namespace n_reset { template void test2( boost::shared_ptr & sp, T * = 0 ) { BOOST_TEST(sp.unique()); boost::weak_ptr p1; boost::weak_ptr p2(p1); boost::weak_ptr p3(sp); boost::weak_ptr p4(p3); boost::weak_ptr p5(sp); boost::weak_ptr p6(p5); p1.reset(); BOOST_TEST(p1.use_count() == 0); p2.reset(); BOOST_TEST(p2.use_count() == 0); p3.reset(); BOOST_TEST(p3.use_count() == 0); p4.reset(); BOOST_TEST(p4.use_count() == 0); sp.reset(); p5.reset(); BOOST_TEST(p5.use_count() == 0); p6.reset(); BOOST_TEST(p6.use_count() == 0); } void test() { { boost::shared_ptr p( new int ); test2( p ); } { boost::shared_ptr p( new int ); test2( p ); } { boost::shared_ptr p( new X ); test2( p ); } { boost::shared_ptr p( new X ); test2( p ); } { boost::shared_ptr p( new int ); test2( p ); } { boost::shared_ptr p = create_incomplete(); test2( p ); } { boost::shared_ptr p = create_incomplete(); test2( p ); } } } // namespace n_reset namespace n_use_count { void test() { { boost::weak_ptr wp; BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp.expired()); boost::weak_ptr wp2; BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp.expired()); boost::weak_ptr wp3(wp); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp.expired()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(wp3.expired()); } { boost::shared_ptr sp(static_cast(0)); boost::weak_ptr wp(sp); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(!wp.expired()); boost::weak_ptr wp2(sp); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(!wp.expired()); boost::weak_ptr wp3(wp); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(!wp.expired()); BOOST_TEST(wp3.use_count() == 1); BOOST_TEST(!wp3.expired()); boost::shared_ptr sp2(sp); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!wp.expired()); BOOST_TEST(wp2.use_count() == 2); BOOST_TEST(!wp2.expired()); BOOST_TEST(wp3.use_count() == 2); BOOST_TEST(!wp3.expired()); boost::shared_ptr sp3(sp); BOOST_TEST(wp.use_count() == 3); BOOST_TEST(!wp.expired()); BOOST_TEST(wp2.use_count() == 3); BOOST_TEST(!wp2.expired()); BOOST_TEST(wp3.use_count() == 3); BOOST_TEST(!wp3.expired()); sp.reset(); BOOST_TEST(wp.use_count() == 2); BOOST_TEST(!wp.expired()); BOOST_TEST(wp2.use_count() == 2); BOOST_TEST(!wp2.expired()); BOOST_TEST(wp3.use_count() == 2); BOOST_TEST(!wp3.expired()); sp2.reset(); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(!wp.expired()); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!wp2.expired()); BOOST_TEST(wp3.use_count() == 1); BOOST_TEST(!wp3.expired()); sp3.reset(); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp.expired()); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(wp2.expired()); BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(wp3.expired()); } } } // namespace n_use_count namespace n_swap { void test() { { boost::weak_ptr wp; boost::weak_ptr wp2; wp.swap(wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0); using std::swap; swap(wp, wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0); } { boost::shared_ptr sp(new X); boost::weak_ptr wp; boost::weak_ptr wp2(sp); boost::weak_ptr wp3(sp); wp.swap(wp2); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); using std::swap; swap(wp, wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp2 < wp3 || wp3 < wp2)); sp.reset(); wp.swap(wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); swap(wp, wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(!(wp2 < wp3 || wp3 < wp2)); } { boost::shared_ptr sp(new X); boost::shared_ptr sp2(new X); boost::weak_ptr wp(sp); boost::weak_ptr wp2(sp2); boost::weak_ptr wp3(sp2); wp.swap(wp2); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp < wp3 || wp3 < wp)); using std::swap; swap(wp, wp2); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp2 < wp3 || wp3 < wp2)); sp.reset(); wp.swap(wp2); BOOST_TEST(wp.use_count() == 1); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); swap(wp, wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 1); BOOST_TEST(!(wp2 < wp3 || wp3 < wp2)); sp2.reset(); wp.swap(wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(!(wp < wp3 || wp3 < wp)); swap(wp, wp2); BOOST_TEST(wp.use_count() == 0); BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(!(wp2 < wp3 || wp3 < wp2)); } } } // namespace n_swap namespace n_comparison { void test() { { boost::weak_ptr wp; BOOST_TEST(!(wp < wp)); boost::weak_ptr wp2; BOOST_TEST(!(wp < wp2 && wp2 < wp)); boost::weak_ptr wp3(wp); BOOST_TEST(!(wp3 < wp3)); BOOST_TEST(!(wp < wp3 && wp3 < wp)); } { boost::shared_ptr sp(new X); boost::weak_ptr wp(sp); BOOST_TEST(!(wp < wp)); boost::weak_ptr wp2; BOOST_TEST(wp < wp2 || wp2 < wp); BOOST_TEST(!(wp < wp2 && wp2 < wp)); bool b1 = wp < wp2; bool b2 = wp2 < wp; { boost::weak_ptr wp3(wp); BOOST_TEST(!(wp < wp3 || wp3 < wp)); BOOST_TEST(!(wp < wp3 && wp3 < wp)); BOOST_TEST(wp2 < wp3 || wp3 < wp2); BOOST_TEST(!(wp2 < wp3 && wp3 < wp2)); boost::weak_ptr wp4(wp2); BOOST_TEST(wp4 < wp3 || wp3 < wp4); BOOST_TEST(!(wp4 < wp3 && wp3 < wp4)); } sp.reset(); BOOST_TEST(b1 == (wp < wp2)); BOOST_TEST(b2 == (wp2 < wp)); { boost::weak_ptr wp3(wp); BOOST_TEST(!(wp < wp3 || wp3 < wp)); BOOST_TEST(!(wp < wp3 && wp3 < wp)); BOOST_TEST(wp2 < wp3 || wp3 < wp2); BOOST_TEST(!(wp2 < wp3 && wp3 < wp2)); boost::weak_ptr wp4(wp2); BOOST_TEST(wp4 < wp3 || wp3 < wp4); BOOST_TEST(!(wp4 < wp3 && wp3 < wp4)); } } { boost::shared_ptr sp(new X); boost::shared_ptr sp2(new X); boost::weak_ptr wp(sp); boost::weak_ptr wp2(sp2); BOOST_TEST(wp < wp2 || wp2 < wp); BOOST_TEST(!(wp < wp2 && wp2 < wp)); bool b1 = wp < wp2; bool b2 = wp2 < wp; { boost::weak_ptr wp3(wp); BOOST_TEST(!(wp < wp3 || wp3 < wp)); BOOST_TEST(!(wp < wp3 && wp3 < wp)); BOOST_TEST(wp2 < wp3 || wp3 < wp2); BOOST_TEST(!(wp2 < wp3 && wp3 < wp2)); boost::weak_ptr wp4(wp2); BOOST_TEST(wp4 < wp3 || wp3 < wp4); BOOST_TEST(!(wp4 < wp3 && wp3 < wp4)); } sp.reset(); BOOST_TEST(b1 == (wp < wp2)); BOOST_TEST(b2 == (wp2 < wp)); { boost::weak_ptr wp3(wp); BOOST_TEST(!(wp < wp3 || wp3 < wp)); BOOST_TEST(!(wp < wp3 && wp3 < wp)); BOOST_TEST(wp2 < wp3 || wp3 < wp2); BOOST_TEST(!(wp2 < wp3 && wp3 < wp2)); boost::weak_ptr wp4(wp2); BOOST_TEST(wp4 < wp3 || wp3 < wp4); BOOST_TEST(!(wp4 < wp3 && wp3 < wp4)); } sp2.reset(); BOOST_TEST(b1 == (wp < wp2)); BOOST_TEST(b2 == (wp2 < wp)); { boost::weak_ptr wp3(wp); BOOST_TEST(!(wp < wp3 || wp3 < wp)); BOOST_TEST(!(wp < wp3 && wp3 < wp)); BOOST_TEST(wp2 < wp3 || wp3 < wp2); BOOST_TEST(!(wp2 < wp3 && wp3 < wp2)); boost::weak_ptr wp4(wp2); BOOST_TEST(wp4 < wp3 || wp3 < wp4); BOOST_TEST(!(wp4 < wp3 && wp3 < wp4)); } } { boost::shared_ptr sp(new X); boost::shared_ptr sp2(sp); boost::weak_ptr wp(sp); boost::weak_ptr wp2(sp2); BOOST_TEST(!(wp < wp2 || wp2 < wp)); BOOST_TEST(!(wp < wp2 && wp2 < wp)); bool b1 = wp < wp2; bool b2 = wp2 < wp; { boost::weak_ptr wp3(wp); BOOST_TEST(!(wp < wp3 || wp3 < wp)); BOOST_TEST(!(wp < wp3 && wp3 < wp)); BOOST_TEST(!(wp2 < wp3 || wp3 < wp2)); BOOST_TEST(!(wp2 < wp3 && wp3 < wp2)); boost::weak_ptr wp4(wp2); BOOST_TEST(!(wp4 < wp3 || wp3 < wp4)); BOOST_TEST(!(wp4 < wp3 && wp3 < wp4)); } sp.reset(); sp2.reset(); BOOST_TEST(b1 == (wp < wp2)); BOOST_TEST(b2 == (wp2 < wp)); { boost::weak_ptr wp3(wp); BOOST_TEST(!(wp < wp3 || wp3 < wp)); BOOST_TEST(!(wp < wp3 && wp3 < wp)); BOOST_TEST(!(wp2 < wp3 || wp3 < wp2)); BOOST_TEST(!(wp2 < wp3 && wp3 < wp2)); boost::weak_ptr wp4(wp2); BOOST_TEST(!(wp4 < wp3 || wp3 < wp4)); BOOST_TEST(!(wp4 < wp3 && wp3 < wp4)); } } { boost::shared_ptr spx(new X); boost::shared_ptr spy(new Y); boost::shared_ptr spz(new Z); boost::weak_ptr px(spx); boost::weak_ptr py(spy); boost::weak_ptr pz(spz); BOOST_TEST(px < py || py < px); BOOST_TEST(px < pz || pz < px); BOOST_TEST(py < pz || pz < py); BOOST_TEST(!(px < py && py < px)); BOOST_TEST(!(px < pz && pz < px)); BOOST_TEST(!(py < pz && pz < py)); boost::weak_ptr pvx(px); BOOST_TEST(!(pvx < pvx)); boost::weak_ptr pvy(py); BOOST_TEST(!(pvy < pvy)); boost::weak_ptr pvz(pz); BOOST_TEST(!(pvz < pvz)); BOOST_TEST(pvx < pvy || pvy < pvx); BOOST_TEST(pvx < pvz || pvz < pvx); BOOST_TEST(pvy < pvz || pvz < pvy); BOOST_TEST(!(pvx < pvy && pvy < pvx)); BOOST_TEST(!(pvx < pvz && pvz < pvx)); BOOST_TEST(!(pvy < pvz && pvz < pvy)); spx.reset(); spy.reset(); spz.reset(); BOOST_TEST(px < py || py < px); BOOST_TEST(px < pz || pz < px); BOOST_TEST(py < pz || pz < py); BOOST_TEST(!(px < py && py < px)); BOOST_TEST(!(px < pz && pz < px)); BOOST_TEST(!(py < pz && pz < py)); BOOST_TEST(!(pvx < pvx)); BOOST_TEST(!(pvy < pvy)); BOOST_TEST(!(pvz < pvz)); BOOST_TEST(pvx < pvy || pvy < pvx); BOOST_TEST(pvx < pvz || pvz < pvx); BOOST_TEST(pvy < pvz || pvz < pvy); BOOST_TEST(!(pvx < pvy && pvy < pvx)); BOOST_TEST(!(pvx < pvz && pvz < pvx)); BOOST_TEST(!(pvy < pvz && pvz < pvy)); } { boost::shared_ptr spz(new Z); boost::shared_ptr spx(spz); boost::weak_ptr pz(spz); boost::weak_ptr px(spx); boost::weak_ptr py(spz); BOOST_TEST(!(px < px)); BOOST_TEST(!(py < py)); BOOST_TEST(!(px < py || py < px)); BOOST_TEST(!(px < pz || pz < px)); BOOST_TEST(!(py < pz || pz < py)); boost::weak_ptr pvx(px); boost::weak_ptr pvy(py); boost::weak_ptr pvz(pz); BOOST_TEST(!(pvx < pvy || pvy < pvx)); BOOST_TEST(!(pvx < pvz || pvz < pvx)); BOOST_TEST(!(pvy < pvz || pvz < pvy)); spx.reset(); spz.reset(); BOOST_TEST(!(px < px)); BOOST_TEST(!(py < py)); BOOST_TEST(!(px < py || py < px)); BOOST_TEST(!(px < pz || pz < px)); BOOST_TEST(!(py < pz || pz < py)); BOOST_TEST(!(pvx < pvy || pvy < pvx)); BOOST_TEST(!(pvx < pvz || pvz < pvx)); BOOST_TEST(!(pvy < pvz || pvz < pvy)); } } } // namespace n_comparison namespace n_lock { void test() { } } // namespace n_lock namespace n_map { void test() { std::vector< boost::shared_ptr > vi; { boost::shared_ptr pi1(new int); boost::shared_ptr pi2(new int); boost::shared_ptr pi3(new int); vi.push_back(pi1); vi.push_back(pi1); vi.push_back(pi1); vi.push_back(pi2); vi.push_back(pi1); vi.push_back(pi2); vi.push_back(pi1); vi.push_back(pi3); vi.push_back(pi3); vi.push_back(pi2); vi.push_back(pi1); } std::vector< boost::shared_ptr > vx; { boost::shared_ptr px1(new X); boost::shared_ptr px2(new X); boost::shared_ptr px3(new X); vx.push_back(px2); vx.push_back(px2); vx.push_back(px1); vx.push_back(px2); vx.push_back(px1); vx.push_back(px1); vx.push_back(px1); vx.push_back(px2); vx.push_back(px1); vx.push_back(px3); vx.push_back(px2); } std::map< boost::weak_ptr, long > m; { for(std::vector< boost::shared_ptr >::iterator i = vi.begin(); i != vi.end(); ++i) { ++m[*i]; } } { for(std::vector< boost::shared_ptr >::iterator i = vx.begin(); i != vx.end(); ++i) { ++m[*i]; } } { for(std::map< boost::weak_ptr, long >::iterator i = m.begin(); i != m.end(); ++i) { BOOST_TEST(i->first.use_count() == i->second); } } } } // namespace n_map int main() { n_element_type::test(); n_constructors::test(); n_assignment::test(); n_reset::test(); n_use_count::test(); n_swap::test(); n_comparison::test(); n_lock::test(); n_map::test(); return boost::report_errors(); } class incomplete { }; boost::shared_ptr create_incomplete() { boost::shared_ptr px(new incomplete); return px; }