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()89 int 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