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
20class incomplete;
21
22struct 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
36template<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
41int 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
92int main()
93{
94 return 0;
95}
96
97#endif
98

source code of boost/libs/smart_ptr/test/weak_ptr_alias_move_test.cpp