1 // 2 // weak_ptr_move_test.cpp 3 // 4 // Copyright (c) 2007 Peter Dimov 5 // 6 // Distributed under the Boost Software License, Version 1.0. 7 // See accompanying file LICENSE_1_0.txt or copy at 8 // http://www.boost.org/LICENSE_1_0.txt 9 // 10 11 #include <boost/weak_ptr.hpp> 12 #include <boost/detail/lightweight_test.hpp> 13 #include <utility> 14 15 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) 16 17 struct X 18 { 19 static long instances; 20 XX21 X() 22 { 23 ++instances; 24 } 25 ~XX26 ~X() 27 { 28 --instances; 29 } 30 31 private: 32 33 X( X const & ); 34 X & operator=( X const & ); 35 }; 36 37 long X::instances = 0; 38 main()39int main() 40 { 41 BOOST_TEST( X::instances == 0 ); 42 43 { 44 boost::shared_ptr<X> p_( new X ); 45 boost::weak_ptr<X> p( p_ ); 46 BOOST_TEST( X::instances == 1 ); 47 BOOST_TEST( p.use_count() == 1 ); 48 49 boost::weak_ptr<X> p2( std::move( p ) ); 50 BOOST_TEST( X::instances == 1 ); 51 BOOST_TEST( p2.use_count() == 1 ); 52 BOOST_TEST( p.expired() ); 53 54 boost::weak_ptr<void> p3( std::move( p2 ) ); 55 BOOST_TEST( X::instances == 1 ); 56 BOOST_TEST( p3.use_count() == 1 ); 57 BOOST_TEST( p2.expired() ); 58 59 p_.reset(); 60 BOOST_TEST( X::instances == 0 ); 61 BOOST_TEST( p3.expired() ); 62 } 63 64 { 65 boost::shared_ptr<X> p_( new X ); 66 boost::weak_ptr<X> p( p_ ); 67 BOOST_TEST( X::instances == 1 ); 68 BOOST_TEST( p.use_count() == 1 ); 69 70 boost::weak_ptr<X> p2; 71 p2 = static_cast< boost::weak_ptr<X> && >( p ); 72 BOOST_TEST( X::instances == 1 ); 73 BOOST_TEST( p2.use_count() == 1 ); 74 BOOST_TEST( p.expired() ); 75 76 boost::weak_ptr<void> p3; 77 p3 = std::move( p2 ); 78 BOOST_TEST( X::instances == 1 ); 79 BOOST_TEST( p3.use_count() == 1 ); 80 BOOST_TEST( p2.expired() ); 81 82 p_.reset(); 83 BOOST_TEST( X::instances == 0 ); 84 BOOST_TEST( p3.expired() ); 85 } 86 87 { 88 boost::shared_ptr<X> p_( new X ); 89 boost::weak_ptr<X> p( p_ ); 90 BOOST_TEST( X::instances == 1 ); 91 BOOST_TEST( p.use_count() == 1 ); 92 93 boost::shared_ptr<X> p_2( new X ); 94 boost::weak_ptr<X> p2( p_2 ); 95 BOOST_TEST( X::instances == 2 ); 96 p2 = std::move( p ); 97 BOOST_TEST( X::instances == 2 ); 98 BOOST_TEST( p2.use_count() == 1 ); 99 BOOST_TEST( p.expired() ); 100 BOOST_TEST( p2.lock() != p_2 ); 101 102 boost::shared_ptr<void> p_3( new X ); 103 boost::weak_ptr<void> p3( p_3 ); 104 BOOST_TEST( X::instances == 3 ); 105 p3 = std::move( p2 ); 106 BOOST_TEST( X::instances == 3 ); 107 BOOST_TEST( p3.use_count() == 1 ); 108 BOOST_TEST( p2.expired() ); 109 BOOST_TEST( p3.lock() != p_3 ); 110 } 111 112 return boost::report_errors(); 113 } 114 115 #else // defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) 116 main()117int main() 118 { 119 return 0; 120 } 121 122 #endif 123