1 | |
2 | // weak_ptr_alias_move_test.cpp |
3 | // |
4 | // Copyright 2007, 2019 Peter Dimov |
5 | // |
6 | // Distributed under the Boost Software License, Version 1.0. (See |
7 | // accompanying file LICENSE_1_0.txt or copy at |
8 | // http://www.boost.org/LICENSE_1_0.txt) |
9 | |
10 | |
11 | #include <boost/core/lightweight_test.hpp> |
12 | #include <boost/weak_ptr.hpp> |
13 | #include <boost/shared_ptr.hpp> |
14 | #include <boost/config.hpp> |
15 | #include <memory> |
16 | #include <cstddef> |
17 | |
18 | #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) |
19 | |
20 | class incomplete; |
21 | |
22 | struct X |
23 | { |
24 | int v_; |
25 | |
26 | explicit X( int v ): v_( v ) |
27 | { |
28 | } |
29 | |
30 | ~X() |
31 | { |
32 | v_ = 0; |
33 | } |
34 | }; |
35 | |
36 | template<class P1, class P2> bool share_ownership( P1 const& p1, P2 const& p2 ) |
37 | { |
38 | return !p1.owner_before( p2 ) && !p2.owner_before( p1 ); |
39 | } |
40 | |
41 | int main() |
42 | { |
43 | { |
44 | boost::shared_ptr<float> p( new float ); |
45 | boost::weak_ptr<float> p2( p ); |
46 | |
47 | int m2 = 0; |
48 | boost::weak_ptr<int const volatile> p3( std::move( p2 ), &m2 ); |
49 | |
50 | BOOST_TEST( p3.use_count() == p.use_count() ); |
51 | BOOST_TEST( share_ownership( p, p3 ) ); |
52 | BOOST_TEST( p3.lock().get() == &m2 ); |
53 | |
54 | BOOST_TEST( p2.empty() ); |
55 | } |
56 | |
57 | { |
58 | boost::shared_ptr<incomplete> p; |
59 | boost::weak_ptr<incomplete> p2( p ); |
60 | |
61 | int m2 = 0; |
62 | boost::weak_ptr<int const volatile> p3( std::move( p2 ), &m2 ); |
63 | |
64 | BOOST_TEST( p3.use_count() == p.use_count() ); |
65 | BOOST_TEST( share_ownership( p, p3 ) ); |
66 | BOOST_TEST( p3.lock().get() == 0 ); |
67 | |
68 | BOOST_TEST( p2.empty() ); |
69 | } |
70 | |
71 | { |
72 | boost::shared_ptr<X> p( new X( 5 ) ); |
73 | boost::weak_ptr<X> p2( p ); |
74 | |
75 | boost::weak_ptr<int const volatile> p3( std::move( p2 ), &p2.lock()->v_ ); |
76 | |
77 | BOOST_TEST( p3.use_count() == p.use_count() ); |
78 | BOOST_TEST( share_ownership( p, p3 ) ); |
79 | BOOST_TEST( p3.lock().get() == &p->v_ ); |
80 | |
81 | BOOST_TEST( p2.empty() ); |
82 | |
83 | p.reset(); |
84 | BOOST_TEST( p3.expired() ); |
85 | } |
86 | |
87 | return boost::report_errors(); |
88 | } |
89 | |
90 | #else // defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) |
91 | |
92 | int main() |
93 | { |
94 | return 0; |
95 | } |
96 | |
97 | #endif |
98 | |