Initialize boost git in 2.0_beta.
[external/boost.git] / libs / smart_ptr / test / shared_ptr_move_test.cpp
1 //
2 //  shared_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/shared_ptr.hpp>
12 #include <boost/detail/lightweight_test.hpp>
13
14 #if defined( BOOST_HAS_RVALUE_REFS )
15
16 struct X
17 {
18     static long instances;
19
20     X()
21     {
22         ++instances;
23     }
24
25     ~X()
26     {
27         --instances;
28     }
29
30 private:
31
32     X( X const & );
33     X & operator=( X const & );
34 };
35
36 long X::instances = 0;
37
38 int main()
39 {
40     BOOST_TEST( X::instances == 0 );
41
42     {
43         boost::shared_ptr<X> p( new X );
44         BOOST_TEST( X::instances == 1 );
45
46         boost::shared_ptr<X> p2( std::move( p ) );
47         BOOST_TEST( X::instances == 1 );
48         BOOST_TEST( p.get() == 0 );
49
50         boost::shared_ptr<void> p3( std::move( p2 ) );
51         BOOST_TEST( X::instances == 1 );
52         BOOST_TEST( p2.get() == 0 );
53
54         p3.reset();
55         BOOST_TEST( X::instances == 0 );
56     }
57
58     {
59         boost::shared_ptr<X> p( new X );
60         BOOST_TEST( X::instances == 1 );
61
62         boost::shared_ptr<X> p2;
63         p2 = std::move( p );
64         BOOST_TEST( X::instances == 1 );
65         BOOST_TEST( p.get() == 0 );
66
67         boost::shared_ptr<void> p3;
68         p3 = std::move( p2 );
69         BOOST_TEST( X::instances == 1 );
70         BOOST_TEST( p2.get() == 0 );
71
72         p3.reset();
73         BOOST_TEST( X::instances == 0 );
74     }
75
76     {
77         boost::shared_ptr<X> p( new X );
78         BOOST_TEST( X::instances == 1 );
79
80         boost::shared_ptr<X> p2( new X );
81         BOOST_TEST( X::instances == 2 );
82         p2 = std::move( p );
83         BOOST_TEST( X::instances == 1 );
84         BOOST_TEST( p.get() == 0 );
85
86         boost::shared_ptr<void> p3( new X );
87         BOOST_TEST( X::instances == 2 );
88         p3 = std::move( p2 );
89         BOOST_TEST( X::instances == 1 );
90         BOOST_TEST( p2.get() == 0 );
91
92         p3.reset();
93         BOOST_TEST( X::instances == 0 );
94     }
95
96     return boost::report_errors();
97 }
98
99 #else // !defined( BOOST_HAS_RVALUE_REFS )
100
101 int main()
102 {
103     return 0;
104 }
105
106 #endif