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
8 #include <boost/config/abi_prefix.hpp>
19 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD) && ! defined (BOOST_NO_CXX11_RVALUE_REFERENCES)
20 template<typename T,typename... Args>
21 inline T* heap_new(Args&&... args)
23 return new T(static_cast<Args&&>(args)...);
25 #elif ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
26 template<typename T,typename A1>
27 inline T* heap_new(A1&& a1)
29 return new T(static_cast<A1&&>(a1));
31 template<typename T,typename A1,typename A2>
32 inline T* heap_new(A1&& a1,A2&& a2)
34 return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2));
36 template<typename T,typename A1,typename A2,typename A3>
37 inline T* heap_new(A1&& a1,A2&& a2,A3&& a3)
39 return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2),
40 static_cast<A3&&>(a3));
42 template<typename T,typename A1,typename A2,typename A3,typename A4>
43 inline T* heap_new(A1&& a1,A2&& a2,A3&& a3,A4&& a4)
45 return new T(static_cast<A1&&>(a1),static_cast<A2&&>(a2),
46 static_cast<A3&&>(a3),static_cast<A4&&>(a4));
49 template<typename T,typename A1>
50 inline T* heap_new_impl(A1 a1)
54 template<typename T,typename A1,typename A2>
55 inline T* heap_new_impl(A1 a1,A2 a2)
59 template<typename T,typename A1,typename A2,typename A3>
60 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3)
62 return new T(a1,a2,a3);
64 template<typename T,typename A1,typename A2,typename A3,typename A4>
65 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4)
67 return new T(a1,a2,a3,a4);
69 template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5>
70 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)
72 return new T(a1,a2,a3,a4,a5);
74 template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5,typename A6>
75 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6)
77 return new T(a1,a2,a3,a4,a5,a6);
79 template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7>
80 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7)
82 return new T(a1,a2,a3,a4,a5,a6,a7);
84 template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7,typename A8>
85 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8)
87 return new T(a1,a2,a3,a4,a5,a6,a7,a8);
89 template<typename T,typename A1,typename A2,typename A3,typename A4,typename A5,typename A6,typename A7,typename A8,typename A9>
90 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9)
92 return new T(a1,a2,a3,a4,a5,a6,a7,a8,a9);
95 template<typename T,typename A1>
96 inline T* heap_new(A1 const& a1)
98 return heap_new_impl<T,A1 const&>(a1);
100 template<typename T,typename A1>
101 inline T* heap_new(A1& a1)
103 return heap_new_impl<T,A1&>(a1);
106 template<typename T,typename A1,typename A2>
107 inline T* heap_new(A1 const& a1,A2 const& a2)
109 return heap_new_impl<T,A1 const&,A2 const&>(a1,a2);
111 template<typename T,typename A1,typename A2>
112 inline T* heap_new(A1& a1,A2 const& a2)
114 return heap_new_impl<T,A1&,A2 const&>(a1,a2);
116 template<typename T,typename A1,typename A2>
117 inline T* heap_new(A1 const& a1,A2& a2)
119 return heap_new_impl<T,A1 const&,A2&>(a1,a2);
121 template<typename T,typename A1,typename A2>
122 inline T* heap_new(A1& a1,A2& a2)
124 return heap_new_impl<T,A1&,A2&>(a1,a2);
127 template<typename T,typename A1,typename A2,typename A3>
128 inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3)
130 return heap_new_impl<T,A1 const&,A2 const&,A3 const&>(a1,a2,a3);
132 template<typename T,typename A1,typename A2,typename A3>
133 inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3)
135 return heap_new_impl<T,A1&,A2 const&,A3 const&>(a1,a2,a3);
137 template<typename T,typename A1,typename A2,typename A3>
138 inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3)
140 return heap_new_impl<T,A1 const&,A2&,A3 const&>(a1,a2,a3);
142 template<typename T,typename A1,typename A2,typename A3>
143 inline T* heap_new(A1& a1,A2& a2,A3 const& a3)
145 return heap_new_impl<T,A1&,A2&,A3 const&>(a1,a2,a3);
148 template<typename T,typename A1,typename A2,typename A3>
149 inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3)
151 return heap_new_impl<T,A1 const&,A2 const&,A3&>(a1,a2,a3);
153 template<typename T,typename A1,typename A2,typename A3>
154 inline T* heap_new(A1& a1,A2 const& a2,A3& a3)
156 return heap_new_impl<T,A1&,A2 const&,A3&>(a1,a2,a3);
158 template<typename T,typename A1,typename A2,typename A3>
159 inline T* heap_new(A1 const& a1,A2& a2,A3& a3)
161 return heap_new_impl<T,A1 const&,A2&,A3&>(a1,a2,a3);
163 template<typename T,typename A1,typename A2,typename A3>
164 inline T* heap_new(A1& a1,A2& a2,A3& a3)
166 return heap_new_impl<T,A1&,A2&,A3&>(a1,a2,a3);
169 template<typename T,typename A1,typename A2,typename A3,typename A4>
170 inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4 const& a4)
172 return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4);
174 template<typename T,typename A1,typename A2,typename A3,typename A4>
175 inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4 const& a4)
177 return heap_new_impl<T,A1&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4);
179 template<typename T,typename A1,typename A2,typename A3,typename A4>
180 inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4 const& a4)
182 return heap_new_impl<T,A1 const&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4);
184 template<typename T,typename A1,typename A2,typename A3,typename A4>
185 inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4 const& a4)
187 return heap_new_impl<T,A1&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4);
190 template<typename T,typename A1,typename A2,typename A3,typename A4>
191 inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4 const& a4)
193 return heap_new_impl<T,A1 const&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4);
195 template<typename T,typename A1,typename A2,typename A3,typename A4>
196 inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4 const& a4)
198 return heap_new_impl<T,A1&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4);
200 template<typename T,typename A1,typename A2,typename A3,typename A4>
201 inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4 const& a4)
203 return heap_new_impl<T,A1 const&,A2&,A3&,A4 const&>(a1,a2,a3,a4);
205 template<typename T,typename A1,typename A2,typename A3,typename A4>
206 inline T* heap_new(A1& a1,A2& a2,A3& a3,A4 const& a4)
208 return heap_new_impl<T,A1&,A2&,A3&,A4 const&>(a1,a2,a3,a4);
210 template<typename T,typename A1,typename A2,typename A3,typename A4>
211 inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4& a4)
213 return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4);
215 template<typename T,typename A1,typename A2,typename A3,typename A4>
216 inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4& a4)
218 return heap_new_impl<T,A1&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4);
220 template<typename T,typename A1,typename A2,typename A3,typename A4>
221 inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4& a4)
223 return heap_new_impl<T,A1 const&,A2&,A3 const&,A4&>(a1,a2,a3,a4);
225 template<typename T,typename A1,typename A2,typename A3,typename A4>
226 inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4& a4)
228 return heap_new_impl<T,A1&,A2&,A3 const&,A4&>(a1,a2,a3,a4);
231 template<typename T,typename A1,typename A2,typename A3,typename A4>
232 inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4& a4)
234 return heap_new_impl<T,A1 const&,A2 const&,A3&,A4&>(a1,a2,a3,a4);
236 template<typename T,typename A1,typename A2,typename A3,typename A4>
237 inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4& a4)
239 return heap_new_impl<T,A1&,A2 const&,A3&,A4&>(a1,a2,a3,a4);
241 template<typename T,typename A1,typename A2,typename A3,typename A4>
242 inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4& a4)
244 return heap_new_impl<T,A1 const&,A2&,A3&,A4&>(a1,a2,a3,a4);
246 template<typename T,typename A1,typename A2,typename A3,typename A4>
247 inline T* heap_new(A1& a1,A2& a2,A3& a3,A4& a4)
249 return heap_new_impl<T,A1&,A2&,A3&,A4&>(a1,a2,a3,a4);
254 inline void heap_delete(T* data)
260 struct do_heap_delete
262 void operator()(T* data) const
264 detail::heap_delete(data);
270 #include <boost/config/abi_suffix.hpp>