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