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/core/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 |
123 |