// weak_ptr_alias_test.cpp // // Copyright 2007, 2019 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 // class incomplete; struct X { int v_; explicit X( int v ): v_( v ) { } ~X() { v_ = 0; } }; template bool share_ownership( P1 const& p1, P2 const& p2 ) { return !p1.owner_before( p2 ) && !p2.owner_before( p1 ); } int main() { { boost::shared_ptr p( new double ); float m = 0; boost::weak_ptr p2( p, &m ); BOOST_TEST( p2.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p2 ) ); BOOST_TEST( p2.lock().get() == &m ); { int m2 = 0; boost::weak_ptr p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } { int m2 = 0; boost::weak_ptr p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == &m2 ); } } { boost::shared_ptr p; float m = 0; boost::weak_ptr p2( p, &m ); BOOST_TEST( p2.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p2 ) ); { int m2 = 0; boost::weak_ptr p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr p3( p, &m2 ); BOOST_TEST( p3.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } { int m2 = 0; boost::weak_ptr p3( p2, &m2 ); BOOST_TEST( p3.use_count() == p2.use_count() ); BOOST_TEST( share_ownership( p2, p3 ) ); BOOST_TEST( p3.lock().get() == 0 ); } } { boost::shared_ptr p( new X( 5 ) ); boost::weak_ptr p2( p, &p->v_ ); BOOST_TEST( p2.use_count() == p.use_count() ); BOOST_TEST( share_ownership( p, p2 ) ); BOOST_TEST( p2.lock().get() == &p->v_ ); p.reset(); BOOST_TEST( p2.expired() ); } return boost::report_errors(); }