1// make_shared_const_test.cpp
2//
3// Copyright 2007-2009, 2018 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 const> pi = boost::make_shared<int const>();
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 const> pi = boost::make_shared<int const>( args: 5 );
68
69 BOOST_TEST( pi.get() != 0 );
70 BOOST_TEST( pi.use_count() == 1 );
71
72 BOOST_TEST( *pi == 5 );
73 }
74
75 BOOST_TEST( X::instances == 0 );
76
77 {
78 boost::shared_ptr<X const> pi = boost::make_shared<X const>();
79 boost::weak_ptr<X const> wp( pi );
80
81 BOOST_TEST( X::instances == 1 );
82 BOOST_TEST( pi.get() != 0 );
83 BOOST_TEST( pi.use_count() == 1 );
84 BOOST_TEST( pi->v == 0 );
85
86 pi.reset();
87
88 BOOST_TEST( X::instances == 0 );
89 }
90
91 {
92 boost::shared_ptr<X const> pi = boost::make_shared_noinit<X const>();
93 boost::weak_ptr<X const> wp( pi );
94
95 BOOST_TEST( X::instances == 1 );
96 BOOST_TEST( pi.get() != 0 );
97 BOOST_TEST( pi.use_count() == 1 );
98 BOOST_TEST( pi->v == 0 );
99
100 pi.reset();
101
102 BOOST_TEST( X::instances == 0 );
103 }
104
105 {
106 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1 );
107 boost::weak_ptr<X const> wp( pi );
108
109 BOOST_TEST( X::instances == 1 );
110 BOOST_TEST( pi.get() != 0 );
111 BOOST_TEST( pi.use_count() == 1 );
112 BOOST_TEST( pi->v == 1 );
113
114 pi.reset();
115
116 BOOST_TEST( X::instances == 0 );
117 }
118
119 {
120 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1, args: 2 );
121 boost::weak_ptr<X const> wp( pi );
122
123 BOOST_TEST( X::instances == 1 );
124 BOOST_TEST( pi.get() != 0 );
125 BOOST_TEST( pi.use_count() == 1 );
126 BOOST_TEST( pi->v == 1+2 );
127
128 pi.reset();
129
130 BOOST_TEST( X::instances == 0 );
131 }
132
133 {
134 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1, args: 2, args: 3 );
135 boost::weak_ptr<X const> wp( pi );
136
137 BOOST_TEST( X::instances == 1 );
138 BOOST_TEST( pi.get() != 0 );
139 BOOST_TEST( pi.use_count() == 1 );
140 BOOST_TEST( pi->v == 1+2+3 );
141
142 pi.reset();
143
144 BOOST_TEST( X::instances == 0 );
145 }
146
147 {
148 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1, args: 2, args: 3, args: 4 );
149 boost::weak_ptr<X const> wp( pi );
150
151 BOOST_TEST( X::instances == 1 );
152 BOOST_TEST( pi.get() != 0 );
153 BOOST_TEST( pi.use_count() == 1 );
154 BOOST_TEST( pi->v == 1+2+3+4 );
155
156 pi.reset();
157
158 BOOST_TEST( X::instances == 0 );
159 }
160
161 {
162 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5 );
163 boost::weak_ptr<X const> wp( pi );
164
165 BOOST_TEST( X::instances == 1 );
166 BOOST_TEST( pi.get() != 0 );
167 BOOST_TEST( pi.use_count() == 1 );
168 BOOST_TEST( pi->v == 1+2+3+4+5 );
169
170 pi.reset();
171
172 BOOST_TEST( X::instances == 0 );
173 }
174
175 {
176 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6 );
177 boost::weak_ptr<X const> wp( pi );
178
179 BOOST_TEST( X::instances == 1 );
180 BOOST_TEST( pi.get() != 0 );
181 BOOST_TEST( pi.use_count() == 1 );
182 BOOST_TEST( pi->v == 1+2+3+4+5+6 );
183
184 pi.reset();
185
186 BOOST_TEST( X::instances == 0 );
187 }
188
189 {
190 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7 );
191 boost::weak_ptr<X const> wp( pi );
192
193 BOOST_TEST( X::instances == 1 );
194 BOOST_TEST( pi.get() != 0 );
195 BOOST_TEST( pi.use_count() == 1 );
196 BOOST_TEST( pi->v == 1+2+3+4+5+6+7 );
197
198 pi.reset();
199
200 BOOST_TEST( X::instances == 0 );
201 }
202
203 {
204 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8 );
205 boost::weak_ptr<X const> wp( pi );
206
207 BOOST_TEST( X::instances == 1 );
208 BOOST_TEST( pi.get() != 0 );
209 BOOST_TEST( pi.use_count() == 1 );
210 BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8 );
211
212 pi.reset();
213
214 BOOST_TEST( X::instances == 0 );
215 }
216
217 {
218 boost::shared_ptr<X const> pi = boost::make_shared<X const>( args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8, args: 9 );
219 boost::weak_ptr<X const> wp( pi );
220
221 BOOST_TEST( X::instances == 1 );
222 BOOST_TEST( pi.get() != 0 );
223 BOOST_TEST( pi.use_count() == 1 );
224 BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8+9 );
225
226 pi.reset();
227
228 BOOST_TEST( X::instances == 0 );
229 }
230
231 return boost::report_errors();
232}
233

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