]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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> | |
f67539c2 TL |
14 | #define BOOST_TEST_MODULE deconstruct_test |
15 | #include <boost/test/included/unit_test.hpp> | |
7c673cae FG |
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(new X); | |
118 | } | |
119 | { | |
120 | boost::shared_ptr<Y> x = boost::signals2::deconstruct_ptr(new Y); | |
121 | } | |
122 | { | |
123 | boost::shared_ptr<Z> z = boost::signals2::deconstruct_ptr(new Z); | |
124 | } | |
125 | } | |
126 | ||
127 | class deconstructed_esft : public boost::enable_shared_from_this<deconstructed_esft> | |
128 | { | |
92f5a8d4 TL |
129 | public: |
130 | deconstructed_esft() : x(0) {} | |
131 | ||
132 | private: | |
133 | friend void adl_postconstruct(boost::shared_ptr<void>, deconstructed_esft *) {} | |
7c673cae FG |
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>(1); | |
150 | BOOST_CHECK(a->value == 1); | |
151 | } | |
152 | { | |
153 | boost::shared_ptr<mytest::A> a = boost::signals2::deconstruct<mytest::A>(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>(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(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 | ||
f67539c2 | 170 | BOOST_AUTO_TEST_CASE(test_main) |
7c673cae FG |
171 | { |
172 | deconstruct_ptr_test(); | |
173 | deconstruct_test(); | |
7c673cae | 174 | } |