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/ for documentation.
13
14#include <boost/smart_ptr/detail/requires_cxx11.hpp>
15#include <boost/config.hpp>
16#include <boost/move/core.hpp>
17#include <boost/move/utility_core.hpp>
18#include <boost/smart_ptr/shared_ptr.hpp>
19#include <boost/smart_ptr/detail/sp_forward.hpp>
20#include <boost/smart_ptr/detail/sp_noexcept.hpp>
21#include <boost/type_traits/type_with_alignment.hpp>
22#include <boost/type_traits/alignment_of.hpp>
23#include <cstddef>
24#include <new>
25
26namespace boost
27{
28
29namespace detail
30{
31
32template< std::size_t N, std::size_t A > struct sp_aligned_storage
33{
34 union type
35 {
36 char data_[ N ];
37 typename boost::type_with_alignment< A >::type align_;
38 };
39};
40
41template< class T > class sp_ms_deleter
42{
43private:
44
45 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
46
47 bool initialized_;
48 storage_type storage_;
49
50private:
51
52 void destroy() BOOST_SP_NOEXCEPT
53 {
54 if( initialized_ )
55 {
56#if defined( __GNUC__ )
57
58 // fixes incorrect aliasing warning
59 T * p = reinterpret_cast< T* >( storage_.data_ );
60 p->~T();
61
62#else
63
64 reinterpret_cast< T* >( storage_.data_ )->~T();
65
66#endif
67
68 initialized_ = false;
69 }
70 }
71
72public:
73
74 sp_ms_deleter() BOOST_SP_NOEXCEPT : initialized_( false )
75 {
76 }
77
78 template<class A> explicit sp_ms_deleter( A const & ) BOOST_SP_NOEXCEPT : initialized_( false )
79 {
80 }
81
82 // optimization: do not copy storage_
83 sp_ms_deleter( sp_ms_deleter const & ) BOOST_SP_NOEXCEPT : initialized_( false )
84 {
85 }
86
87 ~sp_ms_deleter() BOOST_SP_NOEXCEPT
88 {
89 destroy();
90 }
91
92 void operator()( T * ) BOOST_SP_NOEXCEPT
93 {
94 destroy();
95 }
96
97 static void operator_fn( T* ) BOOST_SP_NOEXCEPT // operator() can't be static
98 {
99 }
100
101 void * address() BOOST_SP_NOEXCEPT
102 {
103 return storage_.data_;
104 }
105
106 void set_initialized() BOOST_SP_NOEXCEPT
107 {
108 initialized_ = true;
109 }
110};
111
112template< class T, class A > class sp_as_deleter
113{
114private:
115
116 typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
117
118 storage_type storage_;
119 A a_;
120 bool initialized_;
121
122private:
123
124 void destroy() BOOST_SP_NOEXCEPT
125 {
126 if( initialized_ )
127 {
128 T * p = reinterpret_cast< T* >( storage_.data_ );
129
130#if !defined( BOOST_NO_CXX11_ALLOCATOR )
131
132 std::allocator_traits<A>::destroy( a_, p );
133
134#else
135
136 p->~T();
137
138#endif
139
140 initialized_ = false;
141 }
142 }
143
144public:
145
146 sp_as_deleter( A const & a ) BOOST_SP_NOEXCEPT : a_( a ), initialized_( false )
147 {
148 }
149
150 // optimization: do not copy storage_
151 sp_as_deleter( sp_as_deleter const & r ) BOOST_SP_NOEXCEPT : a_( r.a_), initialized_( false )
152 {
153 }
154
155 ~sp_as_deleter() BOOST_SP_NOEXCEPT
156 {
157 destroy();
158 }
159
160 void operator()( T * ) BOOST_SP_NOEXCEPT
161 {
162 destroy();
163 }
164
165 static void operator_fn( T* ) BOOST_SP_NOEXCEPT // operator() can't be static
166 {
167 }
168
169 void * address() BOOST_SP_NOEXCEPT
170 {
171 return storage_.data_;
172 }
173
174 void set_initialized() BOOST_SP_NOEXCEPT
175 {
176 initialized_ = true;
177 }
178};
179
180template< class T > struct sp_if_not_array
181{
182 typedef boost::shared_ptr< T > type;
183};
184
185#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
186
187template< class T > struct sp_if_not_array< T[] >
188{
189};
190
191#if !defined( BOOST_BORLANDC ) || !BOOST_WORKAROUND( BOOST_BORLANDC, < 0x600 )
192
193template< class T, std::size_t N > struct sp_if_not_array< T[N] >
194{
195};
196
197#endif
198
199#endif
200
201} // namespace detail
202
203#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
204# define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
205#else
206# define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
207#endif
208
209// _noinit versions
210
211template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit()
212{
213 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
214
215 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
216
217 void * pv = pd->address();
218
219 ::new( pv ) T;
220 pd->set_initialized();
221
222 T * pt2 = static_cast< T* >( pv );
223
224 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
225 return boost::shared_ptr< T >( pt, pt2 );
226}
227
228template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a )
229{
230 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
231
232 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
233
234 void * pv = pd->address();
235
236 ::new( pv ) T;
237 pd->set_initialized();
238
239 T * pt2 = static_cast< T* >( pv );
240
241 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
242 return boost::shared_ptr< T >( pt, pt2 );
243}
244
245#if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
246
247// Variadic templates, rvalue reference
248
249template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
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( boost::detail::sp_forward<Args>( args )... );
258 pd->set_initialized();
259
260 T * pt2 = static_cast< T* >( pv );
261
262 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
263 return boost::shared_ptr< T >( pt, pt2 );
264}
265
266template< class T, class A, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Args && ... args )
267{
268#if !defined( BOOST_NO_CXX11_ALLOCATOR )
269
270 typedef typename std::allocator_traits<A>::template rebind_alloc<T> A2;
271 A2 a2( a );
272
273 typedef boost::detail::sp_as_deleter< T, A2 > D;
274
275 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a2 );
276
277#else
278
279 typedef boost::detail::sp_ms_deleter< T > D;
280
281 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a );
282
283#endif
284
285 D * pd = static_cast< D* >( pt._internal_get_untyped_deleter() );
286 void * pv = pd->address();
287
288#if !defined( BOOST_NO_CXX11_ALLOCATOR )
289
290 std::allocator_traits<A2>::construct( a2, static_cast< T* >( pv ), boost::detail::sp_forward<Args>( args )... );
291
292#else
293
294 ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
295
296#endif
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#else // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
307
308// Common zero-argument versions
309
310template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared()
311{
312 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
313
314 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
315
316 void * pv = pd->address();
317
318 ::new( pv ) T();
319 pd->set_initialized();
320
321 T * pt2 = static_cast< T* >( pv );
322
323 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
324 return boost::shared_ptr< T >( pt, pt2 );
325}
326
327template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a )
328{
329 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
330
331 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
332
333 void * pv = pd->address();
334
335 ::new( pv ) T();
336 pd->set_initialized();
337
338 T * pt2 = static_cast< T* >( pv );
339
340 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
341 return boost::shared_ptr< T >( pt, pt2 );
342}
343
344// C++03 version
345
346template< class T, class A1 >
347typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1 )
348{
349 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
350
351 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
352
353 void * pv = pd->address();
354
355 ::new( pv ) T(
356 boost::forward<A1>( a1 )
357 );
358
359 pd->set_initialized();
360
361 T * pt2 = static_cast< T* >( pv );
362
363 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
364 return boost::shared_ptr< T >( pt, pt2 );
365}
366
367template< class T, class A, class A1 >
368typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1 )
369{
370 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
371
372 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
373
374 void * pv = pd->address();
375
376 ::new( pv ) T(
377 boost::forward<A1>( a1 )
378 );
379
380 pd->set_initialized();
381
382 T * pt2 = static_cast< T* >( pv );
383
384 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
385 return boost::shared_ptr< T >( pt, pt2 );
386}
387
388template< class T, class A1, class A2 >
389typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
390{
391 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
392
393 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
394
395 void * pv = pd->address();
396
397 ::new( pv ) T(
398 boost::forward<A1>( a1 ),
399 boost::forward<A2>( a2 )
400 );
401
402 pd->set_initialized();
403
404 T * pt2 = static_cast< T* >( pv );
405
406 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
407 return boost::shared_ptr< T >( pt, pt2 );
408}
409
410template< class T, class A, class A1, class A2 >
411typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
412{
413 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
414
415 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
416
417 void * pv = pd->address();
418
419 ::new( pv ) T(
420 boost::forward<A1>( a1 ),
421 boost::forward<A2>( a2 )
422 );
423
424 pd->set_initialized();
425
426 T * pt2 = static_cast< T* >( pv );
427
428 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
429 return boost::shared_ptr< T >( pt, pt2 );
430}
431
432template< class T, class A1, class A2, class A3 >
433typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
434{
435 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
436
437 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
438
439 void * pv = pd->address();
440
441 ::new( pv ) T(
442 boost::forward<A1>( a1 ),
443 boost::forward<A2>( a2 ),
444 boost::forward<A3>( a3 )
445 );
446
447 pd->set_initialized();
448
449 T * pt2 = static_cast< T* >( pv );
450
451 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
452 return boost::shared_ptr< T >( pt, pt2 );
453}
454
455template< class T, class A, class A1, class A2, class A3 >
456typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
457{
458 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
459
460 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
461
462 void * pv = pd->address();
463
464 ::new( pv ) T(
465 boost::forward<A1>( a1 ),
466 boost::forward<A2>( a2 ),
467 boost::forward<A3>( a3 )
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
478template< class T, class A1, class A2, class A3, class A4 >
479typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
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::forward<A1>( a1 ),
489 boost::forward<A2>( a2 ),
490 boost::forward<A3>( a3 ),
491 boost::forward<A4>( a4 )
492 );
493
494 pd->set_initialized();
495
496 T * pt2 = static_cast< T* >( pv );
497
498 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
499 return boost::shared_ptr< T >( pt, pt2 );
500}
501
502template< class T, class A, class A1, class A2, class A3, class A4 >
503typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
504{
505 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
506
507 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
508
509 void * pv = pd->address();
510
511 ::new( pv ) T(
512 boost::forward<A1>( a1 ),
513 boost::forward<A2>( a2 ),
514 boost::forward<A3>( a3 ),
515 boost::forward<A4>( a4 )
516 );
517
518 pd->set_initialized();
519
520 T * pt2 = static_cast< T* >( pv );
521
522 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
523 return boost::shared_ptr< T >( pt, pt2 );
524}
525
526template< class T, class A1, class A2, class A3, class A4, class A5 >
527typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
528{
529 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
530
531 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
532
533 void * pv = pd->address();
534
535 ::new( pv ) T(
536 boost::forward<A1>( a1 ),
537 boost::forward<A2>( a2 ),
538 boost::forward<A3>( a3 ),
539 boost::forward<A4>( a4 ),
540 boost::forward<A5>( a5 )
541 );
542
543 pd->set_initialized();
544
545 T * pt2 = static_cast< T* >( pv );
546
547 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
548 return boost::shared_ptr< T >( pt, pt2 );
549}
550
551template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
552typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
553{
554 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
555
556 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
557
558 void * pv = pd->address();
559
560 ::new( pv ) T(
561 boost::forward<A1>( a1 ),
562 boost::forward<A2>( a2 ),
563 boost::forward<A3>( a3 ),
564 boost::forward<A4>( a4 ),
565 boost::forward<A5>( a5 )
566 );
567
568 pd->set_initialized();
569
570 T * pt2 = static_cast< T* >( pv );
571
572 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
573 return boost::shared_ptr< T >( pt, pt2 );
574}
575
576template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
577typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
578{
579 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
580
581 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
582
583 void * pv = pd->address();
584
585 ::new( pv ) T(
586 boost::forward<A1>( a1 ),
587 boost::forward<A2>( a2 ),
588 boost::forward<A3>( a3 ),
589 boost::forward<A4>( a4 ),
590 boost::forward<A5>( a5 ),
591 boost::forward<A6>( a6 )
592 );
593
594 pd->set_initialized();
595
596 T * pt2 = static_cast< T* >( pv );
597
598 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
599 return boost::shared_ptr< T >( pt, pt2 );
600}
601
602template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
603typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
604{
605 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
606
607 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
608
609 void * pv = pd->address();
610
611 ::new( pv ) T(
612 boost::forward<A1>( a1 ),
613 boost::forward<A2>( a2 ),
614 boost::forward<A3>( a3 ),
615 boost::forward<A4>( a4 ),
616 boost::forward<A5>( a5 ),
617 boost::forward<A6>( a6 )
618 );
619
620 pd->set_initialized();
621
622 T * pt2 = static_cast< T* >( pv );
623
624 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
625 return boost::shared_ptr< T >( pt, pt2 );
626}
627
628template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
629typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
630{
631 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
632
633 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
634
635 void * pv = pd->address();
636
637 ::new( pv ) T(
638 boost::forward<A1>( a1 ),
639 boost::forward<A2>( a2 ),
640 boost::forward<A3>( a3 ),
641 boost::forward<A4>( a4 ),
642 boost::forward<A5>( a5 ),
643 boost::forward<A6>( a6 ),
644 boost::forward<A7>( a7 )
645 );
646
647 pd->set_initialized();
648
649 T * pt2 = static_cast< T* >( pv );
650
651 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
652 return boost::shared_ptr< T >( pt, pt2 );
653}
654
655template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
656typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
657{
658 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
659
660 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
661
662 void * pv = pd->address();
663
664 ::new( pv ) T(
665 boost::forward<A1>( a1 ),
666 boost::forward<A2>( a2 ),
667 boost::forward<A3>( a3 ),
668 boost::forward<A4>( a4 ),
669 boost::forward<A5>( a5 ),
670 boost::forward<A6>( a6 ),
671 boost::forward<A7>( a7 )
672 );
673
674 pd->set_initialized();
675
676 T * pt2 = static_cast< T* >( pv );
677
678 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
679 return boost::shared_ptr< T >( pt, pt2 );
680}
681
682template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
683typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
684{
685 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
686
687 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
688
689 void * pv = pd->address();
690
691 ::new( pv ) T(
692 boost::forward<A1>( a1 ),
693 boost::forward<A2>( a2 ),
694 boost::forward<A3>( a3 ),
695 boost::forward<A4>( a4 ),
696 boost::forward<A5>( a5 ),
697 boost::forward<A6>( a6 ),
698 boost::forward<A7>( a7 ),
699 boost::forward<A8>( a8 )
700 );
701
702 pd->set_initialized();
703
704 T * pt2 = static_cast< T* >( pv );
705
706 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
707 return boost::shared_ptr< T >( pt, pt2 );
708}
709
710template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
711typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
712{
713 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
714
715 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
716
717 void * pv = pd->address();
718
719 ::new( pv ) T(
720 boost::forward<A1>( a1 ),
721 boost::forward<A2>( a2 ),
722 boost::forward<A3>( a3 ),
723 boost::forward<A4>( a4 ),
724 boost::forward<A5>( a5 ),
725 boost::forward<A6>( a6 ),
726 boost::forward<A7>( a7 ),
727 boost::forward<A8>( a8 )
728 );
729
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
738template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
739typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
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(
748 boost::forward<A1>( a1 ),
749 boost::forward<A2>( a2 ),
750 boost::forward<A3>( a3 ),
751 boost::forward<A4>( a4 ),
752 boost::forward<A5>( a5 ),
753 boost::forward<A6>( a6 ),
754 boost::forward<A7>( a7 ),
755 boost::forward<A8>( a8 ),
756 boost::forward<A9>( a9 )
757 );
758
759 pd->set_initialized();
760
761 T * pt2 = static_cast< T* >( pv );
762
763 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
764 return boost::shared_ptr< T >( pt, pt2 );
765}
766
767template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
768typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
769{
770 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
771
772 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
773
774 void * pv = pd->address();
775
776 ::new( pv ) T(
777 boost::forward<A1>( a1 ),
778 boost::forward<A2>( a2 ),
779 boost::forward<A3>( a3 ),
780 boost::forward<A4>( a4 ),
781 boost::forward<A5>( a5 ),
782 boost::forward<A6>( a6 ),
783 boost::forward<A7>( a7 ),
784 boost::forward<A8>( a8 ),
785 boost::forward<A9>( a9 )
786 );
787
788 pd->set_initialized();
789
790 T * pt2 = static_cast< T* >( pv );
791
792 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
793 return boost::shared_ptr< T >( pt, pt2 );
794}
795
796#endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
797
798#undef BOOST_SP_MSD
799
800} // namespace boost
801
802#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
803

source code of boost/libs/smart_ptr/include/boost/smart_ptr/make_shared_object.hpp