1 | // Tests for boost::signals2::deconstruct_ptr and friends |
---|---|
2 | |
3 | // Copyright Frank Mori Hess 2007-2008. |
4 | // Distributed under the Boost Software License, Version |
5 | // 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
6 | // http://www.boost.org/LICENSE_1_0.txt) |
7 | |
8 | // See http://www.boost.org/libs/signals2 for library home page. |
9 | |
10 | #include <boost/enable_shared_from_this.hpp> |
11 | #include <boost/shared_ptr.hpp> |
12 | #include <boost/signals2/deconstruct.hpp> |
13 | #include <boost/signals2/deconstruct_ptr.hpp> |
14 | #define BOOST_TEST_MODULE deconstruct_test |
15 | #include <boost/test/included/unit_test.hpp> |
16 | |
17 | class X: public boost::signals2::postconstructible { |
18 | public: |
19 | X(): _postconstructed(false) |
20 | {} |
21 | ~X() |
22 | { |
23 | BOOST_CHECK(_postconstructed); |
24 | } |
25 | protected: |
26 | virtual void postconstruct() |
27 | { |
28 | BOOST_CHECK(!_postconstructed); |
29 | _postconstructed = true; |
30 | } |
31 | bool _postconstructed; |
32 | }; |
33 | |
34 | class Y: public boost::signals2::predestructible { |
35 | public: |
36 | Y(): _predestructed(false) |
37 | {} |
38 | ~Y() |
39 | { |
40 | BOOST_CHECK(_predestructed); |
41 | } |
42 | protected: |
43 | virtual void predestruct() |
44 | { |
45 | _predestructed = true; |
46 | } |
47 | bool _predestructed; |
48 | }; |
49 | |
50 | class Z: public X, public Y |
51 | {}; |
52 | |
53 | class by_deconstruct_only: public boost::signals2::postconstructible { |
54 | public: |
55 | ~by_deconstruct_only() |
56 | { |
57 | BOOST_CHECK(_postconstructed); |
58 | } |
59 | int value; |
60 | protected: |
61 | virtual void postconstruct() |
62 | { |
63 | BOOST_CHECK(!_postconstructed); |
64 | _postconstructed = true; |
65 | } |
66 | bool _postconstructed; |
67 | private: |
68 | friend class boost::signals2::deconstruct_access; |
69 | by_deconstruct_only(int value_in): |
70 | value(value_in), _postconstructed(false) |
71 | {} |
72 | }; |
73 | |
74 | namespace mytest |
75 | { |
76 | class A |
77 | { |
78 | public: |
79 | template<typename T> friend |
80 | void adl_postconstruct(const boost::shared_ptr<T> &sp, A *p) |
81 | { |
82 | BOOST_CHECK(!p->_postconstructed); |
83 | p->_postconstructed = true; |
84 | } |
85 | template<typename T> friend |
86 | void adl_postconstruct(const boost::shared_ptr<T> &sp, A *p, int val) |
87 | { |
88 | p->value = val; |
89 | BOOST_CHECK(!p->_postconstructed); |
90 | p->_postconstructed = true; |
91 | } |
92 | friend void adl_predestruct(A *p) |
93 | { |
94 | p->_predestructed = true; |
95 | } |
96 | ~A() |
97 | { |
98 | BOOST_CHECK(_postconstructed); |
99 | BOOST_CHECK(_predestructed); |
100 | } |
101 | int value; |
102 | private: |
103 | friend class boost::signals2::deconstruct_access; |
104 | A(int value_in = 0): |
105 | value(value_in), |
106 | _postconstructed(false), |
107 | _predestructed(false) |
108 | {} |
109 | bool _postconstructed; |
110 | bool _predestructed; |
111 | }; |
112 | } |
113 | |
114 | void deconstruct_ptr_test() |
115 | { |
116 | { |
117 | boost::shared_ptr<X> x = boost::signals2::deconstruct_ptr(ptr: new X); |
118 | } |
119 | { |
120 | boost::shared_ptr<Y> x = boost::signals2::deconstruct_ptr(ptr: new Y); |
121 | } |
122 | { |
123 | boost::shared_ptr<Z> z = boost::signals2::deconstruct_ptr(ptr: new Z); |
124 | } |
125 | } |
126 | |
127 | class deconstructed_esft : public boost::enable_shared_from_this<deconstructed_esft> |
128 | { |
129 | public: |
130 | deconstructed_esft() : x(0) {} |
131 | |
132 | private: |
133 | friend void adl_postconstruct(boost::shared_ptr<void>, deconstructed_esft *) {} |
134 | int x; |
135 | }; |
136 | |
137 | void deconstruct_test() |
138 | { |
139 | { |
140 | boost::shared_ptr<X> x = boost::signals2::deconstruct<X>(); |
141 | } |
142 | { |
143 | boost::shared_ptr<Y> x = boost::signals2::deconstruct<Y>(); |
144 | } |
145 | { |
146 | boost::shared_ptr<Z> z = boost::signals2::deconstruct<Z>(); |
147 | } |
148 | { |
149 | boost::shared_ptr<by_deconstruct_only> a = boost::signals2::deconstruct<by_deconstruct_only>(args: 1); |
150 | BOOST_CHECK(a->value == 1); |
151 | } |
152 | { |
153 | boost::shared_ptr<mytest::A> a = boost::signals2::deconstruct<mytest::A>(args: 1); |
154 | BOOST_CHECK(a->value == 1); |
155 | } |
156 | {// deconstruct const type |
157 | boost::shared_ptr<const mytest::A> a = boost::signals2::deconstruct<const mytest::A>(args: 3); |
158 | BOOST_CHECK(a->value == 3); |
159 | } |
160 | {// passing arguments to postconstructor |
161 | boost::shared_ptr<mytest::A> a = boost::signals2::deconstruct<mytest::A>().postconstruct(args: 2); |
162 | BOOST_CHECK(a->value == 2); |
163 | } |
164 | {// enable_shared_from_this with deconstruct |
165 | boost::shared_ptr<deconstructed_esft> a = boost::signals2::deconstruct<deconstructed_esft>(); |
166 | BOOST_CHECK(!(a->shared_from_this() < a || a < a->shared_from_this())); |
167 | } |
168 | } |
169 | |
170 | BOOST_AUTO_TEST_CASE(test_main) |
171 | { |
172 | deconstruct_ptr_test(); |
173 | deconstruct_test(); |
174 | } |
175 |