1 #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
2 #define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
6 // Copyright (c) 2007, 2008 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/type_traits/type_with_alignment.hpp>
18 #include <boost/type_traits/alignment_of.hpp>
28 template< std::size_t N, std::size_t A > struct sp_aligned_storage
33 typename boost::type_with_alignment< A >::type align_;
37 template< class T > class sp_ms_deleter
41 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
44 storage_type storage_;
52 #if defined( __GNUC__ )
54 // fixes incorrect aliasing warning
55 T * p = reinterpret_cast< T* >( storage_.data_ );
60 reinterpret_cast< T* >( storage_.data_ )->~T();
70 sp_ms_deleter(): initialized_( false )
74 // optimization: do not copy storage_
75 sp_ms_deleter( sp_ms_deleter const & ): initialized_( false )
84 void operator()( T * )
91 return storage_.data_;
94 void set_initialized()
100 #if defined( BOOST_HAS_RVALUE_REFS )
102 template< class T > T&& sp_forward( T & t )
104 return static_cast< T&& >( t );
109 } // namespace detail
111 #if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
112 # define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
114 # define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
117 // Zero-argument versions
119 // Used even when variadic templates are available because of the new T() vs new T issue
121 template< class T > boost::shared_ptr< T > make_shared()
123 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
125 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
127 void * pv = pd->address();
130 pd->set_initialized();
132 T * pt2 = static_cast< T* >( pv );
134 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
135 return boost::shared_ptr< T >( pt, pt2 );
138 template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
140 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
142 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
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 #if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )
157 // Variadic templates, rvalue reference
159 template< class T, class Arg1, class... Args > boost::shared_ptr< T > make_shared( Arg1 && arg1, Args && ... args )
161 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
163 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
165 void * pv = pd->address();
167 ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
168 pd->set_initialized();
170 T * pt2 = static_cast< T* >( pv );
172 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
173 return boost::shared_ptr< T >( pt, pt2 );
176 template< class T, class A, class Arg1, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Arg1 && arg1, Args && ... args )
178 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
180 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
182 void * pv = pd->address();
184 ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
185 pd->set_initialized();
187 T * pt2 = static_cast< T* >( pv );
189 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
190 return boost::shared_ptr< T >( pt, pt2 );
193 #elif defined( BOOST_HAS_RVALUE_REFS )
195 // For example MSVC 10.0
197 template< class T, class A1 >
198 boost::shared_ptr< T > make_shared( A1 && a1 )
200 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
202 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
204 void * pv = pd->address();
207 boost::detail::sp_forward<A1>( a1 )
210 pd->set_initialized();
212 T * pt2 = static_cast< T* >( pv );
214 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
215 return boost::shared_ptr< T >( pt, pt2 );
218 template< class T, class A, class A1 >
219 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1 )
221 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
223 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
225 void * pv = pd->address();
228 boost::detail::sp_forward<A1>( a1 )
231 pd->set_initialized();
233 T * pt2 = static_cast< T* >( pv );
235 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
236 return boost::shared_ptr< T >( pt, pt2 );
239 template< class T, class A1, class A2 >
240 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2 )
242 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
244 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
246 void * pv = pd->address();
249 boost::detail::sp_forward<A1>( a1 ),
250 boost::detail::sp_forward<A2>( a2 )
253 pd->set_initialized();
255 T * pt2 = static_cast< T* >( pv );
257 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
258 return boost::shared_ptr< T >( pt, pt2 );
261 template< class T, class A, class A1, class A2 >
262 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2 )
264 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
266 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
268 void * pv = pd->address();
271 boost::detail::sp_forward<A1>( a1 ),
272 boost::detail::sp_forward<A2>( a2 )
275 pd->set_initialized();
277 T * pt2 = static_cast< T* >( pv );
279 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
280 return boost::shared_ptr< T >( pt, pt2 );
283 template< class T, class A1, class A2, class A3 >
284 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3 )
286 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
288 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
290 void * pv = pd->address();
293 boost::detail::sp_forward<A1>( a1 ),
294 boost::detail::sp_forward<A2>( a2 ),
295 boost::detail::sp_forward<A3>( a3 )
298 pd->set_initialized();
300 T * pt2 = static_cast< T* >( pv );
302 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
303 return boost::shared_ptr< T >( pt, pt2 );
306 template< class T, class A, class A1, class A2, class A3 >
307 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 )
309 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
311 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
313 void * pv = pd->address();
316 boost::detail::sp_forward<A1>( a1 ),
317 boost::detail::sp_forward<A2>( a2 ),
318 boost::detail::sp_forward<A3>( a3 )
321 pd->set_initialized();
323 T * pt2 = static_cast< T* >( pv );
325 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
326 return boost::shared_ptr< T >( pt, pt2 );
329 template< class T, class A1, class A2, class A3, class A4 >
330 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
332 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
334 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
336 void * pv = pd->address();
339 boost::detail::sp_forward<A1>( a1 ),
340 boost::detail::sp_forward<A2>( a2 ),
341 boost::detail::sp_forward<A3>( a3 ),
342 boost::detail::sp_forward<A4>( a4 )
345 pd->set_initialized();
347 T * pt2 = static_cast< T* >( pv );
349 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
350 return boost::shared_ptr< T >( pt, pt2 );
353 template< class T, class A, class A1, class A2, class A3, class A4 >
354 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
356 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
358 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
360 void * pv = pd->address();
363 boost::detail::sp_forward<A1>( a1 ),
364 boost::detail::sp_forward<A2>( a2 ),
365 boost::detail::sp_forward<A3>( a3 ),
366 boost::detail::sp_forward<A4>( a4 )
369 pd->set_initialized();
371 T * pt2 = static_cast< T* >( pv );
373 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
374 return boost::shared_ptr< T >( pt, pt2 );
377 template< class T, class A1, class A2, class A3, class A4, class A5 >
378 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
380 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
382 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
384 void * pv = pd->address();
387 boost::detail::sp_forward<A1>( a1 ),
388 boost::detail::sp_forward<A2>( a2 ),
389 boost::detail::sp_forward<A3>( a3 ),
390 boost::detail::sp_forward<A4>( a4 ),
391 boost::detail::sp_forward<A5>( a5 )
394 pd->set_initialized();
396 T * pt2 = static_cast< T* >( pv );
398 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
399 return boost::shared_ptr< T >( pt, pt2 );
402 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
403 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
405 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
407 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
409 void * pv = pd->address();
412 boost::detail::sp_forward<A1>( a1 ),
413 boost::detail::sp_forward<A2>( a2 ),
414 boost::detail::sp_forward<A3>( a3 ),
415 boost::detail::sp_forward<A4>( a4 ),
416 boost::detail::sp_forward<A5>( a5 )
419 pd->set_initialized();
421 T * pt2 = static_cast< T* >( pv );
423 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
424 return boost::shared_ptr< T >( pt, pt2 );
427 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
428 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
430 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
432 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
434 void * pv = pd->address();
437 boost::detail::sp_forward<A1>( a1 ),
438 boost::detail::sp_forward<A2>( a2 ),
439 boost::detail::sp_forward<A3>( a3 ),
440 boost::detail::sp_forward<A4>( a4 ),
441 boost::detail::sp_forward<A5>( a5 ),
442 boost::detail::sp_forward<A6>( a6 )
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, class A6 >
454 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
456 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
458 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
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 ),
468 boost::detail::sp_forward<A6>( a6 )
471 pd->set_initialized();
473 T * pt2 = static_cast< T* >( pv );
475 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
476 return boost::shared_ptr< T >( pt, pt2 );
479 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
480 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
482 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
484 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
486 void * pv = pd->address();
489 boost::detail::sp_forward<A1>( a1 ),
490 boost::detail::sp_forward<A2>( a2 ),
491 boost::detail::sp_forward<A3>( a3 ),
492 boost::detail::sp_forward<A4>( a4 ),
493 boost::detail::sp_forward<A5>( a5 ),
494 boost::detail::sp_forward<A6>( a6 ),
495 boost::detail::sp_forward<A7>( a7 )
498 pd->set_initialized();
500 T * pt2 = static_cast< T* >( pv );
502 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
503 return boost::shared_ptr< T >( pt, pt2 );
506 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
507 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
509 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
511 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
513 void * pv = pd->address();
516 boost::detail::sp_forward<A1>( a1 ),
517 boost::detail::sp_forward<A2>( a2 ),
518 boost::detail::sp_forward<A3>( a3 ),
519 boost::detail::sp_forward<A4>( a4 ),
520 boost::detail::sp_forward<A5>( a5 ),
521 boost::detail::sp_forward<A6>( a6 ),
522 boost::detail::sp_forward<A7>( a7 )
525 pd->set_initialized();
527 T * pt2 = static_cast< T* >( pv );
529 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
530 return boost::shared_ptr< T >( pt, pt2 );
533 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
534 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
536 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
538 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
540 void * pv = pd->address();
543 boost::detail::sp_forward<A1>( a1 ),
544 boost::detail::sp_forward<A2>( a2 ),
545 boost::detail::sp_forward<A3>( a3 ),
546 boost::detail::sp_forward<A4>( a4 ),
547 boost::detail::sp_forward<A5>( a5 ),
548 boost::detail::sp_forward<A6>( a6 ),
549 boost::detail::sp_forward<A7>( a7 ),
550 boost::detail::sp_forward<A8>( a8 )
553 pd->set_initialized();
555 T * pt2 = static_cast< T* >( pv );
557 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
558 return boost::shared_ptr< T >( pt, pt2 );
561 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
562 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
564 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
566 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
568 void * pv = pd->address();
571 boost::detail::sp_forward<A1>( a1 ),
572 boost::detail::sp_forward<A2>( a2 ),
573 boost::detail::sp_forward<A3>( a3 ),
574 boost::detail::sp_forward<A4>( a4 ),
575 boost::detail::sp_forward<A5>( a5 ),
576 boost::detail::sp_forward<A6>( a6 ),
577 boost::detail::sp_forward<A7>( a7 ),
578 boost::detail::sp_forward<A8>( a8 )
581 pd->set_initialized();
583 T * pt2 = static_cast< T* >( pv );
585 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
586 return boost::shared_ptr< T >( pt, pt2 );
589 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
590 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
592 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
594 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
596 void * pv = pd->address();
599 boost::detail::sp_forward<A1>( a1 ),
600 boost::detail::sp_forward<A2>( a2 ),
601 boost::detail::sp_forward<A3>( a3 ),
602 boost::detail::sp_forward<A4>( a4 ),
603 boost::detail::sp_forward<A5>( a5 ),
604 boost::detail::sp_forward<A6>( a6 ),
605 boost::detail::sp_forward<A7>( a7 ),
606 boost::detail::sp_forward<A8>( a8 ),
607 boost::detail::sp_forward<A9>( a9 )
610 pd->set_initialized();
612 T * pt2 = static_cast< T* >( pv );
614 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
615 return boost::shared_ptr< T >( pt, pt2 );
618 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
619 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
621 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
623 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
625 void * pv = pd->address();
628 boost::detail::sp_forward<A1>( a1 ),
629 boost::detail::sp_forward<A2>( a2 ),
630 boost::detail::sp_forward<A3>( a3 ),
631 boost::detail::sp_forward<A4>( a4 ),
632 boost::detail::sp_forward<A5>( a5 ),
633 boost::detail::sp_forward<A6>( a6 ),
634 boost::detail::sp_forward<A7>( a7 ),
635 boost::detail::sp_forward<A8>( a8 ),
636 boost::detail::sp_forward<A9>( a9 )
639 pd->set_initialized();
641 T * pt2 = static_cast< T* >( pv );
643 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
644 return boost::shared_ptr< T >( pt, pt2 );
651 template< class T, class A1 >
652 boost::shared_ptr< T > make_shared( A1 const & a1 )
654 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
656 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
658 void * pv = pd->address();
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 >
670 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 )
672 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
674 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
676 void * pv = pd->address();
679 pd->set_initialized();
681 T * pt2 = static_cast< T* >( pv );
683 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
684 return boost::shared_ptr< T >( pt, pt2 );
687 template< class T, class A1, class A2 >
688 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 )
690 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
692 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
694 void * pv = pd->address();
696 ::new( pv ) T( a1, a2 );
697 pd->set_initialized();
699 T * pt2 = static_cast< T* >( pv );
701 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
702 return boost::shared_ptr< T >( pt, pt2 );
705 template< class T, class A, class A1, class A2 >
706 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2 )
708 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
710 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
712 void * pv = pd->address();
714 ::new( pv ) T( a1, a2 );
715 pd->set_initialized();
717 T * pt2 = static_cast< T* >( pv );
719 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
720 return boost::shared_ptr< T >( pt, pt2 );
723 template< class T, class A1, class A2, class A3 >
724 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )
726 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
728 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
730 void * pv = pd->address();
732 ::new( pv ) T( a1, a2, a3 );
733 pd->set_initialized();
735 T * pt2 = static_cast< T* >( pv );
737 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
738 return boost::shared_ptr< T >( pt, pt2 );
741 template< class T, class A, class A1, class A2, class A3 >
742 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )
744 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
746 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
748 void * pv = pd->address();
750 ::new( pv ) T( a1, a2, a3 );
751 pd->set_initialized();
753 T * pt2 = static_cast< T* >( pv );
755 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
756 return boost::shared_ptr< T >( pt, pt2 );
759 template< class T, class A1, class A2, class A3, class A4 >
760 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
762 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
764 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
766 void * pv = pd->address();
768 ::new( pv ) T( a1, a2, a3, a4 );
769 pd->set_initialized();
771 T * pt2 = static_cast< T* >( pv );
773 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
774 return boost::shared_ptr< T >( pt, pt2 );
777 template< class T, class A, class A1, class A2, class A3, class A4 >
778 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )
780 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
782 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
784 void * pv = pd->address();
786 ::new( pv ) T( a1, a2, a3, a4 );
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 template< class T, class A1, class A2, class A3, class A4, class A5 >
796 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
798 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
800 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
802 void * pv = pd->address();
804 ::new( pv ) T( a1, a2, a3, a4, a5 );
805 pd->set_initialized();
807 T * pt2 = static_cast< T* >( pv );
809 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
810 return boost::shared_ptr< T >( pt, pt2 );
813 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
814 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )
816 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
818 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
820 void * pv = pd->address();
822 ::new( pv ) T( a1, a2, a3, a4, a5 );
823 pd->set_initialized();
825 T * pt2 = static_cast< T* >( pv );
827 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
828 return boost::shared_ptr< T >( pt, pt2 );
831 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
832 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
834 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
836 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
838 void * pv = pd->address();
840 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
841 pd->set_initialized();
843 T * pt2 = static_cast< T* >( pv );
845 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
846 return boost::shared_ptr< T >( pt, pt2 );
849 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
850 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )
852 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
854 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
856 void * pv = pd->address();
858 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
859 pd->set_initialized();
861 T * pt2 = static_cast< T* >( pv );
863 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
864 return boost::shared_ptr< T >( pt, pt2 );
867 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
868 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
870 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
872 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
874 void * pv = pd->address();
876 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
877 pd->set_initialized();
879 T * pt2 = static_cast< T* >( pv );
881 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
882 return boost::shared_ptr< T >( pt, pt2 );
885 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
886 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )
888 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
890 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
892 void * pv = pd->address();
894 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
895 pd->set_initialized();
897 T * pt2 = static_cast< T* >( pv );
899 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
900 return boost::shared_ptr< T >( pt, pt2 );
903 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
904 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
906 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
908 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
910 void * pv = pd->address();
912 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
913 pd->set_initialized();
915 T * pt2 = static_cast< T* >( pv );
917 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
918 return boost::shared_ptr< T >( pt, pt2 );
921 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
922 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )
924 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
926 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
928 void * pv = pd->address();
930 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
931 pd->set_initialized();
933 T * pt2 = static_cast< T* >( pv );
935 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
936 return boost::shared_ptr< T >( pt, pt2 );
939 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
940 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
942 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
944 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
946 void * pv = pd->address();
948 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
949 pd->set_initialized();
951 T * pt2 = static_cast< T* >( pv );
953 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
954 return boost::shared_ptr< T >( pt, pt2 );
957 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
958 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )
960 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
962 boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
964 void * pv = pd->address();
966 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
967 pd->set_initialized();
969 T * pt2 = static_cast< T* >( pv );
971 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
972 return boost::shared_ptr< T >( pt, pt2 );
981 #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED