1 #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
2 #define BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
4 // make_shared_object.hpp
6 // Copyright (c) 2007, 2008, 2012 Peter Dimov
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
12 // See http://www.boost.org/libs/smart_ptr/make_shared.html
15 #include <boost/config.hpp>
16 #include <boost/move/core.hpp>
17 #include <boost/move/utility_core.hpp>
18 #include <boost/smart_ptr/shared_ptr.hpp>
19 #include <boost/smart_ptr/detail/sp_forward.hpp>
20 #include <boost/type_traits/type_with_alignment.hpp>
21 #include <boost/type_traits/alignment_of.hpp>
31 template< std::size_t N, std::size_t A > struct sp_aligned_storage
36 typename boost::type_with_alignment< A >::type align_;
40 template< class T > class sp_ms_deleter
44 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
47 storage_type storage_;
55 #if defined( __GNUC__ )
57 // fixes incorrect aliasing warning
58 T * p = reinterpret_cast< T* >( storage_.data_ );
63 reinterpret_cast< T* >( storage_.data_ )->~T();
73 sp_ms_deleter() BOOST_NOEXCEPT : initialized_( false )
77 template<class A> explicit sp_ms_deleter( A const & ) BOOST_NOEXCEPT : initialized_( false )
81 // optimization: do not copy storage_
82 sp_ms_deleter( sp_ms_deleter const & ) BOOST_NOEXCEPT : initialized_( false )
91 void operator()( T * )
96 static void operator_fn( T* ) // operator() can't be static
100 void * address() BOOST_NOEXCEPT
102 return storage_.data_;
105 void set_initialized() BOOST_NOEXCEPT
111 template< class T, class A > class sp_as_deleter
115 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
117 storage_type storage_;
127 T * p = reinterpret_cast< T* >( storage_.data_ );
129 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
131 std::allocator_traits<A>::destroy( a_, p );
139 initialized_ = false;
145 sp_as_deleter( A const & a ) BOOST_NOEXCEPT : a_( a ), initialized_( false )
149 // optimization: do not copy storage_
150 sp_as_deleter( sp_as_deleter const & r ) BOOST_NOEXCEPT : a_( r.a_), initialized_( false )
159 void operator()( T * )
164 static void operator_fn( T* ) // operator() can't be static
168 void * address() BOOST_NOEXCEPT
170 return storage_.data_;
173 void set_initialized() BOOST_NOEXCEPT
179 template< class T > struct sp_if_not_array
181 typedef boost::shared_ptr< T > type;
184 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
186 template< class T > struct sp_if_not_array< T[] >
190 #if !defined( __BORLANDC__ ) || !BOOST_WORKAROUND( __BORLANDC__, < 0x600 )
192 template< class T, std::size_t N > struct sp_if_not_array< T[N] >
200 } // namespace detail
202 #if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
203 # define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
205 # define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
210 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit()
212 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
214 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
216 void * pv = pd->address();
219 pd->set_initialized();
221 T * pt2 = static_cast< T* >( pv );
223 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
224 return boost::shared_ptr< T >( pt, pt2 );
227 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a )
229 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
231 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
233 void * pv = pd->address();
236 pd->set_initialized();
238 T * pt2 = static_cast< T* >( pv );
240 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
241 return boost::shared_ptr< T >( pt, pt2 );
244 #if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
246 // Variadic templates, rvalue reference
248 template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
250 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
252 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
254 void * pv = pd->address();
256 ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
257 pd->set_initialized();
259 T * pt2 = static_cast< T* >( pv );
261 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
262 return boost::shared_ptr< T >( pt, pt2 );
265 template< class T, class A, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Args && ... args )
267 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
269 typedef typename std::allocator_traits<A>::template rebind_alloc<T> A2;
272 typedef boost::detail::sp_as_deleter< T, A2 > D;
274 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a2 );
278 typedef boost::detail::sp_ms_deleter< T > D;
280 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a );
284 D * pd = static_cast< D* >( pt._internal_get_untyped_deleter() );
285 void * pv = pd->address();
287 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
289 std::allocator_traits<A2>::construct( a2, static_cast< T* >( pv ), boost::detail::sp_forward<Args>( args )... );
293 ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
297 pd->set_initialized();
299 T * pt2 = static_cast< T* >( pv );
301 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
302 return boost::shared_ptr< T >( pt, pt2 );
305 #else // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
307 // Common zero-argument versions
309 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared()
311 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
313 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
315 void * pv = pd->address();
318 pd->set_initialized();
320 T * pt2 = static_cast< T* >( pv );
322 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
323 return boost::shared_ptr< T >( pt, pt2 );
326 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a )
328 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
330 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
332 void * pv = pd->address();
335 pd->set_initialized();
337 T * pt2 = static_cast< T* >( pv );
339 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
340 return boost::shared_ptr< T >( pt, pt2 );
345 template< class T, class A1 >
346 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1 )
348 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
350 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
352 void * pv = pd->address();
355 boost::forward<A1>( a1 )
358 pd->set_initialized();
360 T * pt2 = static_cast< T* >( pv );
362 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
363 return boost::shared_ptr< T >( pt, pt2 );
366 template< class T, class A, class A1 >
367 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1 )
369 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
371 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
373 void * pv = pd->address();
376 boost::forward<A1>( a1 )
379 pd->set_initialized();
381 T * pt2 = static_cast< T* >( pv );
383 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
384 return boost::shared_ptr< T >( pt, pt2 );
387 template< class T, class A1, class A2 >
388 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
390 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
392 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
394 void * pv = pd->address();
397 boost::forward<A1>( a1 ),
398 boost::forward<A2>( a2 )
401 pd->set_initialized();
403 T * pt2 = static_cast< T* >( pv );
405 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
406 return boost::shared_ptr< T >( pt, pt2 );
409 template< class T, class A, class A1, class A2 >
410 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
412 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
414 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
416 void * pv = pd->address();
419 boost::forward<A1>( a1 ),
420 boost::forward<A2>( a2 )
423 pd->set_initialized();
425 T * pt2 = static_cast< T* >( pv );
427 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
428 return boost::shared_ptr< T >( pt, pt2 );
431 template< class T, class A1, class A2, class A3 >
432 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
434 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
436 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
438 void * pv = pd->address();
441 boost::forward<A1>( a1 ),
442 boost::forward<A2>( a2 ),
443 boost::forward<A3>( a3 )
446 pd->set_initialized();
448 T * pt2 = static_cast< T* >( pv );
450 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
451 return boost::shared_ptr< T >( pt, pt2 );
454 template< class T, class A, class A1, class A2, class A3 >
455 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
457 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
459 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
461 void * pv = pd->address();
464 boost::forward<A1>( a1 ),
465 boost::forward<A2>( a2 ),
466 boost::forward<A3>( a3 )
469 pd->set_initialized();
471 T * pt2 = static_cast< T* >( pv );
473 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
474 return boost::shared_ptr< T >( pt, pt2 );
477 template< class T, class A1, class A2, class A3, class A4 >
478 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
480 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
482 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
484 void * pv = pd->address();
487 boost::forward<A1>( a1 ),
488 boost::forward<A2>( a2 ),
489 boost::forward<A3>( a3 ),
490 boost::forward<A4>( a4 )
493 pd->set_initialized();
495 T * pt2 = static_cast< T* >( pv );
497 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
498 return boost::shared_ptr< T >( pt, pt2 );
501 template< class T, class A, class A1, class A2, class A3, class A4 >
502 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
504 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
506 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
508 void * pv = pd->address();
511 boost::forward<A1>( a1 ),
512 boost::forward<A2>( a2 ),
513 boost::forward<A3>( a3 ),
514 boost::forward<A4>( a4 )
517 pd->set_initialized();
519 T * pt2 = static_cast< T* >( pv );
521 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
522 return boost::shared_ptr< T >( pt, pt2 );
525 template< class T, class A1, class A2, class A3, class A4, class A5 >
526 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
528 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
530 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
532 void * pv = pd->address();
535 boost::forward<A1>( a1 ),
536 boost::forward<A2>( a2 ),
537 boost::forward<A3>( a3 ),
538 boost::forward<A4>( a4 ),
539 boost::forward<A5>( a5 )
542 pd->set_initialized();
544 T * pt2 = static_cast< T* >( pv );
546 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
547 return boost::shared_ptr< T >( pt, pt2 );
550 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
551 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
553 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
555 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
557 void * pv = pd->address();
560 boost::forward<A1>( a1 ),
561 boost::forward<A2>( a2 ),
562 boost::forward<A3>( a3 ),
563 boost::forward<A4>( a4 ),
564 boost::forward<A5>( a5 )
567 pd->set_initialized();
569 T * pt2 = static_cast< T* >( pv );
571 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
572 return boost::shared_ptr< T >( pt, pt2 );
575 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
576 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
578 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
580 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
582 void * pv = pd->address();
585 boost::forward<A1>( a1 ),
586 boost::forward<A2>( a2 ),
587 boost::forward<A3>( a3 ),
588 boost::forward<A4>( a4 ),
589 boost::forward<A5>( a5 ),
590 boost::forward<A6>( a6 )
593 pd->set_initialized();
595 T * pt2 = static_cast< T* >( pv );
597 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
598 return boost::shared_ptr< T >( pt, pt2 );
601 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
602 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
604 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
606 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
608 void * pv = pd->address();
611 boost::forward<A1>( a1 ),
612 boost::forward<A2>( a2 ),
613 boost::forward<A3>( a3 ),
614 boost::forward<A4>( a4 ),
615 boost::forward<A5>( a5 ),
616 boost::forward<A6>( a6 )
619 pd->set_initialized();
621 T * pt2 = static_cast< T* >( pv );
623 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
624 return boost::shared_ptr< T >( pt, pt2 );
627 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
628 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
630 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
632 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
634 void * pv = pd->address();
637 boost::forward<A1>( a1 ),
638 boost::forward<A2>( a2 ),
639 boost::forward<A3>( a3 ),
640 boost::forward<A4>( a4 ),
641 boost::forward<A5>( a5 ),
642 boost::forward<A6>( a6 ),
643 boost::forward<A7>( a7 )
646 pd->set_initialized();
648 T * pt2 = static_cast< T* >( pv );
650 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
651 return boost::shared_ptr< T >( pt, pt2 );
654 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
655 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
657 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
659 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
661 void * pv = pd->address();
664 boost::forward<A1>( a1 ),
665 boost::forward<A2>( a2 ),
666 boost::forward<A3>( a3 ),
667 boost::forward<A4>( a4 ),
668 boost::forward<A5>( a5 ),
669 boost::forward<A6>( a6 ),
670 boost::forward<A7>( a7 )
673 pd->set_initialized();
675 T * pt2 = static_cast< T* >( pv );
677 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
678 return boost::shared_ptr< T >( pt, pt2 );
681 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
682 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
684 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
686 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
688 void * pv = pd->address();
691 boost::forward<A1>( a1 ),
692 boost::forward<A2>( a2 ),
693 boost::forward<A3>( a3 ),
694 boost::forward<A4>( a4 ),
695 boost::forward<A5>( a5 ),
696 boost::forward<A6>( a6 ),
697 boost::forward<A7>( a7 ),
698 boost::forward<A8>( a8 )
701 pd->set_initialized();
703 T * pt2 = static_cast< T* >( pv );
705 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
706 return boost::shared_ptr< T >( pt, pt2 );
709 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
710 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
712 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
714 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
716 void * pv = pd->address();
719 boost::forward<A1>( a1 ),
720 boost::forward<A2>( a2 ),
721 boost::forward<A3>( a3 ),
722 boost::forward<A4>( a4 ),
723 boost::forward<A5>( a5 ),
724 boost::forward<A6>( a6 ),
725 boost::forward<A7>( a7 ),
726 boost::forward<A8>( a8 )
729 pd->set_initialized();
731 T * pt2 = static_cast< T* >( pv );
733 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
734 return boost::shared_ptr< T >( pt, pt2 );
737 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
738 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
740 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
742 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
744 void * pv = pd->address();
747 boost::forward<A1>( a1 ),
748 boost::forward<A2>( a2 ),
749 boost::forward<A3>( a3 ),
750 boost::forward<A4>( a4 ),
751 boost::forward<A5>( a5 ),
752 boost::forward<A6>( a6 ),
753 boost::forward<A7>( a7 ),
754 boost::forward<A8>( a8 ),
755 boost::forward<A9>( a9 )
758 pd->set_initialized();
760 T * pt2 = static_cast< T* >( pv );
762 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
763 return boost::shared_ptr< T >( pt, pt2 );
766 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
767 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
769 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
771 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
773 void * pv = pd->address();
776 boost::forward<A1>( a1 ),
777 boost::forward<A2>( a2 ),
778 boost::forward<A3>( a3 ),
779 boost::forward<A4>( a4 ),
780 boost::forward<A5>( a5 ),
781 boost::forward<A6>( a6 ),
782 boost::forward<A7>( a7 ),
783 boost::forward<A8>( a8 ),
784 boost::forward<A9>( a9 )
787 pd->set_initialized();
789 T * pt2 = static_cast< T* >( pv );
791 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
792 return boost::shared_ptr< T >( pt, pt2 );
795 #endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
801 #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED