thread_heap_alloc.hpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. // Distributed under the Boost Software License, Version 1.0. (See
  2. // accompanying file LICENSE_1_0.txt or copy at
  3. // http://www.boost.org/LICENSE_1_0.txt)
  4. // (C) Copyright 2008 Anthony Williams
  5. #ifndef THREAD_HEAP_ALLOC_PTHREAD_HPP
  6. #define THREAD_HEAP_ALLOC_PTHREAD_HPP
  7. #include <boost/config/abi_prefix.hpp>
  8. namespace boost
  9. {
  10. namespace detail
  11. {
  12. template<typename T>
  13. inline T* heap_new()
  14. {
  15. return new T();
  16. }
  17. #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD) && ! defined (BOOST_NO_CXX11_RVALUE_REFERENCES)
  18. template<typename T,typename... Args>
  19. inline T* heap_new(Args&&... args)
  20. {
  21. return new T(static_cast<Args&&>(args)...);
  22. }
  23. #elif ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
  24. template<typename T,typename A1>
  25. inline T* heap_new(A1&& a1)
  26. {
  27. return new T(static_cast<A1&&>(a1));
  28. }
  29. template<typename T,typename A1,typename A2>
  30. inline T* heap_new(A1&& a1,A2&& a2)
  31. {
  32. return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2));
  33. }
  34. template<typename T,typename A1,typename A2,typename A3>
  35. inline T* heap_new(A1&& a1,A2&& a2,A3&& a3)
  36. {
  37. return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2),
  38. static_cast<A3&&>(a3));
  39. }
  40. template<typename T,typename A1,typename A2,typename A3,typename A4>
  41. inline T* heap_new(A1&& a1,A2&& a2,A3&& a3,A4&& a4)
  42. {
  43. return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2),
  44. static_cast<A3&&>(a3),static_cast<A4&&>(a4));
  45. }
  46. #else
  47. template<typename T,typename A1>
  48. inline T* heap_new_impl(A1 a1)
  49. {
  50. return new T(a1);
  51. }
  52. template<typename T,typename A1,typename A2>
  53. inline T* heap_new_impl(A1 a1,A2 a2)
  54. {
  55. return new T(a1,a2);
  56. }
  57. template<typename T,typename A1,typename A2,typename A3>
  58. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3)
  59. {
  60. return new T(a1,a2,a3);
  61. }
  62. template<typename T,typename A1,typename A2,typename A3,typename A4>
  63. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4)
  64. {
  65. return new T(a1,a2,a3,a4);
  66. }
  67. template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5>
  68. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)
  69. {
  70. return new T(a1,a2,a3,a4,a5);
  71. }
  72. template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5,typename A6>
  73. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6)
  74. {
  75. return new T(a1,a2,a3,a4,a5,a6);
  76. }
  77. template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7>
  78. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7)
  79. {
  80. return new T(a1,a2,a3,a4,a5,a6,a7);
  81. }
  82. template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7,typename A8>
  83. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8)
  84. {
  85. return new T(a1,a2,a3,a4,a5,a6,a7,a8);
  86. }
  87. template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7,typename A8,typename A9>
  88. inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9)
  89. {
  90. return new T(a1,a2,a3,a4,a5,a6,a7,a8,a9);
  91. }
  92. template<typename T,typename A1>
  93. inline T* heap_new(A1 const& a1)
  94. {
  95. return heap_new_impl<T,A1 const&>(a1);
  96. }
  97. template<typename T,typename A1>
  98. inline T* heap_new(A1& a1)
  99. {
  100. return heap_new_impl<T,A1&>(a1);
  101. }
  102. template<typename T,typename A1,typename A2>
  103. inline T* heap_new(A1 const& a1,A2 const& a2)
  104. {
  105. return heap_new_impl<T,A1 const&,A2 const&>(a1,a2);
  106. }
  107. template<typename T,typename A1,typename A2>
  108. inline T* heap_new(A1& a1,A2 const& a2)
  109. {
  110. return heap_new_impl<T,A1&,A2 const&>(a1,a2);
  111. }
  112. template<typename T,typename A1,typename A2>
  113. inline T* heap_new(A1 const& a1,A2& a2)
  114. {
  115. return heap_new_impl<T,A1 const&,A2&>(a1,a2);
  116. }
  117. template<typename T,typename A1,typename A2>
  118. inline T* heap_new(A1& a1,A2& a2)
  119. {
  120. return heap_new_impl<T,A1&,A2&>(a1,a2);
  121. }
  122. template<typename T,typename A1,typename A2,typename A3>
  123. inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3)
  124. {
  125. return heap_new_impl<T,A1 const&,A2 const&,A3 const&>(a1,a2,a3);
  126. }
  127. template<typename T,typename A1,typename A2,typename A3>
  128. inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3)
  129. {
  130. return heap_new_impl<T,A1&,A2 const&,A3 const&>(a1,a2,a3);
  131. }
  132. template<typename T,typename A1,typename A2,typename A3>
  133. inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3)
  134. {
  135. return heap_new_impl<T,A1 const&,A2&,A3 const&>(a1,a2,a3);
  136. }
  137. template<typename T,typename A1,typename A2,typename A3>
  138. inline T* heap_new(A1& a1,A2& a2,A3 const& a3)
  139. {
  140. return heap_new_impl<T,A1&,A2&,A3 const&>(a1,a2,a3);
  141. }
  142. template<typename T,typename A1,typename A2,typename A3>
  143. inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3)
  144. {
  145. return heap_new_impl<T,A1 const&,A2 const&,A3&>(a1,a2,a3);
  146. }
  147. template<typename T,typename A1,typename A2,typename A3>
  148. inline T* heap_new(A1& a1,A2 const& a2,A3& a3)
  149. {
  150. return heap_new_impl<T,A1&,A2 const&,A3&>(a1,a2,a3);
  151. }
  152. template<typename T,typename A1,typename A2,typename A3>
  153. inline T* heap_new(A1 const& a1,A2& a2,A3& a3)
  154. {
  155. return heap_new_impl<T,A1 const&,A2&,A3&>(a1,a2,a3);
  156. }
  157. template<typename T,typename A1,typename A2,typename A3>
  158. inline T* heap_new(A1& a1,A2& a2,A3& a3)
  159. {
  160. return heap_new_impl<T,A1&,A2&,A3&>(a1,a2,a3);
  161. }
  162. template<typename T,typename A1,typename A2,typename A3,typename A4>
  163. inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4 const& a4)
  164. {
  165. return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4);
  166. }
  167. template<typename T,typename A1,typename A2,typename A3,typename A4>
  168. inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4 const& a4)
  169. {
  170. return heap_new_impl<T,A1&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4);
  171. }
  172. template<typename T,typename A1,typename A2,typename A3,typename A4>
  173. inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4 const& a4)
  174. {
  175. return heap_new_impl<T,A1 const&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4);
  176. }
  177. template<typename T,typename A1,typename A2,typename A3,typename A4>
  178. inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4 const& a4)
  179. {
  180. return heap_new_impl<T,A1&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4);
  181. }
  182. template<typename T,typename A1,typename A2,typename A3,typename A4>
  183. inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4 const& a4)
  184. {
  185. return heap_new_impl<T,A1 const&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4);
  186. }
  187. template<typename T,typename A1,typename A2,typename A3,typename A4>
  188. inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4 const& a4)
  189. {
  190. return heap_new_impl<T,A1&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4);
  191. }
  192. template<typename T,typename A1,typename A2,typename A3,typename A4>
  193. inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4 const& a4)
  194. {
  195. return heap_new_impl<T,A1 const&,A2&,A3&,A4 const&>(a1,a2,a3,a4);
  196. }
  197. template<typename T,typename A1,typename A2,typename A3,typename A4>
  198. inline T* heap_new(A1& a1,A2& a2,A3& a3,A4 const& a4)
  199. {
  200. return heap_new_impl<T,A1&,A2&,A3&,A4 const&>(a1,a2,a3,a4);
  201. }
  202. template<typename T,typename A1,typename A2,typename A3,typename A4>
  203. inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4& a4)
  204. {
  205. return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4);
  206. }
  207. template<typename T,typename A1,typename A2,typename A3,typename A4>
  208. inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4& a4)
  209. {
  210. return heap_new_impl<T,A1&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4);
  211. }
  212. template<typename T,typename A1,typename A2,typename A3,typename A4>
  213. inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4& a4)
  214. {
  215. return heap_new_impl<T,A1 const&,A2&,A3 const&,A4&>(a1,a2,a3,a4);
  216. }
  217. template<typename T,typename A1,typename A2,typename A3,typename A4>
  218. inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4& a4)
  219. {
  220. return heap_new_impl<T,A1&,A2&,A3 const&,A4&>(a1,a2,a3,a4);
  221. }
  222. template<typename T,typename A1,typename A2,typename A3,typename A4>
  223. inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4& a4)
  224. {
  225. return heap_new_impl<T,A1 const&,A2 const&,A3&,A4&>(a1,a2,a3,a4);
  226. }
  227. template<typename T,typename A1,typename A2,typename A3,typename A4>
  228. inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4& a4)
  229. {
  230. return heap_new_impl<T,A1&,A2 const&,A3&,A4&>(a1,a2,a3,a4);
  231. }
  232. template<typename T,typename A1,typename A2,typename A3,typename A4>
  233. inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4& a4)
  234. {
  235. return heap_new_impl<T,A1 const&,A2&,A3&,A4&>(a1,a2,a3,a4);
  236. }
  237. template<typename T,typename A1,typename A2,typename A3,typename A4>
  238. inline T* heap_new(A1& a1,A2& a2,A3& a3,A4& a4)
  239. {
  240. return heap_new_impl<T,A1&,A2&,A3&,A4&>(a1,a2,a3,a4);
  241. }
  242. #endif
  243. template<typename T>
  244. inline void heap_delete(T* data)
  245. {
  246. delete data;
  247. }
  248. template<typename T>
  249. struct do_heap_delete
  250. {
  251. void operator()(T* data) const
  252. {
  253. detail::heap_delete(data);
  254. }
  255. };
  256. }
  257. }
  258. #include <boost/config/abi_suffix.hpp>
  259. #endif