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 // optimization: do not copy storage_
76 sp_ms_deleter( sp_ms_deleter const & ) BOOST_NOEXCEPT : initialized_( false )
85 void operator()( T * )
90 static void operator_fn( T* ) // operator() can't be static
94 void * address() BOOST_NOEXCEPT
96 return storage_.data_;
99 void set_initialized() BOOST_NOEXCEPT
105 template< class T > struct sp_if_not_array
107 typedef boost::shared_ptr< T > type;
110 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
112 template< class T > struct sp_if_not_array< T[] >
116 #if !defined( __BORLANDC__ ) || !BOOST_WORKAROUND( __BORLANDC__, < 0x600 )
118 template< class T, std::size_t N > struct sp_if_not_array< T[N] >
126 } // namespace detail
128 #if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
129 # define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
131 # define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
134 // Zero-argument versions
136 // Used even when variadic templates are available because of the new T() vs new T issue
138 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared()
140 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
142 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
144 void * pv = pd->address();
147 pd->set_initialized();
149 T * pt2 = static_cast< T* >( pv );
151 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
152 return boost::shared_ptr< T >( pt, pt2 );
155 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit()
157 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
159 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
161 void * pv = pd->address();
164 pd->set_initialized();
166 T * pt2 = static_cast< T* >( pv );
168 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
169 return boost::shared_ptr< T >( pt, pt2 );
172 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a )
174 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
176 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
178 void * pv = pd->address();
181 pd->set_initialized();
183 T * pt2 = static_cast< T* >( pv );
185 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
186 return boost::shared_ptr< T >( pt, pt2 );
189 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a )
191 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
193 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
195 void * pv = pd->address();
198 pd->set_initialized();
200 T * pt2 = static_cast< T* >( pv );
202 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
203 return boost::shared_ptr< T >( pt, pt2 );
206 #if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
208 // Variadic templates, rvalue reference
210 template< class T, class Arg1, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Arg1 && arg1, Args && ... args )
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();
218 ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
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, class Arg1, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Arg1 && arg1, Args && ... args )
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();
235 ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
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 #elif !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
246 // For example MSVC 10.0
248 template< class T, class A1 >
249 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 )
251 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
253 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
255 void * pv = pd->address();
258 boost::detail::sp_forward<A1>( a1 )
261 pd->set_initialized();
263 T * pt2 = static_cast< T* >( pv );
265 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
266 return boost::shared_ptr< T >( pt, pt2 );
269 template< class T, class A, class A1 >
270 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1 )
272 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
274 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
276 void * pv = pd->address();
279 boost::detail::sp_forward<A1>( a1 )
282 pd->set_initialized();
284 T * pt2 = static_cast< T* >( pv );
286 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
287 return boost::shared_ptr< T >( pt, pt2 );
290 template< class T, class A1, class A2 >
291 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2 )
293 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
295 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
297 void * pv = pd->address();
300 boost::detail::sp_forward<A1>( a1 ),
301 boost::detail::sp_forward<A2>( a2 )
304 pd->set_initialized();
306 T * pt2 = static_cast< T* >( pv );
308 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
309 return boost::shared_ptr< T >( pt, pt2 );
312 template< class T, class A, class A1, class A2 >
313 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2 )
315 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
317 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
319 void * pv = pd->address();
322 boost::detail::sp_forward<A1>( a1 ),
323 boost::detail::sp_forward<A2>( a2 )
326 pd->set_initialized();
328 T * pt2 = static_cast< T* >( pv );
330 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
331 return boost::shared_ptr< T >( pt, pt2 );
334 template< class T, class A1, class A2, class A3 >
335 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3 )
337 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
339 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
341 void * pv = pd->address();
344 boost::detail::sp_forward<A1>( a1 ),
345 boost::detail::sp_forward<A2>( a2 ),
346 boost::detail::sp_forward<A3>( a3 )
349 pd->set_initialized();
351 T * pt2 = static_cast< T* >( pv );
353 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
354 return boost::shared_ptr< T >( pt, pt2 );
357 template< class T, class A, class A1, class A2, class A3 >
358 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 )
360 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
362 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
364 void * pv = pd->address();
367 boost::detail::sp_forward<A1>( a1 ),
368 boost::detail::sp_forward<A2>( a2 ),
369 boost::detail::sp_forward<A3>( a3 )
372 pd->set_initialized();
374 T * pt2 = static_cast< T* >( pv );
376 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
377 return boost::shared_ptr< T >( pt, pt2 );
380 template< class T, class A1, class A2, class A3, class A4 >
381 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
383 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
385 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
387 void * pv = pd->address();
390 boost::detail::sp_forward<A1>( a1 ),
391 boost::detail::sp_forward<A2>( a2 ),
392 boost::detail::sp_forward<A3>( a3 ),
393 boost::detail::sp_forward<A4>( a4 )
396 pd->set_initialized();
398 T * pt2 = static_cast< T* >( pv );
400 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
401 return boost::shared_ptr< T >( pt, pt2 );
404 template< class T, class A, class A1, class A2, class A3, class A4 >
405 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
407 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
409 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
411 void * pv = pd->address();
414 boost::detail::sp_forward<A1>( a1 ),
415 boost::detail::sp_forward<A2>( a2 ),
416 boost::detail::sp_forward<A3>( a3 ),
417 boost::detail::sp_forward<A4>( a4 )
420 pd->set_initialized();
422 T * pt2 = static_cast< T* >( pv );
424 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
425 return boost::shared_ptr< T >( pt, pt2 );
428 template< class T, class A1, class A2, class A3, class A4, class A5 >
429 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
431 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
433 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
435 void * pv = pd->address();
438 boost::detail::sp_forward<A1>( a1 ),
439 boost::detail::sp_forward<A2>( a2 ),
440 boost::detail::sp_forward<A3>( a3 ),
441 boost::detail::sp_forward<A4>( a4 ),
442 boost::detail::sp_forward<A5>( a5 )
445 pd->set_initialized();
447 T * pt2 = static_cast< T* >( pv );
449 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
450 return boost::shared_ptr< T >( pt, pt2 );
453 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
454 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
456 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
458 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
460 void * pv = pd->address();
463 boost::detail::sp_forward<A1>( a1 ),
464 boost::detail::sp_forward<A2>( a2 ),
465 boost::detail::sp_forward<A3>( a3 ),
466 boost::detail::sp_forward<A4>( a4 ),
467 boost::detail::sp_forward<A5>( a5 )
470 pd->set_initialized();
472 T * pt2 = static_cast< T* >( pv );
474 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
475 return boost::shared_ptr< T >( pt, pt2 );
478 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
479 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
481 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
483 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
485 void * pv = pd->address();
488 boost::detail::sp_forward<A1>( a1 ),
489 boost::detail::sp_forward<A2>( a2 ),
490 boost::detail::sp_forward<A3>( a3 ),
491 boost::detail::sp_forward<A4>( a4 ),
492 boost::detail::sp_forward<A5>( a5 ),
493 boost::detail::sp_forward<A6>( a6 )
496 pd->set_initialized();
498 T * pt2 = static_cast< T* >( pv );
500 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
501 return boost::shared_ptr< T >( pt, pt2 );
504 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
505 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 )
507 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
509 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
511 void * pv = pd->address();
514 boost::detail::sp_forward<A1>( a1 ),
515 boost::detail::sp_forward<A2>( a2 ),
516 boost::detail::sp_forward<A3>( a3 ),
517 boost::detail::sp_forward<A4>( a4 ),
518 boost::detail::sp_forward<A5>( a5 ),
519 boost::detail::sp_forward<A6>( a6 )
522 pd->set_initialized();
524 T * pt2 = static_cast< T* >( pv );
526 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
527 return boost::shared_ptr< T >( pt, pt2 );
530 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
531 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 )
533 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
535 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
537 void * pv = pd->address();
540 boost::detail::sp_forward<A1>( a1 ),
541 boost::detail::sp_forward<A2>( a2 ),
542 boost::detail::sp_forward<A3>( a3 ),
543 boost::detail::sp_forward<A4>( a4 ),
544 boost::detail::sp_forward<A5>( a5 ),
545 boost::detail::sp_forward<A6>( a6 ),
546 boost::detail::sp_forward<A7>( a7 )
549 pd->set_initialized();
551 T * pt2 = static_cast< T* >( pv );
553 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
554 return boost::shared_ptr< T >( pt, pt2 );
557 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
558 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 )
560 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
562 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
564 void * pv = pd->address();
567 boost::detail::sp_forward<A1>( a1 ),
568 boost::detail::sp_forward<A2>( a2 ),
569 boost::detail::sp_forward<A3>( a3 ),
570 boost::detail::sp_forward<A4>( a4 ),
571 boost::detail::sp_forward<A5>( a5 ),
572 boost::detail::sp_forward<A6>( a6 ),
573 boost::detail::sp_forward<A7>( a7 )
576 pd->set_initialized();
578 T * pt2 = static_cast< T* >( pv );
580 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
581 return boost::shared_ptr< T >( pt, pt2 );
584 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
585 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 )
587 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
589 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
591 void * pv = pd->address();
594 boost::detail::sp_forward<A1>( a1 ),
595 boost::detail::sp_forward<A2>( a2 ),
596 boost::detail::sp_forward<A3>( a3 ),
597 boost::detail::sp_forward<A4>( a4 ),
598 boost::detail::sp_forward<A5>( a5 ),
599 boost::detail::sp_forward<A6>( a6 ),
600 boost::detail::sp_forward<A7>( a7 ),
601 boost::detail::sp_forward<A8>( a8 )
604 pd->set_initialized();
606 T * pt2 = static_cast< T* >( pv );
608 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
609 return boost::shared_ptr< T >( pt, pt2 );
612 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
613 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 )
615 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
617 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
619 void * pv = pd->address();
622 boost::detail::sp_forward<A1>( a1 ),
623 boost::detail::sp_forward<A2>( a2 ),
624 boost::detail::sp_forward<A3>( a3 ),
625 boost::detail::sp_forward<A4>( a4 ),
626 boost::detail::sp_forward<A5>( a5 ),
627 boost::detail::sp_forward<A6>( a6 ),
628 boost::detail::sp_forward<A7>( a7 ),
629 boost::detail::sp_forward<A8>( a8 )
632 pd->set_initialized();
634 T * pt2 = static_cast< T* >( pv );
636 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
637 return boost::shared_ptr< T >( pt, pt2 );
640 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
641 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 )
643 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
645 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
647 void * pv = pd->address();
650 boost::detail::sp_forward<A1>( a1 ),
651 boost::detail::sp_forward<A2>( a2 ),
652 boost::detail::sp_forward<A3>( a3 ),
653 boost::detail::sp_forward<A4>( a4 ),
654 boost::detail::sp_forward<A5>( a5 ),
655 boost::detail::sp_forward<A6>( a6 ),
656 boost::detail::sp_forward<A7>( a7 ),
657 boost::detail::sp_forward<A8>( a8 ),
658 boost::detail::sp_forward<A9>( a9 )
661 pd->set_initialized();
663 T * pt2 = static_cast< T* >( pv );
665 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
666 return boost::shared_ptr< T >( pt, pt2 );
669 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
670 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 )
672 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
674 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
676 void * pv = pd->address();
679 boost::detail::sp_forward<A1>( a1 ),
680 boost::detail::sp_forward<A2>( a2 ),
681 boost::detail::sp_forward<A3>( a3 ),
682 boost::detail::sp_forward<A4>( a4 ),
683 boost::detail::sp_forward<A5>( a5 ),
684 boost::detail::sp_forward<A6>( a6 ),
685 boost::detail::sp_forward<A7>( a7 ),
686 boost::detail::sp_forward<A8>( a8 ),
687 boost::detail::sp_forward<A9>( a9 )
690 pd->set_initialized();
692 T * pt2 = static_cast< T* >( pv );
694 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
695 return boost::shared_ptr< T >( pt, pt2 );
702 template< class T, class A1 >
703 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 )
705 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
707 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
709 void * pv = pd->address();
712 pd->set_initialized();
714 T * pt2 = static_cast< T* >( pv );
716 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
717 return boost::shared_ptr< T >( pt, pt2 );
720 template< class T, class A, class A1 >
721 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1 )
723 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
725 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
727 void * pv = pd->address();
730 pd->set_initialized();
732 T * pt2 = static_cast< T* >( pv );
734 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
735 return boost::shared_ptr< T >( pt, pt2 );
738 template< class T, class A1, class A2 >
739 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2 )
741 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
743 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
745 void * pv = pd->address();
747 ::new( pv ) T( a1, a2 );
748 pd->set_initialized();
750 T * pt2 = static_cast< T* >( pv );
752 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
753 return boost::shared_ptr< T >( pt, pt2 );
756 template< class T, class A, class A1, class A2 >
757 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2 )
759 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
761 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
763 void * pv = pd->address();
765 ::new( pv ) T( a1, a2 );
766 pd->set_initialized();
768 T * pt2 = static_cast< T* >( pv );
770 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
771 return boost::shared_ptr< T >( pt, pt2 );
774 template< class T, class A1, class A2, class A3 >
775 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )
777 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
779 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
781 void * pv = pd->address();
783 ::new( pv ) T( a1, a2, a3 );
784 pd->set_initialized();
786 T * pt2 = static_cast< T* >( pv );
788 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
789 return boost::shared_ptr< T >( pt, pt2 );
792 template< class T, class A, class A1, class A2, class A3 >
793 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )
795 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
797 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
799 void * pv = pd->address();
801 ::new( pv ) T( a1, a2, a3 );
802 pd->set_initialized();
804 T * pt2 = static_cast< T* >( pv );
806 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
807 return boost::shared_ptr< T >( pt, pt2 );
810 template< class T, class A1, class A2, class A3, class A4 >
811 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
813 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
815 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
817 void * pv = pd->address();
819 ::new( pv ) T( a1, a2, a3, a4 );
820 pd->set_initialized();
822 T * pt2 = static_cast< T* >( pv );
824 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
825 return boost::shared_ptr< T >( pt, pt2 );
828 template< class T, class A, class A1, class A2, class A3, class A4 >
829 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 )
831 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
833 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
835 void * pv = pd->address();
837 ::new( pv ) T( a1, a2, a3, a4 );
838 pd->set_initialized();
840 T * pt2 = static_cast< T* >( pv );
842 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
843 return boost::shared_ptr< T >( pt, pt2 );
846 template< class T, class A1, class A2, class A3, class A4, class A5 >
847 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 )
849 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
851 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
853 void * pv = pd->address();
855 ::new( pv ) T( a1, a2, a3, a4, a5 );
856 pd->set_initialized();
858 T * pt2 = static_cast< T* >( pv );
860 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
861 return boost::shared_ptr< T >( pt, pt2 );
864 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
865 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 )
867 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
869 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
871 void * pv = pd->address();
873 ::new( pv ) T( a1, a2, a3, a4, a5 );
874 pd->set_initialized();
876 T * pt2 = static_cast< T* >( pv );
878 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
879 return boost::shared_ptr< T >( pt, pt2 );
882 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
883 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 )
885 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
887 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
889 void * pv = pd->address();
891 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
892 pd->set_initialized();
894 T * pt2 = static_cast< T* >( pv );
896 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
897 return boost::shared_ptr< T >( pt, pt2 );
900 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
901 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 )
903 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
905 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
907 void * pv = pd->address();
909 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
910 pd->set_initialized();
912 T * pt2 = static_cast< T* >( pv );
914 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
915 return boost::shared_ptr< T >( pt, pt2 );
918 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
919 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 )
921 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
923 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
925 void * pv = pd->address();
927 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
928 pd->set_initialized();
930 T * pt2 = static_cast< T* >( pv );
932 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
933 return boost::shared_ptr< T >( pt, pt2 );
936 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
937 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 )
939 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
941 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
943 void * pv = pd->address();
945 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
946 pd->set_initialized();
948 T * pt2 = static_cast< T* >( pv );
950 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
951 return boost::shared_ptr< T >( pt, pt2 );
954 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
955 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 )
957 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
959 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
961 void * pv = pd->address();
963 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
964 pd->set_initialized();
966 T * pt2 = static_cast< T* >( pv );
968 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
969 return boost::shared_ptr< T >( pt, pt2 );
972 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
973 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 )
975 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
977 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
979 void * pv = pd->address();
981 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
982 pd->set_initialized();
984 T * pt2 = static_cast< T* >( pv );
986 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
987 return boost::shared_ptr< T >( pt, pt2 );
990 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
991 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 )
993 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
995 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
997 void * pv = pd->address();
999 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1000 pd->set_initialized();
1002 T * pt2 = static_cast< T* >( pv );
1004 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1005 return boost::shared_ptr< T >( pt, pt2 );
1008 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
1009 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 )
1011 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1013 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1015 void * pv = pd->address();
1017 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1018 pd->set_initialized();
1020 T * pt2 = static_cast< T* >( pv );
1022 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1023 return boost::shared_ptr< T >( pt, pt2 );
1030 } // namespace boost
1032 #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED