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