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