Imported Upstream version 1.57.0
[platform/upstream/boost.git] / libs / smart_ptr / test / weak_ptr_move_test.cpp
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
21     X()
22     {
23         ++instances;
24     }
25
26     ~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
39 int 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
117 int main()
118 {
119     return 0;
120 }
121
122 #endif