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 | |
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 | |
34 | boost::shared_ptr<Z> shared_from_this() |
35 | { |
36 | return boost::shared_from( p: this ); |
37 | } |
38 | }; |
39 | |
40 | void null_deleter( void const* ) |
41 | { |
42 | } |
43 | |
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 |