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/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>
29 template< std::size_t N, std::size_t A > struct sp_aligned_storage
34 typename boost::type_with_alignment< A >::type align_;
38 template< class T > class sp_ms_deleter
42 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
45 storage_type storage_;
53 #if defined( __GNUC__ )
55 // fixes incorrect aliasing warning
56 T * p = reinterpret_cast< T* >( storage_.data_ );
61 reinterpret_cast< T* >( storage_.data_ )->~T();
71 sp_ms_deleter() BOOST_NOEXCEPT : initialized_( false )
75 template<class A> explicit sp_ms_deleter( A const & ) BOOST_NOEXCEPT : initialized_( false )
79 // optimization: do not copy storage_
80 sp_ms_deleter( sp_ms_deleter const & ) BOOST_NOEXCEPT : initialized_( false )
89 void operator()( T * )
94 static void operator_fn( T* ) // operator() can't be static
98 void * address() BOOST_NOEXCEPT
100 return storage_.data_;
103 void set_initialized() BOOST_NOEXCEPT
109 template< class T, class A > class sp_as_deleter
113 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
115 storage_type storage_;
125 T * p = reinterpret_cast< T* >( storage_.data_ );
127 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
129 std::allocator_traits<A>::destroy( a_, p );
137 initialized_ = false;
143 sp_as_deleter( A const & a ) BOOST_NOEXCEPT : a_( a ), initialized_( false )
147 // optimization: do not copy storage_
148 sp_as_deleter( sp_as_deleter const & r ) BOOST_NOEXCEPT : a_( r.a_), initialized_( false )
157 void operator()( T * )
162 static void operator_fn( T* ) // operator() can't be static
166 void * address() BOOST_NOEXCEPT
168 return storage_.data_;
171 void set_initialized() BOOST_NOEXCEPT
177 template< class T > struct sp_if_not_array
179 typedef boost::shared_ptr< T > type;
182 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
184 template< class T > struct sp_if_not_array< T[] >
188 #if !defined( __BORLANDC__ ) || !BOOST_WORKAROUND( __BORLANDC__, < 0x600 )
190 template< class T, std::size_t N > struct sp_if_not_array< T[N] >
198 } // namespace detail
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 > >()
203 # define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
208 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit()
210 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
212 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
214 void * pv = pd->address();
217 pd->set_initialized();
219 T * pt2 = static_cast< T* >( pv );
221 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
222 return boost::shared_ptr< T >( pt, pt2 );
225 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a )
227 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
229 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
231 void * pv = pd->address();
234 pd->set_initialized();
236 T * pt2 = static_cast< T* >( pv );
238 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
239 return boost::shared_ptr< T >( pt, pt2 );
242 #if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
244 // Variadic templates, rvalue reference
246 template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
248 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
250 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
252 void * pv = pd->address();
254 ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
255 pd->set_initialized();
257 T * pt2 = static_cast< T* >( pv );
259 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
260 return boost::shared_ptr< T >( pt, pt2 );
263 template< class T, class A, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Args && ... args )
265 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
267 typedef typename std::allocator_traits<A>::template rebind_alloc<T> A2;
270 typedef boost::detail::sp_as_deleter< T, A2 > D;
272 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a2 );
276 typedef boost::detail::sp_ms_deleter< T > D;
278 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a );
282 D * pd = static_cast< D* >( pt._internal_get_untyped_deleter() );
283 void * pv = pd->address();
285 #if !defined( BOOST_NO_CXX11_ALLOCATOR )
287 std::allocator_traits<A2>::construct( a2, static_cast< T* >( pv ), boost::detail::sp_forward<Args>( args )... );
291 ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
295 pd->set_initialized();
297 T * pt2 = static_cast< T* >( pv );
299 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
300 return boost::shared_ptr< T >( pt, pt2 );
303 #else // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
305 // Common zero-argument versions
307 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared()
309 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
311 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
313 void * pv = pd->address();
316 pd->set_initialized();
318 T * pt2 = static_cast< T* >( pv );
320 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
321 return boost::shared_ptr< T >( pt, pt2 );
324 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a )
326 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
328 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
330 void * pv = pd->address();
333 pd->set_initialized();
335 T * pt2 = static_cast< T* >( pv );
337 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
338 return boost::shared_ptr< T >( pt, pt2 );
341 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
343 // For example MSVC 10.0
345 template< class T, class A1 >
346 typename boost::detail::sp_if_not_array< T >::type make_shared( 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::detail::sp_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, 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::detail::sp_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( A1 && a1, 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::detail::sp_forward<A1>( a1 ),
398 boost::detail::sp_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, A1 && a1, 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::detail::sp_forward<A1>( a1 ),
420 boost::detail::sp_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( A1 && a1, A2 && a2, 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::detail::sp_forward<A1>( a1 ),
442 boost::detail::sp_forward<A2>( a2 ),
443 boost::detail::sp_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, A1 && a1, A2 && a2, 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::detail::sp_forward<A1>( a1 ),
465 boost::detail::sp_forward<A2>( a2 ),
466 boost::detail::sp_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( A1 && a1, A2 && a2, A3 && a3, 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::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 )
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, A1 && a1, A2 && a2, A3 && a3, 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::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 )
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( A1 && a1, A2 && a2, A3 && a3, A4 && a4, 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::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 )
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, A1 && a1, A2 && a2, A3 && a3, A4 && a4, 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::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 )
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( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, 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::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 )
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, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, 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::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 )
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( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, 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::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 )
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, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, 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::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 )
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( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, 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::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 )
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, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, 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::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 )
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( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, 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::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 )
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, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, 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::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 )
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 #else // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
799 template< class T, class A1 >
800 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 )
802 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
804 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
806 void * pv = pd->address();
809 pd->set_initialized();
811 T * pt2 = static_cast< T* >( pv );
813 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
814 return boost::shared_ptr< T >( pt, pt2 );
817 template< class T, class A, class A1 >
818 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1 )
820 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
822 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
824 void * pv = pd->address();
827 pd->set_initialized();
829 T * pt2 = static_cast< T* >( pv );
831 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
832 return boost::shared_ptr< T >( pt, pt2 );
835 template< class T, class A1, class A2 >
836 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2 )
838 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
840 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
842 void * pv = pd->address();
844 ::new( pv ) T( a1, a2 );
845 pd->set_initialized();
847 T * pt2 = static_cast< T* >( pv );
849 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
850 return boost::shared_ptr< T >( pt, pt2 );
853 template< class T, class A, class A1, class A2 >
854 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2 )
856 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
858 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
860 void * pv = pd->address();
862 ::new( pv ) T( a1, a2 );
863 pd->set_initialized();
865 T * pt2 = static_cast< T* >( pv );
867 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
868 return boost::shared_ptr< T >( pt, pt2 );
871 template< class T, class A1, class A2, class A3 >
872 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )
874 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
876 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
878 void * pv = pd->address();
880 ::new( pv ) T( a1, a2, a3 );
881 pd->set_initialized();
883 T * pt2 = static_cast< T* >( pv );
885 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
886 return boost::shared_ptr< T >( pt, pt2 );
889 template< class T, class A, class A1, class A2, class 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 )
892 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
894 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
896 void * pv = pd->address();
898 ::new( pv ) T( a1, a2, a3 );
899 pd->set_initialized();
901 T * pt2 = static_cast< T* >( pv );
903 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
904 return boost::shared_ptr< T >( pt, pt2 );
907 template< class T, class A1, class A2, class A3, class 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 )
910 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
912 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
914 void * pv = pd->address();
916 ::new( pv ) T( a1, a2, a3, a4 );
917 pd->set_initialized();
919 T * pt2 = static_cast< T* >( pv );
921 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
922 return boost::shared_ptr< T >( pt, pt2 );
925 template< class T, class A, class A1, class A2, class A3, class 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 )
928 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
930 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
932 void * pv = pd->address();
934 ::new( pv ) T( a1, a2, a3, a4 );
935 pd->set_initialized();
937 T * pt2 = static_cast< T* >( pv );
939 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
940 return boost::shared_ptr< T >( pt, pt2 );
943 template< class T, class A1, class A2, class A3, class A4, class 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 )
946 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
948 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
950 void * pv = pd->address();
952 ::new( pv ) T( a1, a2, a3, a4, a5 );
953 pd->set_initialized();
955 T * pt2 = static_cast< T* >( pv );
957 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
958 return boost::shared_ptr< T >( pt, pt2 );
961 template< class T, class A, class A1, class A2, class A3, class A4, class 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 )
964 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
966 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
968 void * pv = pd->address();
970 ::new( pv ) T( a1, a2, a3, a4, a5 );
971 pd->set_initialized();
973 T * pt2 = static_cast< T* >( pv );
975 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
976 return boost::shared_ptr< T >( pt, pt2 );
979 template< class T, class A1, class A2, class A3, class A4, class A5, class 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 )
982 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
984 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
986 void * pv = pd->address();
988 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
989 pd->set_initialized();
991 T * pt2 = static_cast< T* >( pv );
993 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
994 return boost::shared_ptr< T >( pt, pt2 );
997 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class 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 )
1000 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1002 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1004 void * pv = pd->address();
1006 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
1007 pd->set_initialized();
1009 T * pt2 = static_cast< T* >( pv );
1011 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1012 return boost::shared_ptr< T >( pt, pt2 );
1015 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class 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 )
1018 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
1020 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1022 void * pv = pd->address();
1024 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
1025 pd->set_initialized();
1027 T * pt2 = static_cast< T* >( pv );
1029 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1030 return boost::shared_ptr< T >( pt, pt2 );
1033 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class 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 )
1036 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1038 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1040 void * pv = pd->address();
1042 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
1043 pd->set_initialized();
1045 T * pt2 = static_cast< T* >( pv );
1047 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1048 return boost::shared_ptr< T >( pt, pt2 );
1051 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class 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 )
1054 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
1056 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1058 void * pv = pd->address();
1060 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
1061 pd->set_initialized();
1063 T * pt2 = static_cast< T* >( pv );
1065 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1066 return boost::shared_ptr< T >( pt, pt2 );
1069 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class 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 )
1072 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1074 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1076 void * pv = pd->address();
1078 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
1079 pd->set_initialized();
1081 T * pt2 = static_cast< T* >( pv );
1083 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1084 return boost::shared_ptr< T >( pt, pt2 );
1087 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class 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 )
1090 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
1092 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1094 void * pv = pd->address();
1096 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1097 pd->set_initialized();
1099 T * pt2 = static_cast< T* >( pv );
1101 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1102 return boost::shared_ptr< T >( pt, pt2 );
1105 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class 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 )
1108 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1110 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1112 void * pv = pd->address();
1114 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1115 pd->set_initialized();
1117 T * pt2 = static_cast< T* >( pv );
1119 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1120 return boost::shared_ptr< T >( pt, pt2 );
1123 #endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
1125 #endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
1129 } // namespace boost
1131 #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED