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