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
15 class X
16 {
17 private:
18
19 X( X const & );
20 X & operator=( X const & );
21
operator new(std::size_t n)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
operator delete(void * p)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
36 public:
37
38 static int instances;
39
40 int v;
41
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)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
~X()47 ~X()
48 {
49 --instances;
50 }
51 };
52
53 int X::instances = 0;
54
main()55 int 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>( 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>( 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>( 1, 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>( 1, 2, 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>( 1, 2, 3, 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>( 1, 2, 3, 4, 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>( 1, 2, 3, 4, 5, 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>( 1, 2, 3, 4, 5, 6, 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>( 1, 2, 3, 4, 5, 6, 7, 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>( 1, 2, 3, 4, 5, 6, 7, 8, 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