1// make_shared_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/core/lightweight_test.hpp>
10#include <boost/make_shared.hpp>
11#include <boost/shared_ptr.hpp>
12#include <boost/weak_ptr.hpp>
13#include <cstddef>
14
15class X
16{
17private:
18
19 X( X const & );
20 X & operator=( X const & );
21
22 void * operator new( std::size_t n )
23 {
24 // lack of this definition causes link errors on Comeau C++
25 BOOST_ERROR( "private X::new called" );
26 return ::operator new( n );
27 }
28
29 void operator delete( void * p )
30 {
31 // lack of this definition causes link errors on MSVC
32 BOOST_ERROR( "private X::delete called" );
33 ::operator delete( p );
34 }
35
36public:
37
38 static int instances;
39
40 int v;
41
42 explicit X( int a1 = 0, int a2 = 0, int a3 = 0, int a4 = 0, int a5 = 0, int a6 = 0, int a7 = 0, int a8 = 0, int a9 = 0 ): v( a1+a2+a3+a4+a5+a6+a7+a8+a9 )
43 {
44 ++instances;
45 }
46
47 ~X()
48 {
49 --instances;
50 }
51};
52
53int X::instances = 0;
54
55int main()
56{
57 {
58 boost::shared_ptr< int > pi = boost::make_shared< int >();
59
60 BOOST_TEST( pi.get() != 0 );
61 BOOST_TEST( pi.use_count() == 1 );
62
63 BOOST_TEST( *pi == 0 );
64 }
65
66 {
67 boost::shared_ptr< int > pi = boost::make_shared_noinit< int >();
68
69 BOOST_TEST( pi.get() != 0 );
70 BOOST_TEST( pi.use_count() == 1 );
71 }
72
73 {
74 boost::shared_ptr< int > pi = boost::make_shared< int >( args: 5 );
75
76 BOOST_TEST( pi.get() != 0 );
77 BOOST_TEST( pi.use_count() == 1 );
78
79 BOOST_TEST( *pi == 5 );
80 }
81
82 BOOST_TEST( X::instances == 0 );
83
84 {
85 boost::shared_ptr< X > pi = boost::make_shared< X >();
86 boost::weak_ptr<X> wp( pi );
87
88 BOOST_TEST( X::instances == 1 );
89 BOOST_TEST( pi.get() != 0 );
90 BOOST_TEST( pi.use_count() == 1 );
91 BOOST_TEST( pi->v == 0 );
92
93 pi.reset();
94
95 BOOST_TEST( X::instances == 0 );
96 }
97
98 {
99 boost::shared_ptr< X > pi = boost::make_shared_noinit< X >();
100 boost::weak_ptr<X> wp( pi );
101
102 BOOST_TEST( X::instances == 1 );
103 BOOST_TEST( pi.get() != 0 );
104 BOOST_TEST( pi.use_count() == 1 );
105 BOOST_TEST( pi->v == 0 );
106
107 pi.reset();
108
109 BOOST_TEST( X::instances == 0 );
110 }
111
112 {
113 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1 );
114 boost::weak_ptr<X> wp( pi );
115
116 BOOST_TEST( X::instances == 1 );
117 BOOST_TEST( pi.get() != 0 );
118 BOOST_TEST( pi.use_count() == 1 );
119 BOOST_TEST( pi->v == 1 );
120
121 pi.reset();
122
123 BOOST_TEST( X::instances == 0 );
124 }
125
126 {
127 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1, args: 2 );
128 boost::weak_ptr<X> wp( pi );
129
130 BOOST_TEST( X::instances == 1 );
131 BOOST_TEST( pi.get() != 0 );
132 BOOST_TEST( pi.use_count() == 1 );
133 BOOST_TEST( pi->v == 1+2 );
134
135 pi.reset();
136
137 BOOST_TEST( X::instances == 0 );
138 }
139
140 {
141 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1, args: 2, args: 3 );
142 boost::weak_ptr<X> wp( pi );
143
144 BOOST_TEST( X::instances == 1 );
145 BOOST_TEST( pi.get() != 0 );
146 BOOST_TEST( pi.use_count() == 1 );
147 BOOST_TEST( pi->v == 1+2+3 );
148
149 pi.reset();
150
151 BOOST_TEST( X::instances == 0 );
152 }
153
154 {
155 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1, args: 2, args: 3, args: 4 );
156 boost::weak_ptr<X> wp( pi );
157
158 BOOST_TEST( X::instances == 1 );
159 BOOST_TEST( pi.get() != 0 );
160 BOOST_TEST( pi.use_count() == 1 );
161 BOOST_TEST( pi->v == 1+2+3+4 );
162
163 pi.reset();
164
165 BOOST_TEST( X::instances == 0 );
166 }
167
168 {
169 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1, args: 2, args: 3, args: 4, args: 5 );
170 boost::weak_ptr<X> wp( pi );
171
172 BOOST_TEST( X::instances == 1 );
173 BOOST_TEST( pi.get() != 0 );
174 BOOST_TEST( pi.use_count() == 1 );
175 BOOST_TEST( pi->v == 1+2+3+4+5 );
176
177 pi.reset();
178
179 BOOST_TEST( X::instances == 0 );
180 }
181
182 {
183 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6 );
184 boost::weak_ptr<X> wp( pi );
185
186 BOOST_TEST( X::instances == 1 );
187 BOOST_TEST( pi.get() != 0 );
188 BOOST_TEST( pi.use_count() == 1 );
189 BOOST_TEST( pi->v == 1+2+3+4+5+6 );
190
191 pi.reset();
192
193 BOOST_TEST( X::instances == 0 );
194 }
195
196 {
197 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7 );
198 boost::weak_ptr<X> wp( pi );
199
200 BOOST_TEST( X::instances == 1 );
201 BOOST_TEST( pi.get() != 0 );
202 BOOST_TEST( pi.use_count() == 1 );
203 BOOST_TEST( pi->v == 1+2+3+4+5+6+7 );
204
205 pi.reset();
206
207 BOOST_TEST( X::instances == 0 );
208 }
209
210 {
211 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8 );
212 boost::weak_ptr<X> wp( pi );
213
214 BOOST_TEST( X::instances == 1 );
215 BOOST_TEST( pi.get() != 0 );
216 BOOST_TEST( pi.use_count() == 1 );
217 BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8 );
218
219 pi.reset();
220
221 BOOST_TEST( X::instances == 0 );
222 }
223
224 {
225 boost::shared_ptr< X > pi = boost::make_shared< X >( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8, args: 9 );
226 boost::weak_ptr<X> wp( pi );
227
228 BOOST_TEST( X::instances == 1 );
229 BOOST_TEST( pi.get() != 0 );
230 BOOST_TEST( pi.use_count() == 1 );
231 BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8+9 );
232
233 pi.reset();
234
235 BOOST_TEST( X::instances == 0 );
236 }
237
238 return boost::report_errors();
239}
240

source code of boost/libs/smart_ptr/test/make_shared_test.cpp