PageRenderTime 46ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/External/boost/boost/smart_ptr/make_shared_object.hpp

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