1 #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
2 #define BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
3
4 // make_shared_object.hpp
5 //
6 // Copyright (c) 2007, 2008, 2012 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/smart_ptr/detail/sp_forward.hpp>
18 #include <boost/type_traits/type_with_alignment.hpp>
19 #include <boost/type_traits/alignment_of.hpp>
20 #include <cstddef>
21 #include <new>
22
23 namespace boost
24 {
25
26 namespace detail
27 {
28
29 template< std::size_t N, std::size_t A > struct sp_aligned_storage
30 {
31 union type
32 {
33 char data_[ N ];
34 typename boost::type_with_alignment< A >::type align_;
35 };
36 };
37
38 template< class T > class sp_ms_deleter
39 {
40 private:
41
42 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
43
44 bool initialized_;
45 storage_type storage_;
46
47 private:
48
destroy()49 void destroy()
50 {
51 if( initialized_ )
52 {
53 #if defined( __GNUC__ )
54
55 // fixes incorrect aliasing warning
56 T * p = reinterpret_cast< T* >( storage_.data_ );
57 p->~T();
58
59 #else
60
61 reinterpret_cast< T* >( storage_.data_ )->~T();
62
63 #endif
64
65 initialized_ = false;
66 }
67 }
68
69 public:
70
sp_ms_deleter()71 sp_ms_deleter() BOOST_NOEXCEPT : initialized_( false )
72 {
73 }
74
sp_ms_deleter(A const &)75 template<class A> explicit sp_ms_deleter( A const & ) BOOST_NOEXCEPT : initialized_( false )
76 {
77 }
78
79 // optimization: do not copy storage_
sp_ms_deleter(sp_ms_deleter const &)80 sp_ms_deleter( sp_ms_deleter const & ) BOOST_NOEXCEPT : initialized_( false )
81 {
82 }
83
~sp_ms_deleter()84 ~sp_ms_deleter()
85 {
86 destroy();
87 }
88
operator ()(T *)89 void operator()( T * )
90 {
91 destroy();
92 }
93
operator_fn(T *)94 static void operator_fn( T* ) // operator() can't be static
95 {
96 }
97
address()98 void * address() BOOST_NOEXCEPT
99 {
100 return storage_.data_;
101 }
102
set_initialized()103 void set_initialized() BOOST_NOEXCEPT
104 {
105 initialized_ = true;
106 }
107 };
108
109 template< class T, class A > class sp_as_deleter
110 {
111 private:
112
113 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
114
115 storage_type storage_;
116 A a_;
117 bool initialized_;
118
119 private:
120
destroy()121 void destroy()
122 {
123 if( initialized_ )
124 {
125 T * p = reinterpret_cast< T* >( storage_.data_ );
126
127 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
128
129 std::allocator_traits<A>::destroy( a_, p );
130
131 #else
132
133 p->~T();
134
135 #endif
136
137 initialized_ = false;
138 }
139 }
140
141 public:
142
sp_as_deleter(A const & a)143 sp_as_deleter( A const & a ) BOOST_NOEXCEPT : a_( a ), initialized_( false )
144 {
145 }
146
147 // optimization: do not copy storage_
sp_as_deleter(sp_as_deleter const & r)148 sp_as_deleter( sp_as_deleter const & r ) BOOST_NOEXCEPT : a_( r.a_), initialized_( false )
149 {
150 }
151
~sp_as_deleter()152 ~sp_as_deleter()
153 {
154 destroy();
155 }
156
operator ()(T *)157 void operator()( T * )
158 {
159 destroy();
160 }
161
operator_fn(T *)162 static void operator_fn( T* ) // operator() can't be static
163 {
164 }
165
address()166 void * address() BOOST_NOEXCEPT
167 {
168 return storage_.data_;
169 }
170
set_initialized()171 void set_initialized() BOOST_NOEXCEPT
172 {
173 initialized_ = true;
174 }
175 };
176
177 template< class T > struct sp_if_not_array
178 {
179 typedef boost::shared_ptr< T > type;
180 };
181
182 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
183
184 template< class T > struct sp_if_not_array< T[] >
185 {
186 };
187
188 #if !defined( __BORLANDC__ ) || !BOOST_WORKAROUND( __BORLANDC__, < 0x600 )
189
190 template< class T, std::size_t N > struct sp_if_not_array< T[N] >
191 {
192 };
193
194 #endif
195
196 #endif
197
198 } // namespace detail
199
200 #if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
201 # define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
202 #else
203 # define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
204 #endif
205
206 // _noinit versions
207
make_shared_noinit()208 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit()
209 {
210 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
211
212 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
213
214 void * pv = pd->address();
215
216 ::new( pv ) T;
217 pd->set_initialized();
218
219 T * pt2 = static_cast< T* >( pv );
220
221 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
222 return boost::shared_ptr< T >( pt, pt2 );
223 }
224
allocate_shared_noinit(A const & a)225 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a )
226 {
227 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
228
229 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
230
231 void * pv = pd->address();
232
233 ::new( pv ) T;
234 pd->set_initialized();
235
236 T * pt2 = static_cast< T* >( pv );
237
238 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
239 return boost::shared_ptr< T >( pt, pt2 );
240 }
241
242 #if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
243
244 // Variadic templates, rvalue reference
245
make_shared(Args &&...args)246 template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
247 {
248 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
249
250 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
251
252 void * pv = pd->address();
253
254 ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
255 pd->set_initialized();
256
257 T * pt2 = static_cast< T* >( pv );
258
259 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
260 return boost::shared_ptr< T >( pt, pt2 );
261 }
262
allocate_shared(A const & a,Args &&...args)263 template< class T, class A, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Args && ... args )
264 {
265 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
266
267 typedef typename std::allocator_traits<A>::template rebind_alloc<T> A2;
268 A2 a2( a );
269
270 typedef boost::detail::sp_as_deleter< T, A2 > D;
271
272 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a2 );
273
274 #else
275
276 typedef boost::detail::sp_ms_deleter< T > D;
277
278 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a );
279
280 #endif
281
282 D * pd = static_cast< D* >( pt._internal_get_untyped_deleter() );
283 void * pv = pd->address();
284
285 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
286
287 std::allocator_traits<A2>::construct( a2, static_cast< T* >( pv ), boost::detail::sp_forward<Args>( args )... );
288
289 #else
290
291 ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
292
293 #endif
294
295 pd->set_initialized();
296
297 T * pt2 = static_cast< T* >( pv );
298
299 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
300 return boost::shared_ptr< T >( pt, pt2 );
301 }
302
303 #else // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
304
305 // Common zero-argument versions
306
make_shared()307 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared()
308 {
309 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
310
311 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
312
313 void * pv = pd->address();
314
315 ::new( pv ) T();
316 pd->set_initialized();
317
318 T * pt2 = static_cast< T* >( pv );
319
320 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
321 return boost::shared_ptr< T >( pt, pt2 );
322 }
323
allocate_shared(A const & a)324 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a )
325 {
326 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
327
328 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
329
330 void * pv = pd->address();
331
332 ::new( pv ) T();
333 pd->set_initialized();
334
335 T * pt2 = static_cast< T* >( pv );
336
337 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
338 return boost::shared_ptr< T >( pt, pt2 );
339 }
340
341 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
342
343 // For example MSVC 10.0
344
345 template< class T, class A1 >
make_shared(A1 && a1)346 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 )
347 {
348 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
349
350 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
351
352 void * pv = pd->address();
353
354 ::new( pv ) T(
355 boost::detail::sp_forward<A1>( a1 )
356 );
357
358 pd->set_initialized();
359
360 T * pt2 = static_cast< T* >( pv );
361
362 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
363 return boost::shared_ptr< T >( pt, pt2 );
364 }
365
366 template< class T, class A, class A1 >
allocate_shared(A const & a,A1 && a1)367 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1 )
368 {
369 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
370
371 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
372
373 void * pv = pd->address();
374
375 ::new( pv ) T(
376 boost::detail::sp_forward<A1>( a1 )
377 );
378
379 pd->set_initialized();
380
381 T * pt2 = static_cast< T* >( pv );
382
383 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
384 return boost::shared_ptr< T >( pt, pt2 );
385 }
386
387 template< class T, class A1, class A2 >
make_shared(A1 && a1,A2 && a2)388 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2 )
389 {
390 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
391
392 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
393
394 void * pv = pd->address();
395
396 ::new( pv ) T(
397 boost::detail::sp_forward<A1>( a1 ),
398 boost::detail::sp_forward<A2>( a2 )
399 );
400
401 pd->set_initialized();
402
403 T * pt2 = static_cast< T* >( pv );
404
405 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
406 return boost::shared_ptr< T >( pt, pt2 );
407 }
408
409 template< class T, class A, class A1, class A2 >
allocate_shared(A const & a,A1 && a1,A2 && a2)410 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2 )
411 {
412 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
413
414 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
415
416 void * pv = pd->address();
417
418 ::new( pv ) T(
419 boost::detail::sp_forward<A1>( a1 ),
420 boost::detail::sp_forward<A2>( a2 )
421 );
422
423 pd->set_initialized();
424
425 T * pt2 = static_cast< T* >( pv );
426
427 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
428 return boost::shared_ptr< T >( pt, pt2 );
429 }
430
431 template< class T, class A1, class A2, class A3 >
make_shared(A1 && a1,A2 && a2,A3 && a3)432 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3 )
433 {
434 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
435
436 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
437
438 void * pv = pd->address();
439
440 ::new( pv ) T(
441 boost::detail::sp_forward<A1>( a1 ),
442 boost::detail::sp_forward<A2>( a2 ),
443 boost::detail::sp_forward<A3>( a3 )
444 );
445
446 pd->set_initialized();
447
448 T * pt2 = static_cast< T* >( pv );
449
450 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
451 return boost::shared_ptr< T >( pt, pt2 );
452 }
453
454 template< class T, class A, class A1, class A2, class A3 >
allocate_shared(A const & a,A1 && a1,A2 && a2,A3 && a3)455 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 )
456 {
457 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
458
459 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
460
461 void * pv = pd->address();
462
463 ::new( pv ) T(
464 boost::detail::sp_forward<A1>( a1 ),
465 boost::detail::sp_forward<A2>( a2 ),
466 boost::detail::sp_forward<A3>( a3 )
467 );
468
469 pd->set_initialized();
470
471 T * pt2 = static_cast< T* >( pv );
472
473 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
474 return boost::shared_ptr< T >( pt, pt2 );
475 }
476
477 template< class T, class A1, class A2, class A3, class A4 >
make_shared(A1 && a1,A2 && a2,A3 && a3,A4 && a4)478 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
479 {
480 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
481
482 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
483
484 void * pv = pd->address();
485
486 ::new( pv ) T(
487 boost::detail::sp_forward<A1>( a1 ),
488 boost::detail::sp_forward<A2>( a2 ),
489 boost::detail::sp_forward<A3>( a3 ),
490 boost::detail::sp_forward<A4>( a4 )
491 );
492
493 pd->set_initialized();
494
495 T * pt2 = static_cast< T* >( pv );
496
497 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
498 return boost::shared_ptr< T >( pt, pt2 );
499 }
500
501 template< class T, class A, class A1, class A2, class A3, class A4 >
allocate_shared(A const & a,A1 && a1,A2 && a2,A3 && a3,A4 && a4)502 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
503 {
504 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
505
506 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
507
508 void * pv = pd->address();
509
510 ::new( pv ) T(
511 boost::detail::sp_forward<A1>( a1 ),
512 boost::detail::sp_forward<A2>( a2 ),
513 boost::detail::sp_forward<A3>( a3 ),
514 boost::detail::sp_forward<A4>( a4 )
515 );
516
517 pd->set_initialized();
518
519 T * pt2 = static_cast< T* >( pv );
520
521 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
522 return boost::shared_ptr< T >( pt, pt2 );
523 }
524
525 template< class T, class A1, class A2, class A3, class A4, class A5 >
make_shared(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5)526 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
527 {
528 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
529
530 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
531
532 void * pv = pd->address();
533
534 ::new( pv ) T(
535 boost::detail::sp_forward<A1>( a1 ),
536 boost::detail::sp_forward<A2>( a2 ),
537 boost::detail::sp_forward<A3>( a3 ),
538 boost::detail::sp_forward<A4>( a4 ),
539 boost::detail::sp_forward<A5>( a5 )
540 );
541
542 pd->set_initialized();
543
544 T * pt2 = static_cast< T* >( pv );
545
546 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
547 return boost::shared_ptr< T >( pt, pt2 );
548 }
549
550 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
allocate_shared(A const & a,A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5)551 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
552 {
553 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
554
555 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
556
557 void * pv = pd->address();
558
559 ::new( pv ) T(
560 boost::detail::sp_forward<A1>( a1 ),
561 boost::detail::sp_forward<A2>( a2 ),
562 boost::detail::sp_forward<A3>( a3 ),
563 boost::detail::sp_forward<A4>( a4 ),
564 boost::detail::sp_forward<A5>( a5 )
565 );
566
567 pd->set_initialized();
568
569 T * pt2 = static_cast< T* >( pv );
570
571 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
572 return boost::shared_ptr< T >( pt, pt2 );
573 }
574
575 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
make_shared(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6)576 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
577 {
578 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
579
580 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
581
582 void * pv = pd->address();
583
584 ::new( pv ) T(
585 boost::detail::sp_forward<A1>( a1 ),
586 boost::detail::sp_forward<A2>( a2 ),
587 boost::detail::sp_forward<A3>( a3 ),
588 boost::detail::sp_forward<A4>( a4 ),
589 boost::detail::sp_forward<A5>( a5 ),
590 boost::detail::sp_forward<A6>( a6 )
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
601 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
allocate_shared(A const & a,A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6)602 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
603 {
604 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
605
606 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
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 );
618
619 pd->set_initialized();
620
621 T * pt2 = static_cast< T* >( pv );
622
623 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
624 return boost::shared_ptr< T >( pt, pt2 );
625 }
626
627 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
make_shared(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7)628 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
629 {
630 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
631
632 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
633
634 void * pv = pd->address();
635
636 ::new( pv ) T(
637 boost::detail::sp_forward<A1>( a1 ),
638 boost::detail::sp_forward<A2>( a2 ),
639 boost::detail::sp_forward<A3>( a3 ),
640 boost::detail::sp_forward<A4>( a4 ),
641 boost::detail::sp_forward<A5>( a5 ),
642 boost::detail::sp_forward<A6>( a6 ),
643 boost::detail::sp_forward<A7>( a7 )
644 );
645
646 pd->set_initialized();
647
648 T * pt2 = static_cast< T* >( pv );
649
650 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
651 return boost::shared_ptr< T >( pt, pt2 );
652 }
653
654 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
allocate_shared(A const & a,A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7)655 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
656 {
657 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
658
659 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
660
661 void * pv = pd->address();
662
663 ::new( pv ) T(
664 boost::detail::sp_forward<A1>( a1 ),
665 boost::detail::sp_forward<A2>( a2 ),
666 boost::detail::sp_forward<A3>( a3 ),
667 boost::detail::sp_forward<A4>( a4 ),
668 boost::detail::sp_forward<A5>( a5 ),
669 boost::detail::sp_forward<A6>( a6 ),
670 boost::detail::sp_forward<A7>( a7 )
671 );
672
673 pd->set_initialized();
674
675 T * pt2 = static_cast< T* >( pv );
676
677 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
678 return boost::shared_ptr< T >( pt, pt2 );
679 }
680
681 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
make_shared(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7,A8 && a8)682 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
683 {
684 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
685
686 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
687
688 void * pv = pd->address();
689
690 ::new( pv ) T(
691 boost::detail::sp_forward<A1>( a1 ),
692 boost::detail::sp_forward<A2>( a2 ),
693 boost::detail::sp_forward<A3>( a3 ),
694 boost::detail::sp_forward<A4>( a4 ),
695 boost::detail::sp_forward<A5>( a5 ),
696 boost::detail::sp_forward<A6>( a6 ),
697 boost::detail::sp_forward<A7>( a7 ),
698 boost::detail::sp_forward<A8>( a8 )
699 );
700
701 pd->set_initialized();
702
703 T * pt2 = static_cast< T* >( pv );
704
705 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
706 return boost::shared_ptr< T >( pt, pt2 );
707 }
708
709 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
allocate_shared(A const & a,A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7,A8 && a8)710 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
711 {
712 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
713
714 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
715
716 void * pv = pd->address();
717
718 ::new( pv ) T(
719 boost::detail::sp_forward<A1>( a1 ),
720 boost::detail::sp_forward<A2>( a2 ),
721 boost::detail::sp_forward<A3>( a3 ),
722 boost::detail::sp_forward<A4>( a4 ),
723 boost::detail::sp_forward<A5>( a5 ),
724 boost::detail::sp_forward<A6>( a6 ),
725 boost::detail::sp_forward<A7>( a7 ),
726 boost::detail::sp_forward<A8>( a8 )
727 );
728
729 pd->set_initialized();
730
731 T * pt2 = static_cast< T* >( pv );
732
733 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
734 return boost::shared_ptr< T >( pt, pt2 );
735 }
736
737 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
make_shared(A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7,A8 && a8,A9 && a9)738 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
739 {
740 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
741
742 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
743
744 void * pv = pd->address();
745
746 ::new( pv ) T(
747 boost::detail::sp_forward<A1>( a1 ),
748 boost::detail::sp_forward<A2>( a2 ),
749 boost::detail::sp_forward<A3>( a3 ),
750 boost::detail::sp_forward<A4>( a4 ),
751 boost::detail::sp_forward<A5>( a5 ),
752 boost::detail::sp_forward<A6>( a6 ),
753 boost::detail::sp_forward<A7>( a7 ),
754 boost::detail::sp_forward<A8>( a8 ),
755 boost::detail::sp_forward<A9>( a9 )
756 );
757
758 pd->set_initialized();
759
760 T * pt2 = static_cast< T* >( pv );
761
762 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
763 return boost::shared_ptr< T >( pt, pt2 );
764 }
765
766 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
allocate_shared(A const & a,A1 && a1,A2 && a2,A3 && a3,A4 && a4,A5 && a5,A6 && a6,A7 && a7,A8 && a8,A9 && a9)767 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
768 {
769 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
770
771 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
772
773 void * pv = pd->address();
774
775 ::new( pv ) T(
776 boost::detail::sp_forward<A1>( a1 ),
777 boost::detail::sp_forward<A2>( a2 ),
778 boost::detail::sp_forward<A3>( a3 ),
779 boost::detail::sp_forward<A4>( a4 ),
780 boost::detail::sp_forward<A5>( a5 ),
781 boost::detail::sp_forward<A6>( a6 ),
782 boost::detail::sp_forward<A7>( a7 ),
783 boost::detail::sp_forward<A8>( a8 ),
784 boost::detail::sp_forward<A9>( a9 )
785 );
786
787 pd->set_initialized();
788
789 T * pt2 = static_cast< T* >( pv );
790
791 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
792 return boost::shared_ptr< T >( pt, pt2 );
793 }
794
795 #else // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
796
797 // C++03 version
798
799 template< class T, class A1 >
make_shared(A1 const & a1)800 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 )
801 {
802 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
803
804 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
805
806 void * pv = pd->address();
807
808 ::new( pv ) T( a1 );
809 pd->set_initialized();
810
811 T * pt2 = static_cast< T* >( pv );
812
813 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
814 return boost::shared_ptr< T >( pt, pt2 );
815 }
816
817 template< class T, class A, class A1 >
allocate_shared(A const & a,A1 const & a1)818 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1 )
819 {
820 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
821
822 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
823
824 void * pv = pd->address();
825
826 ::new( pv ) T( a1 );
827 pd->set_initialized();
828
829 T * pt2 = static_cast< T* >( pv );
830
831 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
832 return boost::shared_ptr< T >( pt, pt2 );
833 }
834
835 template< class T, class A1, class A2 >
make_shared(A1 const & a1,A2 const & a2)836 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2 )
837 {
838 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
839
840 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
841
842 void * pv = pd->address();
843
844 ::new( pv ) T( a1, a2 );
845 pd->set_initialized();
846
847 T * pt2 = static_cast< T* >( pv );
848
849 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
850 return boost::shared_ptr< T >( pt, pt2 );
851 }
852
853 template< class T, class A, class A1, class A2 >
allocate_shared(A const & a,A1 const & a1,A2 const & a2)854 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2 )
855 {
856 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
857
858 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
859
860 void * pv = pd->address();
861
862 ::new( pv ) T( a1, a2 );
863 pd->set_initialized();
864
865 T * pt2 = static_cast< T* >( pv );
866
867 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
868 return boost::shared_ptr< T >( pt, pt2 );
869 }
870
871 template< class T, class A1, class A2, class A3 >
make_shared(A1 const & a1,A2 const & a2,A3 const & a3)872 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )
873 {
874 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
875
876 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
877
878 void * pv = pd->address();
879
880 ::new( pv ) T( a1, a2, a3 );
881 pd->set_initialized();
882
883 T * pt2 = static_cast< T* >( pv );
884
885 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
886 return boost::shared_ptr< T >( pt, pt2 );
887 }
888
889 template< class T, class A, class A1, class A2, class A3 >
allocate_shared(A const & a,A1 const & a1,A2 const & a2,A3 const & a3)890 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )
891 {
892 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
893
894 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
895
896 void * pv = pd->address();
897
898 ::new( pv ) T( a1, a2, a3 );
899 pd->set_initialized();
900
901 T * pt2 = static_cast< T* >( pv );
902
903 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
904 return boost::shared_ptr< T >( pt, pt2 );
905 }
906
907 template< class T, class A1, class A2, class A3, class A4 >
make_shared(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4)908 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
909 {
910 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
911
912 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
913
914 void * pv = pd->address();
915
916 ::new( pv ) T( a1, a2, a3, a4 );
917 pd->set_initialized();
918
919 T * pt2 = static_cast< T* >( pv );
920
921 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
922 return boost::shared_ptr< T >( pt, pt2 );
923 }
924
925 template< class T, class A, class A1, class A2, class A3, class A4 >
allocate_shared(A const & a,A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4)926 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
927 {
928 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
929
930 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
931
932 void * pv = pd->address();
933
934 ::new( pv ) T( a1, a2, a3, a4 );
935 pd->set_initialized();
936
937 T * pt2 = static_cast< T* >( pv );
938
939 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
940 return boost::shared_ptr< T >( pt, pt2 );
941 }
942
943 template< class T, class A1, class A2, class A3, class A4, class A5 >
make_shared(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5)944 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
945 {
946 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
947
948 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
949
950 void * pv = pd->address();
951
952 ::new( pv ) T( a1, a2, a3, a4, a5 );
953 pd->set_initialized();
954
955 T * pt2 = static_cast< T* >( pv );
956
957 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
958 return boost::shared_ptr< T >( pt, pt2 );
959 }
960
961 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
allocate_shared(A const & a,A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5)962 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
963 {
964 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
965
966 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
967
968 void * pv = pd->address();
969
970 ::new( pv ) T( a1, a2, a3, a4, a5 );
971 pd->set_initialized();
972
973 T * pt2 = static_cast< T* >( pv );
974
975 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
976 return boost::shared_ptr< T >( pt, pt2 );
977 }
978
979 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
make_shared(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6)980 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
981 {
982 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
983
984 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
985
986 void * pv = pd->address();
987
988 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
989 pd->set_initialized();
990
991 T * pt2 = static_cast< T* >( pv );
992
993 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
994 return boost::shared_ptr< T >( pt, pt2 );
995 }
996
997 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
allocate_shared(A const & a,A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6)998 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
999 {
1000 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1001
1002 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1003
1004 void * pv = pd->address();
1005
1006 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
1007 pd->set_initialized();
1008
1009 T * pt2 = static_cast< T* >( pv );
1010
1011 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1012 return boost::shared_ptr< T >( pt, pt2 );
1013 }
1014
1015 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
make_shared(A1 const & a1,A2 const & a2,A3 const & a3,A4 const & a4,A5 const & a5,A6 const & a6,A7 const & a7)1016 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
1017 {
1018 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
1019
1020 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1021
1022 void * pv = pd->address();
1023
1024 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
1025 pd->set_initialized();
1026
1027 T * pt2 = static_cast< T* >( pv );
1028
1029 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1030 return boost::shared_ptr< T >( pt, pt2 );
1031 }
1032
1033 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
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)1034 typename boost::detail::sp_if_not_array< T >::type 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 )
1035 {
1036 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1037
1038 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1039
1040 void * pv = pd->address();
1041
1042 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
1043 pd->set_initialized();
1044
1045 T * pt2 = static_cast< T* >( pv );
1046
1047 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1048 return boost::shared_ptr< T >( pt, pt2 );
1049 }
1050
1051 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
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)1052 typename boost::detail::sp_if_not_array< T >::type 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 )
1053 {
1054 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
1055
1056 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1057
1058 void * pv = pd->address();
1059
1060 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
1061 pd->set_initialized();
1062
1063 T * pt2 = static_cast< T* >( pv );
1064
1065 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1066 return boost::shared_ptr< T >( pt, pt2 );
1067 }
1068
1069 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
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)1070 typename boost::detail::sp_if_not_array< T >::type 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 )
1071 {
1072 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1073
1074 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1075
1076 void * pv = pd->address();
1077
1078 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
1079 pd->set_initialized();
1080
1081 T * pt2 = static_cast< T* >( pv );
1082
1083 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1084 return boost::shared_ptr< T >( pt, pt2 );
1085 }
1086
1087 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
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)1088 typename boost::detail::sp_if_not_array< T >::type 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 )
1089 {
1090 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
1091
1092 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1093
1094 void * pv = pd->address();
1095
1096 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1097 pd->set_initialized();
1098
1099 T * pt2 = static_cast< T* >( pv );
1100
1101 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1102 return boost::shared_ptr< T >( pt, pt2 );
1103 }
1104
1105 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
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)1106 typename boost::detail::sp_if_not_array< T >::type 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 )
1107 {
1108 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1109
1110 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1111
1112 void * pv = pd->address();
1113
1114 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1115 pd->set_initialized();
1116
1117 T * pt2 = static_cast< T* >( pv );
1118
1119 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1120 return boost::shared_ptr< T >( pt, pt2 );
1121 }
1122
1123 #endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
1124
1125 #endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
1126
1127 #undef BOOST_SP_MSD
1128
1129 } // namespace boost
1130
1131 #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
1132