1 2 // weak_from_test.cpp 3 // 4 // Copyright 2019 Peter Dimov 5 // 6 // Distributed under the Boost Software License, Version 1.0. 7 // http://www.boost.org/LICENSE_1_0.txt) 8 9 #include <boost/smart_ptr/enable_shared_from.hpp> 10 #include <boost/shared_ptr.hpp> 11 #include <boost/weak_ptr.hpp> 12 #include <boost/core/lightweight_test.hpp> 13 14 // 15 16 class X 17 { 18 private: 19 20 int m_; 21 22 public: 23 X()24 X(): m_() {} 25 }; 26 27 class Y: public boost::enable_shared_from 28 { 29 }; 30 31 class Z: public X, public Y 32 { 33 public: 34 weak_from_this()35 boost::weak_ptr<Z> weak_from_this() 36 { 37 return boost::weak_from( this ); 38 } 39 }; 40 null_deleter(void const *)41void null_deleter( void const* ) 42 { 43 } 44 main()45int main() 46 { 47 boost::shared_ptr<Z> sp( new Z ); 48 boost::weak_ptr<Z> p( sp ); 49 50 { 51 boost::weak_ptr<Z> q = sp->weak_from_this(); 52 53 BOOST_TEST_EQ( p.lock(), q.lock() ); 54 BOOST_TEST( !( p < q ) && !( q < p ) ); 55 } 56 57 Z v2( *sp ); 58 59 { 60 boost::weak_ptr<Z> q = v2.weak_from_this(); 61 BOOST_TEST( q.expired() ); 62 } 63 64 *sp = Z(); 65 66 { 67 boost::weak_ptr<Z> q = sp->weak_from_this(); 68 69 BOOST_TEST_EQ( p.lock(), q.lock() ); 70 BOOST_TEST( !( p < q ) && !( q < p ) ); 71 } 72 73 { 74 boost::shared_ptr<Z> sp2( sp.get(), null_deleter ); 75 } 76 77 { 78 boost::weak_ptr<Z> q = sp->weak_from_this(); 79 80 BOOST_TEST_EQ( p.lock(), q.lock() ); 81 BOOST_TEST( !( p < q ) && !( q < p ) ); 82 } 83 84 { 85 boost::weak_ptr<Z> p2 = sp->weak_from_this(); 86 87 BOOST_TEST( !p.expired() ); 88 BOOST_TEST( !p2.expired() ); 89 90 sp.reset(); 91 92 BOOST_TEST( p.expired() ); 93 BOOST_TEST( p2.expired() ); 94 } 95 96 return boost::report_errors(); 97 } 98