1// allocate_shared_alloc11_test.cpp
2//
3// allocate_shared with a minimal C++11 allocator
4//
5// Copyright 2007-2009, 2014 Peter Dimov
6//
7// Distributed under the Boost Software License, Version 1.0.
8// See accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt
10
11#include <boost/core/lightweight_test.hpp>
12#include <boost/make_shared.hpp>
13#include <boost/shared_ptr.hpp>
14#include <boost/weak_ptr.hpp>
15#include <boost/config.hpp>
16#include <cstddef>
17
18#if !defined( BOOST_NO_CXX11_ALLOCATOR )
19
20template< class T > class cxx11_allocator
21{
22public:
23
24 typedef T value_type;
25
26 cxx11_allocator()
27 {
28 }
29
30 template< class Y > cxx11_allocator( cxx11_allocator<Y> const & )
31 {
32 }
33
34 T * allocate( std::size_t n )
35 {
36 return static_cast< T* >( ::operator new( n * sizeof( T ) ) );
37 }
38
39 void deallocate( T * p, std::size_t n )
40 {
41 ::operator delete( p );
42 }
43};
44
45class X
46{
47private:
48
49 X( X const & );
50 X & operator=( X const & );
51
52 void * operator new( std::size_t n )
53 {
54 BOOST_ERROR( "private X::new called" );
55 return ::operator new( n );
56 }
57
58 void operator delete( void * p )
59 {
60 BOOST_ERROR( "private X::delete called" );
61 ::operator delete( p );
62 }
63
64public:
65
66 static int instances;
67
68 int v;
69
70 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 )
71 {
72 ++instances;
73 }
74
75 ~X()
76 {
77 --instances;
78 }
79};
80
81int X::instances = 0;
82
83int main()
84{
85 {
86 boost::shared_ptr< int > pi = boost::allocate_shared< int >( a: cxx11_allocator<int>() );
87
88 BOOST_TEST( pi.get() != 0 );
89 BOOST_TEST( *pi == 0 );
90 }
91
92 {
93 boost::shared_ptr< int > pi = boost::allocate_shared< int >( a: cxx11_allocator<int>(), args: 5 );
94
95 BOOST_TEST( pi.get() != 0 );
96 BOOST_TEST( *pi == 5 );
97 }
98
99 BOOST_TEST( X::instances == 0 );
100
101 {
102 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>() );
103 boost::weak_ptr<X> wp( pi );
104
105 BOOST_TEST( X::instances == 1 );
106 BOOST_TEST( pi.get() != 0 );
107 BOOST_TEST( pi->v == 0 );
108
109 pi.reset();
110
111 BOOST_TEST( X::instances == 0 );
112 }
113
114 {
115 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>(), args: 1 );
116 boost::weak_ptr<X> wp( pi );
117
118 BOOST_TEST( X::instances == 1 );
119 BOOST_TEST( pi.get() != 0 );
120 BOOST_TEST( pi->v == 1 );
121
122 pi.reset();
123
124 BOOST_TEST( X::instances == 0 );
125 }
126
127 {
128 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>(), args: 1, args: 2 );
129 boost::weak_ptr<X> wp( pi );
130
131 BOOST_TEST( X::instances == 1 );
132 BOOST_TEST( pi.get() != 0 );
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::allocate_shared< X >( a: cxx11_allocator<void>(), 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->v == 1+2+3 );
147
148 pi.reset();
149
150 BOOST_TEST( X::instances == 0 );
151 }
152
153 {
154 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>(), args: 1, args: 2, args: 3, args: 4 );
155 boost::weak_ptr<X> wp( pi );
156
157 BOOST_TEST( X::instances == 1 );
158 BOOST_TEST( pi.get() != 0 );
159 BOOST_TEST( pi->v == 1+2+3+4 );
160
161 pi.reset();
162
163 BOOST_TEST( X::instances == 0 );
164 }
165
166 {
167 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5 );
168 boost::weak_ptr<X> wp( pi );
169
170 BOOST_TEST( X::instances == 1 );
171 BOOST_TEST( pi.get() != 0 );
172 BOOST_TEST( pi->v == 1+2+3+4+5 );
173
174 pi.reset();
175
176 BOOST_TEST( X::instances == 0 );
177 }
178
179 {
180 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5, args: 6 );
181 boost::weak_ptr<X> wp( pi );
182
183 BOOST_TEST( X::instances == 1 );
184 BOOST_TEST( pi.get() != 0 );
185 BOOST_TEST( pi->v == 1+2+3+4+5+6 );
186
187 pi.reset();
188
189 BOOST_TEST( X::instances == 0 );
190 }
191
192 {
193 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7 );
194 boost::weak_ptr<X> wp( pi );
195
196 BOOST_TEST( X::instances == 1 );
197 BOOST_TEST( pi.get() != 0 );
198 BOOST_TEST( pi->v == 1+2+3+4+5+6+7 );
199
200 pi.reset();
201
202 BOOST_TEST( X::instances == 0 );
203 }
204
205 {
206 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8 );
207 boost::weak_ptr<X> wp( pi );
208
209 BOOST_TEST( X::instances == 1 );
210 BOOST_TEST( pi.get() != 0 );
211 BOOST_TEST( pi->v == 1+2+3+4+5+6+7+8 );
212
213 pi.reset();
214
215 BOOST_TEST( X::instances == 0 );
216 }
217
218 {
219 boost::shared_ptr< X > pi = boost::allocate_shared< X >( a: cxx11_allocator<void>(), args: 1, args: 2, args: 3, args: 4, args: 5, args: 6, args: 7, args: 8, args: 9 );
220 boost::weak_ptr<X> wp( pi );
221
222 BOOST_TEST( X::instances == 1 );
223 BOOST_TEST( pi.get() != 0 );
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
234#else // !defined( BOOST_NO_CXX11_ALLOCATOR )
235
236int main()
237{
238 return 0;
239}
240
241#endif
242

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