1 // 2 // sp_recursive_assign_rv_test.cpp 3 // 4 // Copyright 2009 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 12 #include <boost/shared_ptr.hpp> 13 #include <boost/detail/lightweight_test.hpp> 14 15 // 16 17 class X 18 { 19 public: 20 21 static int instances; 22 X()23 X() 24 { 25 ++instances; 26 } 27 ~X()28 ~X() 29 { 30 --instances; 31 } 32 33 private: 34 35 X( X const& ); 36 }; 37 38 int X::instances = 0; 39 40 class Y 41 { 42 public: 43 44 static int instances; 45 Y()46 Y() 47 { 48 ++instances; 49 } 50 ~Y()51 ~Y() 52 { 53 --instances; 54 } 55 56 private: 57 58 Y( Y const& ); 59 }; 60 61 int Y::instances = 0; 62 63 static boost::shared_ptr<void> s_pv; 64 65 class Z 66 { 67 public: 68 69 static int instances; 70 Z()71 Z() 72 { 73 ++instances; 74 } 75 ~Z()76 ~Z() 77 { 78 --instances; 79 s_pv = boost::shared_ptr<void>( new Y ); 80 } 81 82 private: 83 84 Z( Z const& ); 85 }; 86 87 int Z::instances = 0; 88 main()89int main() 90 { 91 BOOST_TEST( X::instances == 0 ); 92 BOOST_TEST( Y::instances == 0 ); 93 BOOST_TEST( Z::instances == 0 ); 94 95 s_pv = boost::shared_ptr<void>( new Z ); 96 97 BOOST_TEST( X::instances == 0 ); 98 BOOST_TEST( Y::instances == 0 ); 99 BOOST_TEST( Z::instances == 1 ); 100 101 s_pv = boost::shared_ptr<void>( new X ); 102 103 BOOST_TEST( X::instances == 0 ); 104 BOOST_TEST( Y::instances == 1 ); 105 BOOST_TEST( Z::instances == 0 ); 106 107 s_pv = boost::shared_ptr<void>(); 108 109 BOOST_TEST( X::instances == 0 ); 110 BOOST_TEST( Y::instances == 0 ); 111 BOOST_TEST( Z::instances == 0 ); 112 113 return boost::report_errors(); 114 } 115