1 //  make_shared_esft_test.cpp
2 //
3 //  Copyright 2007-2009 Peter Dimov
4 //
5 //  Distributed under the Boost Software License, Version 1.0.
6 //  See accompanying file LICENSE_1_0.txt or copy at
7 //  http://www.boost.org/LICENSE_1_0.txt
8 
9 #include <boost/detail/lightweight_test.hpp>
10 #include <boost/make_shared.hpp>
11 #include <boost/shared_ptr.hpp>
12 #include <boost/enable_shared_from_this.hpp>
13 
14 class X: public boost::enable_shared_from_this<X>
15 {
16 private:
17 
18     X( X const & );
19     X & operator=( X const & );
20 
21 public:
22 
23     static int instances;
24 
X(int=0,int=0,int=0,int=0,int=0,int=0,int=0,int=0,int=0)25     explicit X( int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0 )
26     {
27         ++instances;
28     }
29 
~X()30     ~X()
31     {
32         --instances;
33     }
34 };
35 
36 int X::instances = 0;
37 
main()38 int main()
39 {
40     BOOST_TEST( X::instances == 0 );
41 
42     {
43         boost::shared_ptr< X > px = boost::make_shared< X >();
44         BOOST_TEST( X::instances == 1 );
45 
46         try
47         {
48             boost::shared_ptr< X > qx = px->shared_from_this();
49 
50             BOOST_TEST( px == qx );
51             BOOST_TEST( !( px < qx ) && !( qx < px ) );
52 
53             px.reset();
54             BOOST_TEST( X::instances == 1 );
55         }
56         catch( boost::bad_weak_ptr const& )
57         {
58             BOOST_ERROR( "px->shared_from_this() failed" );
59         }
60     }
61 
62     BOOST_TEST( X::instances == 0 );
63 
64     {
65         boost::shared_ptr< X > px = boost::make_shared< X >( 1 );
66         BOOST_TEST( X::instances == 1 );
67 
68         try
69         {
70             boost::shared_ptr< X > qx = px->shared_from_this();
71 
72             BOOST_TEST( px == qx );
73             BOOST_TEST( !( px < qx ) && !( qx < px ) );
74 
75             px.reset();
76             BOOST_TEST( X::instances == 1 );
77         }
78         catch( boost::bad_weak_ptr const& )
79         {
80             BOOST_ERROR( "px->shared_from_this() failed" );
81         }
82     }
83 
84     BOOST_TEST( X::instances == 0 );
85 
86     {
87         boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2 );
88         BOOST_TEST( X::instances == 1 );
89 
90         try
91         {
92             boost::shared_ptr< X > qx = px->shared_from_this();
93 
94             BOOST_TEST( px == qx );
95             BOOST_TEST( !( px < qx ) && !( qx < px ) );
96 
97             px.reset();
98             BOOST_TEST( X::instances == 1 );
99         }
100         catch( boost::bad_weak_ptr const& )
101         {
102             BOOST_ERROR( "px->shared_from_this() failed" );
103         }
104     }
105 
106     BOOST_TEST( X::instances == 0 );
107 
108     {
109         boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3 );
110         BOOST_TEST( X::instances == 1 );
111 
112         try
113         {
114             boost::shared_ptr< X > qx = px->shared_from_this();
115 
116             BOOST_TEST( px == qx );
117             BOOST_TEST( !( px < qx ) && !( qx < px ) );
118 
119             px.reset();
120             BOOST_TEST( X::instances == 1 );
121         }
122         catch( boost::bad_weak_ptr const& )
123         {
124             BOOST_ERROR( "px->shared_from_this() failed" );
125         }
126     }
127 
128     BOOST_TEST( X::instances == 0 );
129 
130     {
131         boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4 );
132         BOOST_TEST( X::instances == 1 );
133 
134         try
135         {
136             boost::shared_ptr< X > qx = px->shared_from_this();
137 
138             BOOST_TEST( px == qx );
139             BOOST_TEST( !( px < qx ) && !( qx < px ) );
140 
141             px.reset();
142             BOOST_TEST( X::instances == 1 );
143         }
144         catch( boost::bad_weak_ptr const& )
145         {
146             BOOST_ERROR( "px->shared_from_this() failed" );
147         }
148     }
149 
150     BOOST_TEST( X::instances == 0 );
151 
152     {
153         boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5 );
154         BOOST_TEST( X::instances == 1 );
155 
156         try
157         {
158             boost::shared_ptr< X > qx = px->shared_from_this();
159 
160             BOOST_TEST( px == qx );
161             BOOST_TEST( !( px < qx ) && !( qx < px ) );
162 
163             px.reset();
164             BOOST_TEST( X::instances == 1 );
165         }
166         catch( boost::bad_weak_ptr const& )
167         {
168             BOOST_ERROR( "px->shared_from_this() failed" );
169         }
170     }
171 
172     BOOST_TEST( X::instances == 0 );
173 
174     {
175         boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5, 6 );
176         BOOST_TEST( X::instances == 1 );
177 
178         try
179         {
180             boost::shared_ptr< X > qx = px->shared_from_this();
181 
182             BOOST_TEST( px == qx );
183             BOOST_TEST( !( px < qx ) && !( qx < px ) );
184 
185             px.reset();
186             BOOST_TEST( X::instances == 1 );
187         }
188         catch( boost::bad_weak_ptr const& )
189         {
190             BOOST_ERROR( "px->shared_from_this() failed" );
191         }
192     }
193 
194     BOOST_TEST( X::instances == 0 );
195 
196     {
197         boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7 );
198         BOOST_TEST( X::instances == 1 );
199 
200         try
201         {
202             boost::shared_ptr< X > qx = px->shared_from_this();
203 
204             BOOST_TEST( px == qx );
205             BOOST_TEST( !( px < qx ) && !( qx < px ) );
206 
207             px.reset();
208             BOOST_TEST( X::instances == 1 );
209         }
210         catch( boost::bad_weak_ptr const& )
211         {
212             BOOST_ERROR( "px->shared_from_this() failed" );
213         }
214     }
215 
216     BOOST_TEST( X::instances == 0 );
217 
218     {
219         boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7, 8 );
220         BOOST_TEST( X::instances == 1 );
221 
222         try
223         {
224             boost::shared_ptr< X > qx = px->shared_from_this();
225 
226             BOOST_TEST( px == qx );
227             BOOST_TEST( !( px < qx ) && !( qx < px ) );
228 
229             px.reset();
230             BOOST_TEST( X::instances == 1 );
231         }
232         catch( boost::bad_weak_ptr const& )
233         {
234             BOOST_ERROR( "px->shared_from_this() failed" );
235         }
236     }
237 
238     BOOST_TEST( X::instances == 0 );
239 
240     {
241         boost::shared_ptr< X > px = boost::make_shared< X >( 1, 2, 3, 4, 5, 6, 7, 8, 9 );
242         BOOST_TEST( X::instances == 1 );
243 
244         try
245         {
246             boost::shared_ptr< X > qx = px->shared_from_this();
247 
248             BOOST_TEST( px == qx );
249             BOOST_TEST( !( px < qx ) && !( qx < px ) );
250 
251             px.reset();
252             BOOST_TEST( X::instances == 1 );
253         }
254         catch( boost::bad_weak_ptr const& )
255         {
256             BOOST_ERROR( "px->shared_from_this() failed" );
257         }
258     }
259 
260     BOOST_TEST( X::instances == 0 );
261 
262     return boost::report_errors();
263 }
264