]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/smart_ptr/test/weak_ptr_alias_move_test.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / smart_ptr / test / weak_ptr_alias_move_test.cpp
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