1 
2 // shared_from_test.cpp
3 //
4 // Copyright 2019 Peter Dimov
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 #include <boost/smart_ptr/enable_shared_from.hpp>
10 #include <boost/shared_ptr.hpp>
11 #include <boost/core/lightweight_test.hpp>
12 
13 //
14 
15 class X
16 {
17 private:
18 
19     int m_;
20 
21 public:
22 
X()23     X(): m_() {}
24 };
25 
26 class Y: public boost::enable_shared_from
27 {
28 };
29 
30 class Z: public X, public Y
31 {
32 public:
33 
shared_from_this()34     boost::shared_ptr<Z> shared_from_this()
35     {
36         return boost::shared_from( this );
37     }
38 };
39 
null_deleter(void const *)40 void null_deleter( void const* )
41 {
42 }
43 
main()44 int main()
45 {
46     boost::shared_ptr<Z> p( new Z );
47 
48     try
49     {
50         boost::shared_ptr<Z> q = p->shared_from_this();
51 
52         BOOST_TEST_EQ( p, q );
53         BOOST_TEST( !( p < q ) && !( q < p ) );
54     }
55     catch( boost::bad_weak_ptr const & )
56     {
57         BOOST_ERROR( "p->shared_from_this() failed" );
58     }
59 
60     Z v2( *p );
61 
62     try
63     {
64         boost::shared_ptr<Z> q = v2.shared_from_this();
65         BOOST_ERROR( "v2.shared_from_this() failed to throw" );
66     }
67     catch( boost::bad_weak_ptr const & )
68     {
69     }
70 
71     *p = Z();
72 
73     try
74     {
75         boost::shared_ptr<Z> q = p->shared_from_this();
76 
77         BOOST_TEST_EQ( p, q );
78         BOOST_TEST( !( p < q ) && !( q < p ) );
79     }
80     catch( boost::bad_weak_ptr const & )
81     {
82         BOOST_ERROR( "p->shared_from_this() threw bad_weak_ptr after *p = Z()" );
83     }
84 
85     {
86         boost::shared_ptr<Z> p2( p.get(), null_deleter );
87     }
88 
89     try
90     {
91         boost::shared_ptr<Z> q = p->shared_from_this();
92 
93         BOOST_TEST_EQ( p, q );
94         BOOST_TEST( !( p < q ) && !( q < p ) );
95     }
96     catch( boost::bad_weak_ptr const& )
97     {
98         BOOST_ERROR( "p->shared_from_this() failed" );
99     }
100 
101     return boost::report_errors();
102 }
103