]> git.lyx.org Git - lyx.git/blob - boost/boost/smart_ptr/make_shared.hpp
Don't allow newline characters in document settings.
[lyx.git] / boost / boost / smart_ptr / make_shared.hpp
1 #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
2 #define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
3
4 //  make_shared.hpp
5 //
6 //  Copyright (c) 2007, 2008 Peter Dimov
7 //
8 //  Distributed under the Boost Software License, Version 1.0.
9 //  See accompanying file LICENSE_1_0.txt or copy at
10 //  http://www.boost.org/LICENSE_1_0.txt
11 //
12 //  See http://www.boost.org/libs/smart_ptr/make_shared.html
13 //  for documentation.
14
15 #include <boost/config.hpp>
16 #include <boost/smart_ptr/shared_ptr.hpp>
17 #include <boost/type_traits/type_with_alignment.hpp>
18 #include <boost/type_traits/alignment_of.hpp>
19 #include <cstddef>
20 #include <new>
21
22 namespace boost
23 {
24
25 namespace detail
26 {
27
28 template< std::size_t N, std::size_t A > struct sp_aligned_storage
29 {
30     union type
31     {
32         char data_[ N ];
33         typename boost::type_with_alignment< A >::type align_;
34     };
35 };
36
37 template< class T > class sp_ms_deleter
38 {
39 private:
40
41     typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
42
43     bool initialized_;
44     storage_type storage_;
45
46 private:
47
48     void destroy()
49     {
50         if( initialized_ )
51         {
52 #if defined( __GNUC__ )
53
54             // fixes incorrect aliasing warning
55             T * p = reinterpret_cast< T* >( storage_.data_ );
56             p->~T();
57
58 #else
59
60             reinterpret_cast< T* >( storage_.data_ )->~T();
61
62 #endif
63
64             initialized_ = false;
65         }
66     }
67
68 public:
69
70     sp_ms_deleter(): initialized_( false )
71     {
72     }
73
74     // optimization: do not copy storage_
75     sp_ms_deleter( sp_ms_deleter const & ): initialized_( false )
76     {
77     }
78
79     ~sp_ms_deleter()
80     {
81         destroy();
82     }
83
84     void operator()( T * )
85     {
86         destroy();
87     }
88
89     void * address()
90     {
91         return storage_.data_;
92     }
93
94     void set_initialized()
95     {
96         initialized_ = true;
97     }
98 };
99
100 #if defined( BOOST_HAS_RVALUE_REFS )
101
102 template< class T > T&& sp_forward( T & t )
103 {
104     return static_cast< T&& >( t );
105 }
106
107 #endif
108
109 } // namespace detail
110
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 > >()
113 #else
114 # define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
115 #endif
116
117 // Zero-argument versions
118 //
119 // Used even when variadic templates are available because of the new T() vs new T issue
120
121 template< class T > boost::shared_ptr< T > make_shared()
122 {
123     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
124
125     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
126
127     void * pv = pd->address();
128
129     ::new( pv ) T();
130     pd->set_initialized();
131
132     T * pt2 = static_cast< T* >( pv );
133
134     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
135     return boost::shared_ptr< T >( pt, pt2 );
136 }
137
138 template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
139 {
140     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
141
142     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
143
144     void * pv = pd->address();
145
146     ::new( pv ) T();
147     pd->set_initialized();
148
149     T * pt2 = static_cast< T* >( pv );
150
151     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
152     return boost::shared_ptr< T >( pt, pt2 );
153 }
154
155 #if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )
156
157 // Variadic templates, rvalue reference
158
159 template< class T, class Arg1, class... Args > boost::shared_ptr< T > make_shared( Arg1 && arg1, Args && ... args )
160 {
161     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
162
163     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
164
165     void * pv = pd->address();
166
167     ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
168     pd->set_initialized();
169
170     T * pt2 = static_cast< T* >( pv );
171
172     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
173     return boost::shared_ptr< T >( pt, pt2 );
174 }
175
176 template< class T, class A, class Arg1, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Arg1 && arg1, Args && ... args )
177 {
178     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
179
180     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
181
182     void * pv = pd->address();
183
184     ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
185     pd->set_initialized();
186
187     T * pt2 = static_cast< T* >( pv );
188
189     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
190     return boost::shared_ptr< T >( pt, pt2 );
191 }
192
193 #elif defined( BOOST_HAS_RVALUE_REFS )
194
195 // For example MSVC 10.0
196
197 template< class T, class A1 >
198 boost::shared_ptr< T > make_shared( A1 && a1 )
199 {
200     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
201
202     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
203
204     void * pv = pd->address();
205
206     ::new( pv ) T(
207         boost::detail::sp_forward<A1>( a1 )
208         );
209
210     pd->set_initialized();
211
212     T * pt2 = static_cast< T* >( pv );
213
214     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
215     return boost::shared_ptr< T >( pt, pt2 );
216 }
217
218 template< class T, class A, class A1 >
219 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1 )
220 {
221     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
222
223     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
224
225     void * pv = pd->address();
226
227     ::new( pv ) T( 
228         boost::detail::sp_forward<A1>( a1 )
229         );
230
231     pd->set_initialized();
232
233     T * pt2 = static_cast< T* >( pv );
234
235     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
236     return boost::shared_ptr< T >( pt, pt2 );
237 }
238
239 template< class T, class A1, class A2 >
240 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2 )
241 {
242     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
243
244     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
245
246     void * pv = pd->address();
247
248     ::new( pv ) T(
249         boost::detail::sp_forward<A1>( a1 ), 
250         boost::detail::sp_forward<A2>( a2 )
251         );
252
253     pd->set_initialized();
254
255     T * pt2 = static_cast< T* >( pv );
256
257     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
258     return boost::shared_ptr< T >( pt, pt2 );
259 }
260
261 template< class T, class A, class A1, class A2 >
262 boost::shared_ptr< T > allocate_shared( A const & a, A1 && a1, A2 && a2 )
263 {
264     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
265
266     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
267
268     void * pv = pd->address();
269
270     ::new( pv ) T( 
271         boost::detail::sp_forward<A1>( a1 ), 
272         boost::detail::sp_forward<A2>( a2 )
273         );
274
275     pd->set_initialized();
276
277     T * pt2 = static_cast< T* >( pv );
278
279     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
280     return boost::shared_ptr< T >( pt, pt2 );
281 }
282
283 template< class T, class A1, class A2, class A3 >
284 boost::shared_ptr< T > make_shared( A1 && a1, A2 && a2, A3 && a3 )
285 {
286     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
287
288     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
289
290     void * pv = pd->address();
291
292     ::new( pv ) T(
293         boost::detail::sp_forward<A1>( a1 ), 
294         boost::detail::sp_forward<A2>( a2 ), 
295         boost::detail::sp_forward<A3>( a3 )
296         );
297
298     pd->set_initialized();
299
300     T * pt2 = static_cast< T* >( pv );
301
302     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
303     return boost::shared_ptr< T >( pt, pt2 );
304 }
305
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 )
308 {
309     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
310
311     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
312
313     void * pv = pd->address();
314
315     ::new( pv ) T( 
316         boost::detail::sp_forward<A1>( a1 ), 
317         boost::detail::sp_forward<A2>( a2 ), 
318         boost::detail::sp_forward<A3>( a3 )
319         );
320
321     pd->set_initialized();
322
323     T * pt2 = static_cast< T* >( pv );
324
325     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
326     return boost::shared_ptr< T >( pt, pt2 );
327 }
328
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 )
331 {
332     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
333
334     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
335
336     void * pv = pd->address();
337
338     ::new( pv ) T(
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 )
343         );
344
345     pd->set_initialized();
346
347     T * pt2 = static_cast< T* >( pv );
348
349     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
350     return boost::shared_ptr< T >( pt, pt2 );
351 }
352
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 )
355 {
356     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
357
358     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
359
360     void * pv = pd->address();
361
362     ::new( pv ) T( 
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 )
367         );
368
369     pd->set_initialized();
370
371     T * pt2 = static_cast< T* >( pv );
372
373     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
374     return boost::shared_ptr< T >( pt, pt2 );
375 }
376
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 )
379 {
380     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
381
382     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
383
384     void * pv = pd->address();
385
386     ::new( pv ) T(
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 )
392         );
393
394     pd->set_initialized();
395
396     T * pt2 = static_cast< T* >( pv );
397
398     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
399     return boost::shared_ptr< T >( pt, pt2 );
400 }
401
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 )
404 {
405     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
406
407     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
408
409     void * pv = pd->address();
410
411     ::new( pv ) T( 
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 )
417         );
418
419     pd->set_initialized();
420
421     T * pt2 = static_cast< T* >( pv );
422
423     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
424     return boost::shared_ptr< T >( pt, pt2 );
425 }
426
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 )
429 {
430     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
431
432     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
433
434     void * pv = pd->address();
435
436     ::new( pv ) T(
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 )
443         );
444
445     pd->set_initialized();
446
447     T * pt2 = static_cast< T* >( pv );
448
449     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
450     return boost::shared_ptr< T >( pt, pt2 );
451 }
452
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 )
455 {
456     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
457
458     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
459
460     void * pv = pd->address();
461
462     ::new( pv ) T( 
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 )
469         );
470
471     pd->set_initialized();
472
473     T * pt2 = static_cast< T* >( pv );
474
475     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
476     return boost::shared_ptr< T >( pt, pt2 );
477 }
478
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 )
481 {
482     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
483
484     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
485
486     void * pv = pd->address();
487
488     ::new( pv ) T(
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 )
496         );
497
498     pd->set_initialized();
499
500     T * pt2 = static_cast< T* >( pv );
501
502     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
503     return boost::shared_ptr< T >( pt, pt2 );
504 }
505
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 )
508 {
509     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
510
511     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
512
513     void * pv = pd->address();
514
515     ::new( pv ) T( 
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 )
523         );
524
525     pd->set_initialized();
526
527     T * pt2 = static_cast< T* >( pv );
528
529     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
530     return boost::shared_ptr< T >( pt, pt2 );
531 }
532
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 )
535 {
536     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
537
538     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
539
540     void * pv = pd->address();
541
542     ::new( pv ) T(
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 )
551         );
552
553     pd->set_initialized();
554
555     T * pt2 = static_cast< T* >( pv );
556
557     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
558     return boost::shared_ptr< T >( pt, pt2 );
559 }
560
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 )
563 {
564     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
565
566     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
567
568     void * pv = pd->address();
569
570     ::new( pv ) T( 
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 )
579         );
580
581     pd->set_initialized();
582
583     T * pt2 = static_cast< T* >( pv );
584
585     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
586     return boost::shared_ptr< T >( pt, pt2 );
587 }
588
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 )
591 {
592     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
593
594     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
595
596     void * pv = pd->address();
597
598     ::new( pv ) T(
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 )
608         );
609
610     pd->set_initialized();
611
612     T * pt2 = static_cast< T* >( pv );
613
614     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
615     return boost::shared_ptr< T >( pt, pt2 );
616 }
617
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 )
620 {
621     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
622
623     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
624
625     void * pv = pd->address();
626
627     ::new( pv ) T( 
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 )
637         );
638
639     pd->set_initialized();
640
641     T * pt2 = static_cast< T* >( pv );
642
643     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
644     return boost::shared_ptr< T >( pt, pt2 );
645 }
646
647 #else
648
649 // C++03 version
650
651 template< class T, class A1 >
652 boost::shared_ptr< T > make_shared( A1 const & a1 )
653 {
654     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
655
656     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
657
658     void * pv = pd->address();
659
660     ::new( pv ) T( a1 );
661     pd->set_initialized();
662
663     T * pt2 = static_cast< T* >( pv );
664
665     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
666     return boost::shared_ptr< T >( pt, pt2 );
667 }
668
669 template< class T, class A, class A1 >
670 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 )
671 {
672     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
673
674     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
675
676     void * pv = pd->address();
677
678     ::new( pv ) T( a1 );
679     pd->set_initialized();
680
681     T * pt2 = static_cast< T* >( pv );
682
683     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
684     return boost::shared_ptr< T >( pt, pt2 );
685 }
686
687 template< class T, class A1, class A2 >
688 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 )
689 {
690     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
691
692     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
693
694     void * pv = pd->address();
695
696     ::new( pv ) T( a1, a2 );
697     pd->set_initialized();
698
699     T * pt2 = static_cast< T* >( pv );
700
701     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
702     return boost::shared_ptr< T >( pt, pt2 );
703 }
704
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 )
707 {
708     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
709
710     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
711
712     void * pv = pd->address();
713
714     ::new( pv ) T( a1, a2 );
715     pd->set_initialized();
716
717     T * pt2 = static_cast< T* >( pv );
718
719     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
720     return boost::shared_ptr< T >( pt, pt2 );
721 }
722
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 )
725 {
726     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
727
728     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
729
730     void * pv = pd->address();
731
732     ::new( pv ) T( a1, a2, a3 );
733     pd->set_initialized();
734
735     T * pt2 = static_cast< T* >( pv );
736
737     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
738     return boost::shared_ptr< T >( pt, pt2 );
739 }
740
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 )
743 {
744     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
745
746     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
747
748     void * pv = pd->address();
749
750     ::new( pv ) T( a1, a2, a3 );
751     pd->set_initialized();
752
753     T * pt2 = static_cast< T* >( pv );
754
755     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
756     return boost::shared_ptr< T >( pt, pt2 );
757 }
758
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 )
761 {
762     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
763
764     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
765
766     void * pv = pd->address();
767
768     ::new( pv ) T( a1, a2, a3, a4 );
769     pd->set_initialized();
770
771     T * pt2 = static_cast< T* >( pv );
772
773     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
774     return boost::shared_ptr< T >( pt, pt2 );
775 }
776
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 )
779 {
780     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
781
782     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
783
784     void * pv = pd->address();
785
786     ::new( pv ) T( a1, a2, a3, a4 );
787     pd->set_initialized();
788
789     T * pt2 = static_cast< T* >( pv );
790
791     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
792     return boost::shared_ptr< T >( pt, pt2 );
793 }
794
795 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 )
797 {
798     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
799
800     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
801
802     void * pv = pd->address();
803
804     ::new( pv ) T( a1, a2, a3, a4, a5 );
805     pd->set_initialized();
806
807     T * pt2 = static_cast< T* >( pv );
808
809     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
810     return boost::shared_ptr< T >( pt, pt2 );
811 }
812
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 )
815 {
816     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
817
818     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
819
820     void * pv = pd->address();
821
822     ::new( pv ) T( a1, a2, a3, a4, a5 );
823     pd->set_initialized();
824
825     T * pt2 = static_cast< T* >( pv );
826
827     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
828     return boost::shared_ptr< T >( pt, pt2 );
829 }
830
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 )
833 {
834     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
835
836     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
837
838     void * pv = pd->address();
839
840     ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
841     pd->set_initialized();
842
843     T * pt2 = static_cast< T* >( pv );
844
845     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
846     return boost::shared_ptr< T >( pt, pt2 );
847 }
848
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 )
851 {
852     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
853
854     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
855
856     void * pv = pd->address();
857
858     ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
859     pd->set_initialized();
860
861     T * pt2 = static_cast< T* >( pv );
862
863     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
864     return boost::shared_ptr< T >( pt, pt2 );
865 }
866
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 )
869 {
870     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
871
872     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
873
874     void * pv = pd->address();
875
876     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
877     pd->set_initialized();
878
879     T * pt2 = static_cast< T* >( pv );
880
881     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
882     return boost::shared_ptr< T >( pt, pt2 );
883 }
884
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 )
887 {
888     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
889
890     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
891
892     void * pv = pd->address();
893
894     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
895     pd->set_initialized();
896
897     T * pt2 = static_cast< T* >( pv );
898
899     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
900     return boost::shared_ptr< T >( pt, pt2 );
901 }
902
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 )
905 {
906     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
907
908     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
909
910     void * pv = pd->address();
911
912     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
913     pd->set_initialized();
914
915     T * pt2 = static_cast< T* >( pv );
916
917     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
918     return boost::shared_ptr< T >( pt, pt2 );
919 }
920
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 )
923 {
924     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
925
926     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
927
928     void * pv = pd->address();
929
930     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
931     pd->set_initialized();
932
933     T * pt2 = static_cast< T* >( pv );
934
935     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
936     return boost::shared_ptr< T >( pt, pt2 );
937 }
938
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 )
941 {
942     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
943
944     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
945
946     void * pv = pd->address();
947
948     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
949     pd->set_initialized();
950
951     T * pt2 = static_cast< T* >( pv );
952
953     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
954     return boost::shared_ptr< T >( pt, pt2 );
955 }
956
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 )
959 {
960     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
961
962     boost::detail::sp_ms_deleter< T > * pd = boost::get_deleter< boost::detail::sp_ms_deleter< T > >( pt );
963
964     void * pv = pd->address();
965
966     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
967     pd->set_initialized();
968
969     T * pt2 = static_cast< T* >( pv );
970
971     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
972     return boost::shared_ptr< T >( pt, pt2 );
973 }
974
975 #endif
976
977 #undef BOOST_SP_MSD
978
979 } // namespace boost
980
981 #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED