Ticket #4892: boost_make_shared.hpp

File boost_make_shared.hpp, 31.9 KB (added by anonymous, 12 years ago)
Line 
1#ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
2#define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
3
4// make_shared.hpp
5//
6// Copyright (c) 2007, 2008 Peter Dimov
7//
8// Distributed under the Boost Software License, Version 1.0.
9// See accompanying file LICENSE_1_0.txt or copy at
10// http://www.boost.org/LICENSE_1_0.txt
11//
12// See http://www.boost.org/libs/smart_ptr/make_shared.html
13// for documentation.
14
15#include <boost/config.hpp>
16#include <boost/smart_ptr/shared_ptr.hpp>
17#include <boost/type_traits/type_with_alignment.hpp>
18#include <boost/type_traits/alignment_of.hpp>
19#include <cstddef>
20#include <new>
21
22namespace boost
23{
24
25namespace detail
26{
27
28template< std::size_t N, std::size_t A > struct sp_aligned_storage
29{
30 union type
31 {
32 char data_[ N ];
33 typename boost::type_with_alignment< A >::type align_;
34 };
35};
36
37template< class T > class sp_ms_deleter
38{
39private:
40
41 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
42
43 bool initialized_;
44 storage_type storage_;
45
46private:
47
48 void destroy()
49 {
50 if( initialized_ )
51 {
52 reinterpret_cast< T* >( storage_.data_ )->~T();
53 initialized_ = false;
54 }
55 }
56
57public:
58
59 sp_ms_deleter(): initialized_( false )
60 {
61 }
62
63 // optimization: do not copy storage_
64 sp_ms_deleter( sp_ms_deleter const & ): initialized_( false )
65 {
66 }
67
68 ~sp_ms_deleter()
69 {
70 destroy();
71 }
72
73 void operator()( T * )
74 {
75 destroy();
76 }
77
78 void * address()
79 {
80 return storage_.data_;
81 }
82
83 void set_initialized()
84 {
85 initialized_ = true;
86 }
87};
88
89#if defined( BOOST_HAS_RVALUE_REFS )
90
91template< class T > T&& sp_forward( T & t )
92{
93 return static_cast< T&& >( t );
94}
95
96#endif
97
98} // namespace detail
99
100// Zero-argument versions
101//
102// Used even when variadic templates are available because of the new T() vs new T issue
103
104template< class T > boost::shared_ptr< T > make_shared()
105{
106 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
107
108 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
109
110 void * pv = pd->address();
111
112 ::new( pv ) T();
113 pd->set_initialized();
114
115 T * pt2 = static_cast< T* >( pv );
116
117 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
118 return boost::shared_ptr< T >( pt, pt2 );
119}
120
121template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
122{
123 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
124
125 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
126
127 void * pv = pd->address();
128
129 ::new( pv ) T();
130 pd->set_initialized();
131
132 T * pt2 = static_cast< T* >( pv );
133
134 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
135 return boost::shared_ptr< T >( pt, pt2 );
136}
137
138#if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )
139
140// Variadic templates, rvalue reference
141
142template< class T, class Arg1, class... Args > boost::shared_ptr< T > make_shared( Arg1 && arg1, Args && ... args )
143{
144 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
145
146 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
147
148 void * pv = pd->address();
149
150 ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
151 pd->set_initialized();
152
153 T * pt2 = static_cast< T* >( pv );
154
155 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
156 return boost::shared_ptr< T >( pt, pt2 );
157}
158
159template< class T, class A, class Arg1, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Arg1 && arg1, Args && ... args )
160{
161 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
162
163 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
164
165 void * pv = pd->address();
166
167 ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
168 pd->set_initialized();
169
170 T * pt2 = static_cast< T* >( pv );
171
172 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
173 return boost::shared_ptr< T >( pt, pt2 );
174}
175
176#elif defined( BOOST_HAS_RVALUE_REFS )
177
178// For example MSVC 10.0
179
180template< class T, class A1 >
181boost::shared_ptr< T > make_shared( A1 && a1 )
182{
183 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
184
185 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
186
187 void * pv = pd->address();
188
189 ::new( pv ) T(
190 boost::detail::sp_forward<A1>( a1 )
191 );
192
193 pd->set_initialized();
194
195 T * pt2 = static_cast< T* >( pv );
196
197 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
198 return boost::shared_ptr< T >( pt, pt2 );
199}
200
201template< class T, class A, class A1 >
202boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1 )
203{
204 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
205
206 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
207
208 void * pv = pd->address();
209
210 ::new( pv ) T(
211 boost::detail::sp_forward<A1>( a1 )
212 );
213
214 pd->set_initialized();
215
216 T * pt2 = static_cast< T* >( pv );
217
218 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
219 return boost::shared_ptr< T >( pt, pt2 );
220}
221
222template< class T, class A1, class A2 >
223boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2 )
224{
225 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
226
227 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
228
229 void * pv = pd->address();
230
231 ::new( pv ) T(
232 boost::detail::sp_forward<A1>( a1 ),
233 boost::detail::sp_forward<A2>( a2 )
234 );
235
236 pd->set_initialized();
237
238 T * pt2 = static_cast< T* >( pv );
239
240 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
241 return boost::shared_ptr< T >( pt, pt2 );
242}
243
244template< class T, class A, class A1, class A2 >
245boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2 )
246{
247 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
248
249 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
250
251 void * pv = pd->address();
252
253 ::new( pv ) T(
254 boost::detail::sp_forward<A1>( a1 ),
255 boost::detail::sp_forward<A2>( a2 )
256 );
257
258 pd->set_initialized();
259
260 T * pt2 = static_cast< T* >( pv );
261
262 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
263 return boost::shared_ptr< T >( pt, pt2 );
264}
265
266template< class T, class A1, class A2, class A3 >
267boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3 )
268{
269 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
270
271 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
272
273 void * pv = pd->address();
274
275 ::new( pv ) T(
276 boost::detail::sp_forward<A1>( a1 ),
277 boost::detail::sp_forward<A2>( a2 ),
278 boost::detail::sp_forward<A3>( a3 )
279 );
280
281 pd->set_initialized();
282
283 T * pt2 = static_cast< T* >( pv );
284
285 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
286 return boost::shared_ptr< T >( pt, pt2 );
287}
288
289template< class T, class A, class A1, class A2, class A3 >
290boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 )
291{
292 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
293
294 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
295
296 void * pv = pd->address();
297
298 ::new( pv ) T(
299 boost::detail::sp_forward<A1>( a1 ),
300 boost::detail::sp_forward<A2>( a2 ),
301 boost::detail::sp_forward<A3>( a3 )
302 );
303
304 pd->set_initialized();
305
306 T * pt2 = static_cast< T* >( pv );
307
308 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
309 return boost::shared_ptr< T >( pt, pt2 );
310}
311
312template< class T, class A1, class A2, class A3, class A4 >
313boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
314{
315 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
316
317 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
318
319 void * pv = pd->address();
320
321 ::new( pv ) T(
322 boost::detail::sp_forward<A1>( a1 ),
323 boost::detail::sp_forward<A2>( a2 ),
324 boost::detail::sp_forward<A3>( a3 ),
325 boost::detail::sp_forward<A4>( a4 )
326 );
327
328 pd->set_initialized();
329
330 T * pt2 = static_cast< T* >( pv );
331
332 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
333 return boost::shared_ptr< T >( pt, pt2 );
334}
335
336template< class T, class A, class A1, class A2, class A3, class A4 >
337boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
338{
339 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
340
341 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
342
343 void * pv = pd->address();
344
345 ::new( pv ) T(
346 boost::detail::sp_forward<A1>( a1 ),
347 boost::detail::sp_forward<A2>( a2 ),
348 boost::detail::sp_forward<A3>( a3 ),
349 boost::detail::sp_forward<A4>( a4 )
350 );
351
352 pd->set_initialized();
353
354 T * pt2 = static_cast< T* >( pv );
355
356 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
357 return boost::shared_ptr< T >( pt, pt2 );
358}
359
360template< class T, class A1, class A2, class A3, class A4, class A5 >
361boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
362{
363 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
364
365 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
366
367 void * pv = pd->address();
368
369 ::new( pv ) T(
370 boost::detail::sp_forward<A1>( a1 ),
371 boost::detail::sp_forward<A2>( a2 ),
372 boost::detail::sp_forward<A3>( a3 ),
373 boost::detail::sp_forward<A4>( a4 ),
374 boost::detail::sp_forward<A5>( a5 )
375 );
376
377 pd->set_initialized();
378
379 T * pt2 = static_cast< T* >( pv );
380
381 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
382 return boost::shared_ptr< T >( pt, pt2 );
383}
384
385template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
386boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
387{
388 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
389
390 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
391
392 void * pv = pd->address();
393
394 ::new( pv ) T(
395 boost::detail::sp_forward<A1>( a1 ),
396 boost::detail::sp_forward<A2>( a2 ),
397 boost::detail::sp_forward<A3>( a3 ),
398 boost::detail::sp_forward<A4>( a4 ),
399 boost::detail::sp_forward<A5>( a5 )
400 );
401
402 pd->set_initialized();
403
404 T * pt2 = static_cast< T* >( pv );
405
406 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
407 return boost::shared_ptr< T >( pt, pt2 );
408}
409
410template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
411boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
412{
413 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
414
415 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
416
417 void * pv = pd->address();
418
419 ::new( pv ) T(
420 boost::detail::sp_forward<A1>( a1 ),
421 boost::detail::sp_forward<A2>( a2 ),
422 boost::detail::sp_forward<A3>( a3 ),
423 boost::detail::sp_forward<A4>( a4 ),
424 boost::detail::sp_forward<A5>( a5 ),
425 boost::detail::sp_forward<A6>( a6 )
426 );
427
428 pd->set_initialized();
429
430 T * pt2 = static_cast< T* >( pv );
431
432 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
433 return boost::shared_ptr< T >( pt, pt2 );
434}
435
436template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
437boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
438{
439 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
440
441 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
442
443 void * pv = pd->address();
444
445 ::new( pv ) T(
446 boost::detail::sp_forward<A1>( a1 ),
447 boost::detail::sp_forward<A2>( a2 ),
448 boost::detail::sp_forward<A3>( a3 ),
449 boost::detail::sp_forward<A4>( a4 ),
450 boost::detail::sp_forward<A5>( a5 ),
451 boost::detail::sp_forward<A6>( a6 )
452 );
453
454 pd->set_initialized();
455
456 T * pt2 = static_cast< T* >( pv );
457
458 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
459 return boost::shared_ptr< T >( pt, pt2 );
460}
461
462template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
463boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
464{
465 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
466
467 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
468
469 void * pv = pd->address();
470
471 ::new( pv ) T(
472 boost::detail::sp_forward<A1>( a1 ),
473 boost::detail::sp_forward<A2>( a2 ),
474 boost::detail::sp_forward<A3>( a3 ),
475 boost::detail::sp_forward<A4>( a4 ),
476 boost::detail::sp_forward<A5>( a5 ),
477 boost::detail::sp_forward<A6>( a6 ),
478 boost::detail::sp_forward<A7>( a7 )
479 );
480
481 pd->set_initialized();
482
483 T * pt2 = static_cast< T* >( pv );
484
485 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
486 return boost::shared_ptr< T >( pt, pt2 );
487}
488
489template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
490boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
491{
492 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
493
494 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
495
496 void * pv = pd->address();
497
498 ::new( pv ) T(
499 boost::detail::sp_forward<A1>( a1 ),
500 boost::detail::sp_forward<A2>( a2 ),
501 boost::detail::sp_forward<A3>( a3 ),
502 boost::detail::sp_forward<A4>( a4 ),
503 boost::detail::sp_forward<A5>( a5 ),
504 boost::detail::sp_forward<A6>( a6 ),
505 boost::detail::sp_forward<A7>( a7 )
506 );
507
508 pd->set_initialized();
509
510 T * pt2 = static_cast< T* >( pv );
511
512 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
513 return boost::shared_ptr< T >( pt, pt2 );
514}
515
516template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
517boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
518{
519 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
520
521 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
522
523 void * pv = pd->address();
524
525 ::new( pv ) T(
526 boost::detail::sp_forward<A1>( a1 ),
527 boost::detail::sp_forward<A2>( a2 ),
528 boost::detail::sp_forward<A3>( a3 ),
529 boost::detail::sp_forward<A4>( a4 ),
530 boost::detail::sp_forward<A5>( a5 ),
531 boost::detail::sp_forward<A6>( a6 ),
532 boost::detail::sp_forward<A7>( a7 ),
533 boost::detail::sp_forward<A8>( a8 )
534 );
535
536 pd->set_initialized();
537
538 T * pt2 = static_cast< T* >( pv );
539
540 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
541 return boost::shared_ptr< T >( pt, pt2 );
542}
543
544template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
545boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
546{
547 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
548
549 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
550
551 void * pv = pd->address();
552
553 ::new( pv ) T(
554 boost::detail::sp_forward<A1>( a1 ),
555 boost::detail::sp_forward<A2>( a2 ),
556 boost::detail::sp_forward<A3>( a3 ),
557 boost::detail::sp_forward<A4>( a4 ),
558 boost::detail::sp_forward<A5>( a5 ),
559 boost::detail::sp_forward<A6>( a6 ),
560 boost::detail::sp_forward<A7>( a7 ),
561 boost::detail::sp_forward<A8>( a8 )
562 );
563
564 pd->set_initialized();
565
566 T * pt2 = static_cast< T* >( pv );
567
568 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
569 return boost::shared_ptr< T >( pt, pt2 );
570}
571
572template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
573boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
574{
575 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
576
577 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
578
579 void * pv = pd->address();
580
581 ::new( pv ) T(
582 boost::detail::sp_forward<A1>( a1 ),
583 boost::detail::sp_forward<A2>( a2 ),
584 boost::detail::sp_forward<A3>( a3 ),
585 boost::detail::sp_forward<A4>( a4 ),
586 boost::detail::sp_forward<A5>( a5 ),
587 boost::detail::sp_forward<A6>( a6 ),
588 boost::detail::sp_forward<A7>( a7 ),
589 boost::detail::sp_forward<A8>( a8 ),
590 boost::detail::sp_forward<A9>( a9 )
591 );
592
593 pd->set_initialized();
594
595 T * pt2 = static_cast< T* >( pv );
596
597 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
598 return boost::shared_ptr< T >( pt, pt2 );
599}
600
601template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
602boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
603{
604 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
605
606 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
607
608 void * pv = pd->address();
609
610 ::new( pv ) T(
611 boost::detail::sp_forward<A1>( a1 ),
612 boost::detail::sp_forward<A2>( a2 ),
613 boost::detail::sp_forward<A3>( a3 ),
614 boost::detail::sp_forward<A4>( a4 ),
615 boost::detail::sp_forward<A5>( a5 ),
616 boost::detail::sp_forward<A6>( a6 ),
617 boost::detail::sp_forward<A7>( a7 ),
618 boost::detail::sp_forward<A8>( a8 ),
619 boost::detail::sp_forward<A9>( a9 )
620 );
621
622 pd->set_initialized();
623
624 T * pt2 = static_cast< T* >( pv );
625
626 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
627 return boost::shared_ptr< T >( pt, pt2 );
628}
629
630#else
631
632// C++03 version
633
634template< class T, class A1 >
635boost::shared_ptr< T > make_shared( A1 const & a1 )
636{
637 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
638
639 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
640
641 void * pv = pd->address();
642
643 ::new( pv ) T( a1 );
644 pd->set_initialized();
645
646 T * pt2 = static_cast< T* >( pv );
647
648 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
649 return boost::shared_ptr< T >( pt, pt2 );
650}
651
652template< class T, class A, class A1 >
653boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 )
654{
655 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
656
657 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
658
659 void * pv = pd->address();
660
661 ::new( pv ) T( a1 );
662 pd->set_initialized();
663
664 T * pt2 = static_cast< T* >( pv );
665
666 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
667 return boost::shared_ptr< T >( pt, pt2 );
668}
669
670template< class T, class A1, class A2 >
671boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 )
672{
673 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
674
675 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
676
677 void * pv = pd->address();
678
679 ::new( pv ) T( a1, a2 );
680 pd->set_initialized();
681
682 T * pt2 = static_cast< T* >( pv );
683
684 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
685 return boost::shared_ptr< T >( pt, pt2 );
686}
687
688template< class T, class A, class A1, class A2 >
689boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2 )
690{
691 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
692
693 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
694
695 void * pv = pd->address();
696
697 ::new( pv ) T( a1, a2 );
698 pd->set_initialized();
699
700 T * pt2 = static_cast< T* >( pv );
701
702 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
703 return boost::shared_ptr< T >( pt, pt2 );
704}
705
706template< class T, class A1, class A2, class A3 >
707boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )
708{
709 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
710
711 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
712
713 void * pv = pd->address();
714
715 ::new( pv ) T( a1, a2, a3 );
716 pd->set_initialized();
717
718 T * pt2 = static_cast< T* >( pv );
719
720 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
721 return boost::shared_ptr< T >( pt, pt2 );
722}
723
724template< class T, class A, class A1, class A2, class A3 >
725boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )
726{
727 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
728
729 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
730
731 void * pv = pd->address();
732
733 ::new( pv ) T( a1, a2, a3 );
734 pd->set_initialized();
735
736 T * pt2 = static_cast< T* >( pv );
737
738 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
739 return boost::shared_ptr< T >( pt, pt2 );
740}
741
742template< class T, class A1, class A2, class A3, class A4 >
743boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
744{
745 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
746
747 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
748
749 void * pv = pd->address();
750
751 ::new( pv ) T( a1, a2, a3, a4 );
752 pd->set_initialized();
753
754 T * pt2 = static_cast< T* >( pv );
755
756 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
757 return boost::shared_ptr< T >( pt, pt2 );
758}
759
760template< class T, class A, class A1, class A2, class A3, class A4 >
761boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
762{
763 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
764
765 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
766
767 void * pv = pd->address();
768
769 ::new( pv ) T( a1, a2, a3, a4 );
770 pd->set_initialized();
771
772 T * pt2 = static_cast< T* >( pv );
773
774 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
775 return boost::shared_ptr< T >( pt, pt2 );
776}
777
778template< class T, class A1, class A2, class A3, class A4, class A5 >
779boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
780{
781 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
782
783 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
784
785 void * pv = pd->address();
786
787 ::new( pv ) T( a1, a2, a3, a4, a5 );
788 pd->set_initialized();
789
790 T * pt2 = static_cast< T* >( pv );
791
792 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
793 return boost::shared_ptr< T >( pt, pt2 );
794}
795
796template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
797boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
798{
799 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
800
801 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
802
803 void * pv = pd->address();
804
805 ::new( pv ) T( a1, a2, a3, a4, a5 );
806 pd->set_initialized();
807
808 T * pt2 = static_cast< T* >( pv );
809
810 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
811 return boost::shared_ptr< T >( pt, pt2 );
812}
813
814template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
815boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
816{
817 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
818
819 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
820
821 void * pv = pd->address();
822
823 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
824 pd->set_initialized();
825
826 T * pt2 = static_cast< T* >( pv );
827
828 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
829 return boost::shared_ptr< T >( pt, pt2 );
830}
831
832template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
833boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
834{
835 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
836
837 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
838
839 void * pv = pd->address();
840
841 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
842 pd->set_initialized();
843
844 T * pt2 = static_cast< T* >( pv );
845
846 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
847 return boost::shared_ptr< T >( pt, pt2 );
848}
849
850template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
851boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
852{
853 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
854
855 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
856
857 void * pv = pd->address();
858
859 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
860 pd->set_initialized();
861
862 T * pt2 = static_cast< T* >( pv );
863
864 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
865 return boost::shared_ptr< T >( pt, pt2 );
866}
867
868template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
869boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
870{
871 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
872
873 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
874
875 void * pv = pd->address();
876
877 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
878 pd->set_initialized();
879
880 T * pt2 = static_cast< T* >( pv );
881
882 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
883 return boost::shared_ptr< T >( pt, pt2 );
884}
885
886template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
887boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
888{
889 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
890
891 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
892
893 void * pv = pd->address();
894
895 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
896 pd->set_initialized();
897
898 T * pt2 = static_cast< T* >( pv );
899
900 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
901 return boost::shared_ptr< T >( pt, pt2 );
902}
903
904template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
905boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
906{
907 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
908
909 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
910
911 void * pv = pd->address();
912
913 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
914 pd->set_initialized();
915
916 T * pt2 = static_cast< T* >( pv );
917
918 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
919 return boost::shared_ptr< T >( pt, pt2 );
920}
921
922template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
923boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
924{
925 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >() );
926
927 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
928
929 void * pv = pd->address();
930
931 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
932 pd->set_initialized();
933
934 T * pt2 = static_cast< T* >( pv );
935
936 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
937 return boost::shared_ptr< T >( pt, pt2 );
938}
939
940template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
941boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
942{
943 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_ms_deleter< T >(), a );
944
945 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
946
947 void * pv = pd->address();
948
949 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
950 pd->set_initialized();
951
952 T * pt2 = static_cast< T* >( pv );
953
954 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
955 return boost::shared_ptr< T >( pt, pt2 );
956}
957
958#endif
959
960} // namespace boost
961
962#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED