From e8103f9774e72ecf947197e42638c594f2e0a620 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 14 Nov 2012 13:36:44 +0000 Subject: [PATCH] Merge from 57197, 57206, 57423, 57518 did not apply to 'libs' for some reason; update. [SVN r81338] --- test/Jamfile.v2 | 1 + test/enable_shared_from_raw_test.cpp | 39 ++++++++++++++++++++++++++++ test/esft_constructor_test.cpp | 30 ++++++++++----------- 3 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 test/enable_shared_from_raw_test.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 90b3bef..1df2a3e 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -60,6 +60,7 @@ import testing ; [ run sp_recursive_assign_rv_test.cpp ] [ run sp_recursive_assign2_rv_test.cpp ] [ run esft_constructor_test.cpp ] + [ run enable_shared_from_raw_test.cpp ] [ compile-fail auto_ptr_lv_fail.cpp ] [ run atomic_count_test2.cpp ] [ run sp_typeinfo_test.cpp ] diff --git a/test/enable_shared_from_raw_test.cpp b/test/enable_shared_from_raw_test.cpp new file mode 100644 index 0000000..ba95ecc --- /dev/null +++ b/test/enable_shared_from_raw_test.cpp @@ -0,0 +1,39 @@ +#include + +// +// weak_from_raw_test.cpp +// +// Copyright (c) 2009 Frank Mori Hess +// +// 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: public boost::enable_shared_from_raw +{}; + +void basic_weak_from_raw_test() +{ + X *p(new X); + boost::weak_ptr weak = boost::weak_from_raw(p); + BOOST_TEST(weak.expired()); + boost::shared_ptr shared(p); + weak = boost::weak_from_raw(p); + BOOST_TEST(weak.expired() == false); + boost::shared_ptr shared2(weak); + BOOST_TEST((shared < shared2 || shared2 < shared) == false); + BOOST_TEST(shared.get() == p); +} + +int main() +{ + basic_weak_from_raw_test(); + return boost::report_errors(); +} diff --git a/test/esft_constructor_test.cpp b/test/esft_constructor_test.cpp index ced24e2..32a25b5 100644 --- a/test/esft_constructor_test.cpp +++ b/test/esft_constructor_test.cpp @@ -13,14 +13,13 @@ // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // - -#include +#include #include #include #include #include -class X: public boost::enable_shared_from_this2< X > +class X: public boost::enable_shared_from_raw { private: @@ -42,7 +41,7 @@ public: explicit X( int expected, boost::shared_ptr *early_px = 0 ): destroyed_( 0 ), deleted_( 0 ), expected_( expected ) { ++instances; - if( early_px ) *early_px = shared_from_this(); + if( early_px ) *early_px = shared_from_raw(this); } ~X() @@ -75,7 +74,7 @@ bool are_shared_owners(const boost::shared_ptr &a, const boost::shared_ptr return !(a < b) && !(b < a); } -struct Y: public boost::enable_shared_from_this2 +struct Y: public boost::enable_shared_from_raw {}; int main() @@ -87,14 +86,15 @@ int main() X* x = new X( 1, &early_px ); BOOST_TEST( early_px.use_count() > 0 ); BOOST_TEST( boost::get_deleter(early_px) == 0 ); + BOOST_TEST( early_px.get() == x ); boost::shared_ptr px( x, &X::deleter2 ); BOOST_TEST( early_px.use_count() == 2 && px.use_count() == 2 ); BOOST_TEST(are_shared_owners(early_px, px)); px.reset(); BOOST_TEST( early_px.use_count() == 1 ); BOOST_TEST( X::instances == 1 ); - // X::deleter_type *pd = boost::get_deleter(early_px); - // BOOST_TEST(pd && *pd == &X::deleter2 ); + X::deleter_type *pd = boost::get_deleter(early_px); + BOOST_TEST(pd && *pd == &X::deleter2 ); } BOOST_TEST( X::instances == 0 ); @@ -117,7 +117,7 @@ int main() { boost::shared_ptr early_px; - X x( 1, &early_px ); + X x( 2, &early_px ); BOOST_TEST( early_px.use_count() > 0 ); boost::shared_ptr px( &x, &X::deleter ); BOOST_TEST( early_px.use_count() == 2 && px.use_count() == 2 ); @@ -125,13 +125,11 @@ int main() BOOST_TEST( px.use_count() == 1 ); BOOST_TEST( X::instances == 1 ); px.reset(); - try - { - x.shared_from_this(); - BOOST_ERROR("x did not throw bad_weak_ptr"); - } - catch( const boost::bad_weak_ptr & ) - {} + // test reinitialization after all shared_ptr have expired + early_px = shared_from_raw(&x); + px.reset( &x, &X::deleter ); + BOOST_TEST(are_shared_owners(early_px, px)); + early_px.reset(); } BOOST_TEST( X::instances == 0 ); @@ -157,7 +155,7 @@ int main() px.reset(); try { - y.shared_from_this(); + shared_from_raw(&y); } catch( const boost::bad_weak_ptr & ) {