make_shared_object.hpp 34 KB

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