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 2007 Anthony Williams
5 #ifndef THREAD_HEAP_ALLOC_HPP
6 #define THREAD_HEAP_ALLOC_HPP
8 #include <boost/thread/detail/config.hpp>
9 #include <boost/thread/win32/thread_primitives.hpp>
11 #include <boost/assert.hpp>
12 #include <boost/throw_exception.hpp>
13 #include <boost/core/no_exceptions_support.hpp>
15 #if defined( BOOST_USE_WINDOWS_H )
24 using ::GetProcessHeap;
45 __declspec(dllimport) handle __stdcall GetProcessHeap();
46 __declspec(dllimport) void* __stdcall HeapAlloc(handle,unsigned long,ulong_ptr);
47 __declspec(dllimport) int __stdcall HeapFree(handle,unsigned long,void*);
55 #include <boost/config/abi_prefix.hpp>
61 inline void* allocate_raw_heap_memory(unsigned size)
63 void* const heap_memory=detail::win32::HeapAlloc(detail::win32::GetProcessHeap(),0,size);
66 boost::throw_exception(std::bad_alloc());
71 inline void free_raw_heap_memory(void* heap_memory)
73 BOOST_VERIFY(detail::win32::HeapFree(detail::win32::GetProcessHeap(),0,heap_memory)!=0);
79 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
82 T* const data=new (heap_memory) T();
87 free_raw_heap_memory(heap_memory);
93 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
94 template<typename T,typename A1>
95 inline T* heap_new(A1&& a1)
97 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
100 T* const data=new (heap_memory) T(static_cast<A1&&>(a1));
105 free_raw_heap_memory(heap_memory);
110 template<typename T,typename A1,typename A2>
111 inline T* heap_new(A1&& a1,A2&& a2)
113 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
116 T* const data=new (heap_memory) T(static_cast<A1&&>(a1),static_cast<A2&&>(a2));
121 free_raw_heap_memory(heap_memory);
126 template<typename T,typename A1,typename A2,typename A3>
127 inline T* heap_new(A1&& a1,A2&& a2,A3&& a3)
129 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
132 T* const data=new (heap_memory) T(static_cast<A1&&>(a1),static_cast<A2&&>(a2),
133 static_cast<A3&&>(a3));
138 free_raw_heap_memory(heap_memory);
143 template<typename T,typename A1,typename A2,typename A3,typename A4>
144 inline T* heap_new(A1&& a1,A2&& a2,A3&& a3,A4&& a4)
146 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
149 T* const data=new (heap_memory) T(static_cast<A1&&>(a1),static_cast<A2&&>(a2),
150 static_cast<A3&&>(a3),static_cast<A4&&>(a4));
155 free_raw_heap_memory(heap_memory);
161 template<typename T,typename A1>
162 inline T* heap_new_impl(A1 a1)
164 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
167 T* const data=new (heap_memory) T(a1);
172 free_raw_heap_memory(heap_memory);
178 template<typename T,typename A1,typename A2>
179 inline T* heap_new_impl(A1 a1,A2 a2)
181 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
184 T* const data=new (heap_memory) T(a1,a2);
189 free_raw_heap_memory(heap_memory);
195 template<typename T,typename A1,typename A2,typename A3>
196 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3)
198 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
201 T* const data=new (heap_memory) T(a1,a2,a3);
206 free_raw_heap_memory(heap_memory);
212 template<typename T,typename A1,typename A2,typename A3,typename A4>
213 inline T* heap_new_impl(A1 a1,A2 a2,A3 a3,A4 a4)
215 void* const heap_memory=allocate_raw_heap_memory(sizeof(T));
218 T* const data=new (heap_memory) T(a1,a2,a3,a4);
223 free_raw_heap_memory(heap_memory);
230 template<typename T,typename A1>
231 inline T* heap_new(A1 const& a1)
233 return heap_new_impl<T,A1 const&>(a1);
235 template<typename T,typename A1>
236 inline T* heap_new(A1& a1)
238 return heap_new_impl<T,A1&>(a1);
241 template<typename T,typename A1,typename A2>
242 inline T* heap_new(A1 const& a1,A2 const& a2)
244 return heap_new_impl<T,A1 const&,A2 const&>(a1,a2);
246 template<typename T,typename A1,typename A2>
247 inline T* heap_new(A1& a1,A2 const& a2)
249 return heap_new_impl<T,A1&,A2 const&>(a1,a2);
251 template<typename T,typename A1,typename A2>
252 inline T* heap_new(A1 const& a1,A2& a2)
254 return heap_new_impl<T,A1 const&,A2&>(a1,a2);
256 template<typename T,typename A1,typename A2>
257 inline T* heap_new(A1& a1,A2& a2)
259 return heap_new_impl<T,A1&,A2&>(a1,a2);
262 template<typename T,typename A1,typename A2,typename A3>
263 inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3)
265 return heap_new_impl<T,A1 const&,A2 const&,A3 const&>(a1,a2,a3);
267 template<typename T,typename A1,typename A2,typename A3>
268 inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3)
270 return heap_new_impl<T,A1&,A2 const&,A3 const&>(a1,a2,a3);
272 template<typename T,typename A1,typename A2,typename A3>
273 inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3)
275 return heap_new_impl<T,A1 const&,A2&,A3 const&>(a1,a2,a3);
277 template<typename T,typename A1,typename A2,typename A3>
278 inline T* heap_new(A1& a1,A2& a2,A3 const& a3)
280 return heap_new_impl<T,A1&,A2&,A3 const&>(a1,a2,a3);
283 template<typename T,typename A1,typename A2,typename A3>
284 inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3)
286 return heap_new_impl<T,A1 const&,A2 const&,A3&>(a1,a2,a3);
288 template<typename T,typename A1,typename A2,typename A3>
289 inline T* heap_new(A1& a1,A2 const& a2,A3& a3)
291 return heap_new_impl<T,A1&,A2 const&,A3&>(a1,a2,a3);
293 template<typename T,typename A1,typename A2,typename A3>
294 inline T* heap_new(A1 const& a1,A2& a2,A3& a3)
296 return heap_new_impl<T,A1 const&,A2&,A3&>(a1,a2,a3);
298 template<typename T,typename A1,typename A2,typename A3>
299 inline T* heap_new(A1& a1,A2& a2,A3& a3)
301 return heap_new_impl<T,A1&,A2&,A3&>(a1,a2,a3);
304 template<typename T,typename A1,typename A2,typename A3,typename A4>
305 inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4 const& a4)
307 return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4);
309 template<typename T,typename A1,typename A2,typename A3,typename A4>
310 inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4 const& a4)
312 return heap_new_impl<T,A1&,A2 const&,A3 const&,A4 const&>(a1,a2,a3,a4);
314 template<typename T,typename A1,typename A2,typename A3,typename A4>
315 inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4 const& a4)
317 return heap_new_impl<T,A1 const&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4);
319 template<typename T,typename A1,typename A2,typename A3,typename A4>
320 inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4 const& a4)
322 return heap_new_impl<T,A1&,A2&,A3 const&,A4 const&>(a1,a2,a3,a4);
325 template<typename T,typename A1,typename A2,typename A3,typename A4>
326 inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4 const& a4)
328 return heap_new_impl<T,A1 const&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4);
330 template<typename T,typename A1,typename A2,typename A3,typename A4>
331 inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4 const& a4)
333 return heap_new_impl<T,A1&,A2 const&,A3&,A4 const&>(a1,a2,a3,a4);
335 template<typename T,typename A1,typename A2,typename A3,typename A4>
336 inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4 const& a4)
338 return heap_new_impl<T,A1 const&,A2&,A3&,A4 const&>(a1,a2,a3,a4);
340 template<typename T,typename A1,typename A2,typename A3,typename A4>
341 inline T* heap_new(A1& a1,A2& a2,A3& a3,A4 const& a4)
343 return heap_new_impl<T,A1&,A2&,A3&,A4 const&>(a1,a2,a3,a4);
345 template<typename T,typename A1,typename A2,typename A3,typename A4>
346 inline T* heap_new(A1 const& a1,A2 const& a2,A3 const& a3,A4& a4)
348 return heap_new_impl<T,A1 const&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4);
350 template<typename T,typename A1,typename A2,typename A3,typename A4>
351 inline T* heap_new(A1& a1,A2 const& a2,A3 const& a3,A4& a4)
353 return heap_new_impl<T,A1&,A2 const&,A3 const&,A4&>(a1,a2,a3,a4);
355 template<typename T,typename A1,typename A2,typename A3,typename A4>
356 inline T* heap_new(A1 const& a1,A2& a2,A3 const& a3,A4& a4)
358 return heap_new_impl<T,A1 const&,A2&,A3 const&,A4&>(a1,a2,a3,a4);
360 template<typename T,typename A1,typename A2,typename A3,typename A4>
361 inline T* heap_new(A1& a1,A2& a2,A3 const& a3,A4& a4)
363 return heap_new_impl<T,A1&,A2&,A3 const&,A4&>(a1,a2,a3,a4);
366 template<typename T,typename A1,typename A2,typename A3,typename A4>
367 inline T* heap_new(A1 const& a1,A2 const& a2,A3& a3,A4& a4)
369 return heap_new_impl<T,A1 const&,A2 const&,A3&,A4&>(a1,a2,a3,a4);
371 template<typename T,typename A1,typename A2,typename A3,typename A4>
372 inline T* heap_new(A1& a1,A2 const& a2,A3& a3,A4& a4)
374 return heap_new_impl<T,A1&,A2 const&,A3&,A4&>(a1,a2,a3,a4);
376 template<typename T,typename A1,typename A2,typename A3,typename A4>
377 inline T* heap_new(A1 const& a1,A2& a2,A3& a3,A4& a4)
379 return heap_new_impl<T,A1 const&,A2&,A3&,A4&>(a1,a2,a3,a4);
381 template<typename T,typename A1,typename A2,typename A3,typename A4>
382 inline T* heap_new(A1& a1,A2& a2,A3& a3,A4& a4)
384 return heap_new_impl<T,A1&,A2&,A3&,A4&>(a1,a2,a3,a4);
389 inline void heap_delete(T* data)
392 free_raw_heap_memory(data);
396 struct do_heap_delete
398 void operator()(T* data) const
400 detail::heap_delete(data);
406 #include <boost/config/abi_suffix.hpp>