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 
XX26     explicit X( int v ): v_( v )
27     {
28     }
29 
~XX30     ~X()
31     {
32         v_ = 0;
33     }
34 };
35 
share_ownership(P1 const & p1,P2 const & p2)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 
main()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 
main()92 int main()
93 {
94     return 0;
95 }
96 
97 #endif
98