]> git.lyx.org Git - lyx.git/blob - boost/boost/smart_ptr/make_shared_object.hpp
Update previews after doing a find/replace (#7242)
[lyx.git] / boost / boost / smart_ptr / make_shared_object.hpp
1 #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
2 #define BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
3
4 //  make_shared_object.hpp
5 //
6 //  Copyright (c) 2007, 2008, 2012 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/smart_ptr/detail/sp_forward.hpp>
18 #include <boost/type_traits/type_with_alignment.hpp>
19 #include <boost/type_traits/alignment_of.hpp>
20 #include <cstddef>
21 #include <new>
22
23 namespace boost
24 {
25
26 namespace detail
27 {
28
29 template< std::size_t N, std::size_t A > struct sp_aligned_storage
30 {
31     union type
32     {
33         char data_[ N ];
34         typename boost::type_with_alignment< A >::type align_;
35     };
36 };
37
38 template< class T > class sp_ms_deleter
39 {
40 private:
41
42     typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
43
44     bool initialized_;
45     storage_type storage_;
46
47 private:
48
49     void destroy()
50     {
51         if( initialized_ )
52         {
53 #if defined( __GNUC__ )
54
55             // fixes incorrect aliasing warning
56             T * p = reinterpret_cast< T* >( storage_.data_ );
57             p->~T();
58
59 #else
60
61             reinterpret_cast< T* >( storage_.data_ )->~T();
62
63 #endif
64
65             initialized_ = false;
66         }
67     }
68
69 public:
70
71     sp_ms_deleter() BOOST_NOEXCEPT : initialized_( false )
72     {
73     }
74
75     // optimization: do not copy storage_
76     sp_ms_deleter( sp_ms_deleter const & ) BOOST_NOEXCEPT : initialized_( false )
77     {
78     }
79
80     ~sp_ms_deleter()
81     {
82         destroy();
83     }
84
85     void operator()( T * )
86     {
87         destroy();
88     }
89
90     static void operator_fn( T* ) // operator() can't be static
91     {
92     }
93
94     void * address() BOOST_NOEXCEPT
95     {
96         return storage_.data_;
97     }
98
99     void set_initialized() BOOST_NOEXCEPT
100     {
101         initialized_ = true;
102     }
103 };
104
105 template< class T > struct sp_if_not_array
106 {
107     typedef boost::shared_ptr< T > type;
108 };
109
110 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
111
112 template< class T > struct sp_if_not_array< T[] >
113 {
114 };
115
116 #if !defined( __BORLANDC__ ) || !BOOST_WORKAROUND( __BORLANDC__, < 0x600 )
117
118 template< class T, std::size_t N > struct sp_if_not_array< T[N] >
119 {
120 };
121
122 #endif
123
124 #endif
125
126 } // namespace detail
127
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 > >()
130 #else
131 # define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
132 #endif
133
134 // Zero-argument versions
135 //
136 // Used even when variadic templates are available because of the new T() vs new T issue
137
138 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared()
139 {
140     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
141
142     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
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 template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit()
156 {
157     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
158
159     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
160
161     void * pv = pd->address();
162
163     ::new( pv ) T;
164     pd->set_initialized();
165
166     T * pt2 = static_cast< T* >( pv );
167
168     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
169     return boost::shared_ptr< T >( pt, pt2 );
170 }
171
172 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a )
173 {
174     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
175
176     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
177
178     void * pv = pd->address();
179
180     ::new( pv ) T();
181     pd->set_initialized();
182
183     T * pt2 = static_cast< T* >( pv );
184
185     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
186     return boost::shared_ptr< T >( pt, pt2 );
187 }
188
189 template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a )
190 {
191     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
192
193     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
194
195     void * pv = pd->address();
196
197     ::new( pv ) T;
198     pd->set_initialized();
199
200     T * pt2 = static_cast< T* >( pv );
201
202     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
203     return boost::shared_ptr< T >( pt, pt2 );
204 }
205
206 #if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
207
208 // Variadic templates, rvalue reference
209
210 template< class T, class Arg1, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Arg1 && arg1, Args && ... args )
211 {
212     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
213
214     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
215
216     void * pv = pd->address();
217
218     ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
219     pd->set_initialized();
220
221     T * pt2 = static_cast< T* >( pv );
222
223     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
224     return boost::shared_ptr< T >( pt, pt2 );
225 }
226
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 )
228 {
229     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
230
231     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
232
233     void * pv = pd->address();
234
235     ::new( pv ) T( boost::detail::sp_forward<Arg1>( arg1 ), boost::detail::sp_forward<Args>( args )... );
236     pd->set_initialized();
237
238     T * pt2 = static_cast< T* >( pv );
239
240     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
241     return boost::shared_ptr< T >( pt, pt2 );
242 }
243
244 #elif !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
245
246 // For example MSVC 10.0
247
248 template< class T, class A1 >
249 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 )
250 {
251     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
252
253     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
254
255     void * pv = pd->address();
256
257     ::new( pv ) T(
258         boost::detail::sp_forward<A1>( a1 )
259         );
260
261     pd->set_initialized();
262
263     T * pt2 = static_cast< T* >( pv );
264
265     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
266     return boost::shared_ptr< T >( pt, pt2 );
267 }
268
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 )
271 {
272     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
273
274     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
275
276     void * pv = pd->address();
277
278     ::new( pv ) T( 
279         boost::detail::sp_forward<A1>( a1 )
280         );
281
282     pd->set_initialized();
283
284     T * pt2 = static_cast< T* >( pv );
285
286     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
287     return boost::shared_ptr< T >( pt, pt2 );
288 }
289
290 template< class T, class A1, class A2 >
291 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2 )
292 {
293     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
294
295     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
296
297     void * pv = pd->address();
298
299     ::new( pv ) T(
300         boost::detail::sp_forward<A1>( a1 ), 
301         boost::detail::sp_forward<A2>( a2 )
302         );
303
304     pd->set_initialized();
305
306     T * pt2 = static_cast< T* >( pv );
307
308     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
309     return boost::shared_ptr< T >( pt, pt2 );
310 }
311
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 )
314 {
315     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
316
317     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
318
319     void * pv = pd->address();
320
321     ::new( pv ) T( 
322         boost::detail::sp_forward<A1>( a1 ), 
323         boost::detail::sp_forward<A2>( a2 )
324         );
325
326     pd->set_initialized();
327
328     T * pt2 = static_cast< T* >( pv );
329
330     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
331     return boost::shared_ptr< T >( pt, pt2 );
332 }
333
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 )
336 {
337     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
338
339     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
340
341     void * pv = pd->address();
342
343     ::new( pv ) T(
344         boost::detail::sp_forward<A1>( a1 ), 
345         boost::detail::sp_forward<A2>( a2 ), 
346         boost::detail::sp_forward<A3>( a3 )
347         );
348
349     pd->set_initialized();
350
351     T * pt2 = static_cast< T* >( pv );
352
353     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
354     return boost::shared_ptr< T >( pt, pt2 );
355 }
356
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 )
359 {
360     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
361
362     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
363
364     void * pv = pd->address();
365
366     ::new( pv ) T( 
367         boost::detail::sp_forward<A1>( a1 ), 
368         boost::detail::sp_forward<A2>( a2 ), 
369         boost::detail::sp_forward<A3>( a3 )
370         );
371
372     pd->set_initialized();
373
374     T * pt2 = static_cast< T* >( pv );
375
376     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
377     return boost::shared_ptr< T >( pt, pt2 );
378 }
379
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 )
382 {
383     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
384
385     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
386
387     void * pv = pd->address();
388
389     ::new( pv ) T(
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 )
394         );
395
396     pd->set_initialized();
397
398     T * pt2 = static_cast< T* >( pv );
399
400     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
401     return boost::shared_ptr< T >( pt, pt2 );
402 }
403
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 )
406 {
407     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
408
409     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
410
411     void * pv = pd->address();
412
413     ::new( pv ) T( 
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 )
418         );
419
420     pd->set_initialized();
421
422     T * pt2 = static_cast< T* >( pv );
423
424     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
425     return boost::shared_ptr< T >( pt, pt2 );
426 }
427
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 )
430 {
431     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
432
433     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
434
435     void * pv = pd->address();
436
437     ::new( pv ) T(
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 )
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 >
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 )
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 = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
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         );
469
470     pd->set_initialized();
471
472     T * pt2 = static_cast< T* >( pv );
473
474     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
475     return boost::shared_ptr< T >( pt, pt2 );
476 }
477
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 )
480 {
481     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
482
483     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
484
485     void * pv = pd->address();
486
487     ::new( pv ) T(
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 )
494         );
495
496     pd->set_initialized();
497
498     T * pt2 = static_cast< T* >( pv );
499
500     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
501     return boost::shared_ptr< T >( pt, pt2 );
502 }
503
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 )
506 {
507     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
508
509     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
510
511     void * pv = pd->address();
512
513     ::new( pv ) T( 
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 )
520         );
521
522     pd->set_initialized();
523
524     T * pt2 = static_cast< T* >( pv );
525
526     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
527     return boost::shared_ptr< T >( pt, pt2 );
528 }
529
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 )
532 {
533     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
534
535     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
536
537     void * pv = pd->address();
538
539     ::new( pv ) T(
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 )
547         );
548
549     pd->set_initialized();
550
551     T * pt2 = static_cast< T* >( pv );
552
553     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
554     return boost::shared_ptr< T >( pt, pt2 );
555 }
556
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 )
559 {
560     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
561
562     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
563
564     void * pv = pd->address();
565
566     ::new( pv ) T( 
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 )
574         );
575
576     pd->set_initialized();
577
578     T * pt2 = static_cast< T* >( pv );
579
580     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
581     return boost::shared_ptr< T >( pt, pt2 );
582 }
583
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 )
586 {
587     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
588
589     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
590
591     void * pv = pd->address();
592
593     ::new( pv ) T(
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 )
602         );
603
604     pd->set_initialized();
605
606     T * pt2 = static_cast< T* >( pv );
607
608     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
609     return boost::shared_ptr< T >( pt, pt2 );
610 }
611
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 )
614 {
615     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
616
617     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
618
619     void * pv = pd->address();
620
621     ::new( pv ) T( 
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 )
630         );
631
632     pd->set_initialized();
633
634     T * pt2 = static_cast< T* >( pv );
635
636     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
637     return boost::shared_ptr< T >( pt, pt2 );
638 }
639
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 )
642 {
643     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
644
645     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
646
647     void * pv = pd->address();
648
649     ::new( pv ) T(
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 )
659         );
660
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, 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 )
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 = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
675
676     void * pv = pd->address();
677
678     ::new( pv ) T( 
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 )
688         );
689
690     pd->set_initialized();
691
692     T * pt2 = static_cast< T* >( pv );
693
694     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
695     return boost::shared_ptr< T >( pt, pt2 );
696 }
697
698 #else
699
700 // C++03 version
701
702 template< class T, class A1 >
703 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 )
704 {
705     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
706
707     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
708
709     void * pv = pd->address();
710
711     ::new( pv ) T( a1 );
712     pd->set_initialized();
713
714     T * pt2 = static_cast< T* >( pv );
715
716     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
717     return boost::shared_ptr< T >( pt, pt2 );
718 }
719
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 )
722 {
723     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
724
725     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
726
727     void * pv = pd->address();
728
729     ::new( pv ) T( a1 );
730     pd->set_initialized();
731
732     T * pt2 = static_cast< T* >( pv );
733
734     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
735     return boost::shared_ptr< T >( pt, pt2 );
736 }
737
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 )
740 {
741     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
742
743     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
744
745     void * pv = pd->address();
746
747     ::new( pv ) T( a1, a2 );
748     pd->set_initialized();
749
750     T * pt2 = static_cast< T* >( pv );
751
752     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
753     return boost::shared_ptr< T >( pt, pt2 );
754 }
755
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 )
758 {
759     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
760
761     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
762
763     void * pv = pd->address();
764
765     ::new( pv ) T( a1, a2 );
766     pd->set_initialized();
767
768     T * pt2 = static_cast< T* >( pv );
769
770     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
771     return boost::shared_ptr< T >( pt, pt2 );
772 }
773
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 )
776 {
777     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
778
779     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
780
781     void * pv = pd->address();
782
783     ::new( pv ) T( a1, a2, a3 );
784     pd->set_initialized();
785
786     T * pt2 = static_cast< T* >( pv );
787
788     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
789     return boost::shared_ptr< T >( pt, pt2 );
790 }
791
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 )
794 {
795     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
796
797     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
798
799     void * pv = pd->address();
800
801     ::new( pv ) T( a1, a2, a3 );
802     pd->set_initialized();
803
804     T * pt2 = static_cast< T* >( pv );
805
806     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
807     return boost::shared_ptr< T >( pt, pt2 );
808 }
809
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 )
812 {
813     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
814
815     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
816
817     void * pv = pd->address();
818
819     ::new( pv ) T( a1, a2, a3, a4 );
820     pd->set_initialized();
821
822     T * pt2 = static_cast< T* >( pv );
823
824     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
825     return boost::shared_ptr< T >( pt, pt2 );
826 }
827
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 )
830 {
831     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
832
833     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
834
835     void * pv = pd->address();
836
837     ::new( pv ) T( a1, a2, a3, a4 );
838     pd->set_initialized();
839
840     T * pt2 = static_cast< T* >( pv );
841
842     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
843     return boost::shared_ptr< T >( pt, pt2 );
844 }
845
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 )
848 {
849     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
850
851     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
852
853     void * pv = pd->address();
854
855     ::new( pv ) T( a1, a2, a3, a4, a5 );
856     pd->set_initialized();
857
858     T * pt2 = static_cast< T* >( pv );
859
860     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
861     return boost::shared_ptr< T >( pt, pt2 );
862 }
863
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 )
866 {
867     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
868
869     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
870
871     void * pv = pd->address();
872
873     ::new( pv ) T( a1, a2, a3, a4, a5 );
874     pd->set_initialized();
875
876     T * pt2 = static_cast< T* >( pv );
877
878     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
879     return boost::shared_ptr< T >( pt, pt2 );
880 }
881
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 )
884 {
885     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
886
887     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
888
889     void * pv = pd->address();
890
891     ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
892     pd->set_initialized();
893
894     T * pt2 = static_cast< T* >( pv );
895
896     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
897     return boost::shared_ptr< T >( pt, pt2 );
898 }
899
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 )
902 {
903     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
904
905     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
906
907     void * pv = pd->address();
908
909     ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
910     pd->set_initialized();
911
912     T * pt2 = static_cast< T* >( pv );
913
914     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
915     return boost::shared_ptr< T >( pt, pt2 );
916 }
917
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 )
920 {
921     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
922
923     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
924
925     void * pv = pd->address();
926
927     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
928     pd->set_initialized();
929
930     T * pt2 = static_cast< T* >( pv );
931
932     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
933     return boost::shared_ptr< T >( pt, pt2 );
934 }
935
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 )
938 {
939     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
940
941     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
942
943     void * pv = pd->address();
944
945     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
946     pd->set_initialized();
947
948     T * pt2 = static_cast< T* >( pv );
949
950     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
951     return boost::shared_ptr< T >( pt, pt2 );
952 }
953
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 )
956 {
957     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
958
959     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
960
961     void * pv = pd->address();
962
963     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
964     pd->set_initialized();
965
966     T * pt2 = static_cast< T* >( pv );
967
968     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
969     return boost::shared_ptr< T >( pt, pt2 );
970 }
971
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 )
974 {
975     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
976
977     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
978
979     void * pv = pd->address();
980
981     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
982     pd->set_initialized();
983
984     T * pt2 = static_cast< T* >( pv );
985
986     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
987     return boost::shared_ptr< T >( pt, pt2 );
988 }
989
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 )
992 {
993     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
994
995     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
996
997     void * pv = pd->address();
998
999     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1000     pd->set_initialized();
1001
1002     T * pt2 = static_cast< T* >( pv );
1003
1004     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1005     return boost::shared_ptr< T >( pt, pt2 );
1006 }
1007
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 )
1010 {
1011     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
1012
1013     boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
1014
1015     void * pv = pd->address();
1016
1017     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
1018     pd->set_initialized();
1019
1020     T * pt2 = static_cast< T* >( pv );
1021
1022     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
1023     return boost::shared_ptr< T >( pt, pt2 );
1024 }
1025
1026 #endif
1027
1028 #undef BOOST_SP_MSD
1029
1030 } // namespace boost
1031
1032 #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED