Chris@16
|
1 // Boost Lambda Library - function_adaptors.hpp ----------------------------
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
|
Chris@16
|
4 //
|
Chris@16
|
5 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
6 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8 //
|
Chris@16
|
9 // For more information, see www.boost.org
|
Chris@16
|
10
|
Chris@16
|
11
|
Chris@16
|
12 #ifndef BOOST_LAMBDA_FUNCTION_ADAPTORS_HPP
|
Chris@16
|
13 #define BOOST_LAMBDA_FUNCTION_ADAPTORS_HPP
|
Chris@16
|
14
|
Chris@16
|
15 #include "boost/mpl/has_xxx.hpp"
|
Chris@16
|
16 #include "boost/tuple/tuple.hpp"
|
Chris@16
|
17 #include "boost/type_traits/same_traits.hpp"
|
Chris@16
|
18 #include "boost/type_traits/remove_reference.hpp"
|
Chris@16
|
19 #include "boost/type_traits/remove_cv.hpp"
|
Chris@16
|
20 #include "boost/type_traits/add_const.hpp"
|
Chris@16
|
21 #include "boost/type_traits/add_volatile.hpp"
|
Chris@16
|
22 #include "boost/utility/result_of.hpp"
|
Chris@16
|
23
|
Chris@16
|
24 namespace boost {
|
Chris@16
|
25 namespace lambda {
|
Chris@16
|
26
|
Chris@16
|
27 namespace detail {
|
Chris@16
|
28
|
Chris@16
|
29 BOOST_MPL_HAS_XXX_TEMPLATE_DEF(sig)
|
Chris@16
|
30
|
Chris@16
|
31 template<class Tuple>
|
Chris@16
|
32 struct remove_references_from_elements {
|
Chris@16
|
33 typedef typename boost::tuples::cons<
|
Chris@16
|
34 typename boost::remove_reference<typename Tuple::head_type>::type,
|
Chris@16
|
35 typename remove_references_from_elements<typename Tuple::tail_type>::type
|
Chris@16
|
36 > type;
|
Chris@16
|
37 };
|
Chris@16
|
38
|
Chris@16
|
39 template<>
|
Chris@16
|
40 struct remove_references_from_elements<boost::tuples::null_type> {
|
Chris@16
|
41 typedef boost::tuples::null_type type;
|
Chris@16
|
42 };
|
Chris@16
|
43
|
Chris@16
|
44 }
|
Chris@16
|
45
|
Chris@16
|
46 template <class Func> struct function_adaptor {
|
Chris@16
|
47
|
Chris@16
|
48 typedef typename detail::remove_reference_and_cv<Func>::type plainF;
|
Chris@16
|
49
|
Chris@16
|
50 #if !defined(BOOST_NO_RESULT_OF)
|
Chris@16
|
51 // Support functors that use the boost::result_of return type convention.
|
Chris@16
|
52 template<class Tuple, int Length, bool HasSig>
|
Chris@16
|
53 struct result_converter;
|
Chris@16
|
54 template<class Tuple, int Length>
|
Chris@16
|
55 struct result_converter<Tuple, Length, true>
|
Chris@16
|
56 : plainF::template sig<
|
Chris@16
|
57 typename detail::remove_references_from_elements<Tuple>::type
|
Chris@16
|
58 >
|
Chris@16
|
59 {};
|
Chris@16
|
60 template<class Tuple>
|
Chris@16
|
61 struct result_converter<Tuple, 0, false>
|
Chris@16
|
62 : result_of<plainF()>
|
Chris@16
|
63 {};
|
Chris@16
|
64 template<class Tuple>
|
Chris@16
|
65 struct result_converter<Tuple, 1, false>
|
Chris@16
|
66 : result_of<plainF(
|
Chris@16
|
67 typename tuples::element<1, Tuple>::type)
|
Chris@16
|
68 >
|
Chris@16
|
69 {};
|
Chris@16
|
70 template<class Tuple>
|
Chris@16
|
71 struct result_converter<Tuple, 2, false>
|
Chris@16
|
72 : result_of<plainF(
|
Chris@16
|
73 typename tuples::element<1, Tuple>::type,
|
Chris@16
|
74 typename tuples::element<2, Tuple>::type)
|
Chris@16
|
75 >
|
Chris@16
|
76 {};
|
Chris@16
|
77 template<class Tuple>
|
Chris@16
|
78 struct result_converter<Tuple, 3, false>
|
Chris@16
|
79 : result_of<plainF(
|
Chris@16
|
80 typename tuples::element<1, Tuple>::type,
|
Chris@16
|
81 typename tuples::element<2, Tuple>::type,
|
Chris@16
|
82 typename tuples::element<3, Tuple>::type)
|
Chris@16
|
83 >
|
Chris@16
|
84 {};
|
Chris@16
|
85 template<class Tuple>
|
Chris@16
|
86 struct result_converter<Tuple, 4, false>
|
Chris@16
|
87 : result_of<plainF(
|
Chris@16
|
88 typename tuples::element<1, Tuple>::type,
|
Chris@16
|
89 typename tuples::element<2, Tuple>::type,
|
Chris@16
|
90 typename tuples::element<3, Tuple>::type,
|
Chris@16
|
91 typename tuples::element<4, Tuple>::type)
|
Chris@16
|
92 >
|
Chris@16
|
93 {};
|
Chris@16
|
94 template<class Tuple>
|
Chris@16
|
95 struct result_converter<Tuple, 5, false>
|
Chris@16
|
96 : result_of<plainF(
|
Chris@16
|
97 typename tuples::element<1, Tuple>::type,
|
Chris@16
|
98 typename tuples::element<2, Tuple>::type,
|
Chris@16
|
99 typename tuples::element<3, Tuple>::type,
|
Chris@16
|
100 typename tuples::element<4, Tuple>::type,
|
Chris@16
|
101 typename tuples::element<5, Tuple>::type)
|
Chris@16
|
102 >
|
Chris@16
|
103 {};
|
Chris@16
|
104 template<class Tuple>
|
Chris@16
|
105 struct result_converter<Tuple, 6, false>
|
Chris@16
|
106 : result_of<plainF(
|
Chris@16
|
107 typename tuples::element<1, Tuple>::type,
|
Chris@16
|
108 typename tuples::element<2, Tuple>::type,
|
Chris@16
|
109 typename tuples::element<3, Tuple>::type,
|
Chris@16
|
110 typename tuples::element<4, Tuple>::type,
|
Chris@16
|
111 typename tuples::element<5, Tuple>::type,
|
Chris@16
|
112 typename tuples::element<6, Tuple>::type)
|
Chris@16
|
113 >
|
Chris@16
|
114 {};
|
Chris@16
|
115 template<class Tuple>
|
Chris@16
|
116 struct result_converter<Tuple, 7, false>
|
Chris@16
|
117 : result_of<plainF(
|
Chris@16
|
118 typename tuples::element<1, Tuple>::type,
|
Chris@16
|
119 typename tuples::element<2, Tuple>::type,
|
Chris@16
|
120 typename tuples::element<3, Tuple>::type,
|
Chris@16
|
121 typename tuples::element<4, Tuple>::type,
|
Chris@16
|
122 typename tuples::element<5, Tuple>::type,
|
Chris@16
|
123 typename tuples::element<6, Tuple>::type,
|
Chris@16
|
124 typename tuples::element<7, Tuple>::type)
|
Chris@16
|
125 >
|
Chris@16
|
126 {};
|
Chris@16
|
127 template<class Tuple>
|
Chris@16
|
128 struct result_converter<Tuple, 8, false>
|
Chris@16
|
129 : result_of<plainF(
|
Chris@16
|
130 typename tuples::element<1, Tuple>::type,
|
Chris@16
|
131 typename tuples::element<2, Tuple>::type,
|
Chris@16
|
132 typename tuples::element<3, Tuple>::type,
|
Chris@16
|
133 typename tuples::element<4, Tuple>::type,
|
Chris@16
|
134 typename tuples::element<5, Tuple>::type,
|
Chris@16
|
135 typename tuples::element<6, Tuple>::type,
|
Chris@16
|
136 typename tuples::element<7, Tuple>::type,
|
Chris@16
|
137 typename tuples::element<8, Tuple>::type)
|
Chris@16
|
138 >
|
Chris@16
|
139 {};
|
Chris@16
|
140 template<class Tuple>
|
Chris@16
|
141 struct result_converter<Tuple, 9, false>
|
Chris@16
|
142 : result_of<plainF(
|
Chris@16
|
143 typename tuples::element<1, Tuple>::type,
|
Chris@16
|
144 typename tuples::element<2, Tuple>::type,
|
Chris@16
|
145 typename tuples::element<3, Tuple>::type,
|
Chris@16
|
146 typename tuples::element<4, Tuple>::type,
|
Chris@16
|
147 typename tuples::element<5, Tuple>::type,
|
Chris@16
|
148 typename tuples::element<6, Tuple>::type,
|
Chris@16
|
149 typename tuples::element<7, Tuple>::type,
|
Chris@16
|
150 typename tuples::element<8, Tuple>::type,
|
Chris@16
|
151 typename tuples::element<9, Tuple>::type)
|
Chris@16
|
152 >
|
Chris@16
|
153 {};
|
Chris@16
|
154
|
Chris@16
|
155 // we do not know the return type off-hand, we must ask it from Func
|
Chris@16
|
156 // To sig we pass a cons list, where the head is the function object type
|
Chris@16
|
157 // itself (potentially cv-qualified)
|
Chris@16
|
158 // and the tail contains the types of the actual arguments to be passed
|
Chris@16
|
159 // to the function object. The arguments can be cv qualified
|
Chris@16
|
160 // as well.
|
Chris@16
|
161 template <class Args>
|
Chris@16
|
162 struct sig
|
Chris@16
|
163 : result_converter<
|
Chris@16
|
164 Args
|
Chris@16
|
165 , tuples::length<typename Args::tail_type>::value
|
Chris@16
|
166 , detail::has_sig<plainF>::value
|
Chris@16
|
167 >
|
Chris@16
|
168 {};
|
Chris@16
|
169 #else // BOOST_NO_RESULT_OF
|
Chris@16
|
170
|
Chris@16
|
171 template <class Args> class sig {
|
Chris@16
|
172 typedef typename detail::remove_reference_and_cv<Func>::type plainF;
|
Chris@16
|
173 public:
|
Chris@16
|
174 typedef typename plainF::template sig<
|
Chris@16
|
175 typename detail::remove_references_from_elements<Args>::type
|
Chris@16
|
176 >::type type;
|
Chris@16
|
177 };
|
Chris@16
|
178 #endif
|
Chris@16
|
179
|
Chris@16
|
180 template<class RET, class A1>
|
Chris@16
|
181 static RET apply(A1& a1) {
|
Chris@16
|
182 return a1();
|
Chris@16
|
183 }
|
Chris@16
|
184 template<class RET, class A1, class A2>
|
Chris@16
|
185 static RET apply(A1& a1, A2& a2) {
|
Chris@16
|
186 return a1(a2);
|
Chris@16
|
187 }
|
Chris@16
|
188 template<class RET, class A1, class A2, class A3>
|
Chris@16
|
189 static RET apply(A1& a1, A2& a2, A3& a3) {
|
Chris@16
|
190 return a1(a2, a3);
|
Chris@16
|
191 }
|
Chris@16
|
192 template<class RET, class A1, class A2, class A3, class A4>
|
Chris@16
|
193 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4) {
|
Chris@16
|
194 return a1(a2, a3, a4);
|
Chris@16
|
195 }
|
Chris@16
|
196 template<class RET, class A1, class A2, class A3, class A4, class A5>
|
Chris@16
|
197 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
|
Chris@16
|
198 return a1(a2, a3, a4, a5);
|
Chris@16
|
199 }
|
Chris@16
|
200 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6>
|
Chris@16
|
201 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
|
Chris@16
|
202 return a1(a2, a3, a4, a5, a6);
|
Chris@16
|
203 }
|
Chris@16
|
204 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6,
|
Chris@16
|
205 class A7>
|
Chris@16
|
206 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6,
|
Chris@16
|
207 A7& a7) {
|
Chris@16
|
208 return a1(a2, a3, a4, a5, a6, a7);
|
Chris@16
|
209 }
|
Chris@16
|
210 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6,
|
Chris@16
|
211 class A7, class A8>
|
Chris@16
|
212 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6,
|
Chris@16
|
213 A7& a7, A8& a8) {
|
Chris@16
|
214 return a1(a2, a3, a4, a5, a6, a7, a8);
|
Chris@16
|
215 }
|
Chris@16
|
216 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6,
|
Chris@16
|
217 class A7, class A8, class A9>
|
Chris@16
|
218 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6,
|
Chris@16
|
219 A7& a7, A8& a8, A9& a9) {
|
Chris@16
|
220 return a1(a2, a3, a4, a5, a6, a7, a8, a9);
|
Chris@16
|
221 }
|
Chris@16
|
222 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6,
|
Chris@16
|
223 class A7, class A8, class A9, class A10>
|
Chris@16
|
224 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6,
|
Chris@16
|
225 A7& a7, A8& a8, A9& a9, A10& a10) {
|
Chris@16
|
226 return a1(a2, a3, a4, a5, a6, a7, a8, a9, a10);
|
Chris@16
|
227 }
|
Chris@16
|
228 };
|
Chris@16
|
229
|
Chris@16
|
230 template <class Func> struct function_adaptor<const Func>; // error
|
Chris@16
|
231
|
Chris@16
|
232 // -- function adaptors with data member access
|
Chris@16
|
233 template <class Object, class T>
|
Chris@16
|
234 struct function_adaptor<T Object::*> {
|
Chris@16
|
235
|
Chris@16
|
236 // typedef detail::unspecified type;
|
Chris@16
|
237
|
Chris@16
|
238 // T can have qualifiers and can be a reference type
|
Chris@16
|
239 // We get the return type by adding const, if the object through which
|
Chris@16
|
240 // the data member is accessed is const, and finally adding a reference
|
Chris@16
|
241 template<class Args> class sig {
|
Chris@16
|
242 typedef typename boost::tuples::element<1, Args>::type argument_type;
|
Chris@16
|
243 typedef typename boost::remove_reference<
|
Chris@16
|
244 argument_type
|
Chris@16
|
245 >::type unref_type;
|
Chris@16
|
246
|
Chris@16
|
247 typedef typename detail::IF<boost::is_const<unref_type>::value,
|
Chris@16
|
248 typename boost::add_const<T>::type,
|
Chris@16
|
249 T
|
Chris@16
|
250 >::RET properly_consted_return_type;
|
Chris@16
|
251
|
Chris@16
|
252 typedef typename detail::IF<boost::is_volatile<unref_type>::value,
|
Chris@16
|
253 typename boost::add_volatile<properly_consted_return_type>::type,
|
Chris@16
|
254 properly_consted_return_type
|
Chris@16
|
255 >::RET properly_cvd_return_type;
|
Chris@16
|
256
|
Chris@16
|
257
|
Chris@16
|
258 public:
|
Chris@16
|
259 typedef typename detail::IF<boost::is_reference<argument_type>::value,
|
Chris@16
|
260 typename boost::add_reference<properly_cvd_return_type>::type,
|
Chris@16
|
261 typename boost::remove_cv<T>::type
|
Chris@16
|
262 >::RET type;
|
Chris@16
|
263 };
|
Chris@16
|
264
|
Chris@16
|
265 template <class RET>
|
Chris@16
|
266 static RET apply( T Object::*data, Object& o) {
|
Chris@16
|
267 return o.*data;
|
Chris@16
|
268 }
|
Chris@16
|
269 template <class RET>
|
Chris@16
|
270 static RET apply( T Object::*data, const Object& o) {
|
Chris@16
|
271 return o.*data;
|
Chris@16
|
272 }
|
Chris@16
|
273 template <class RET>
|
Chris@16
|
274 static RET apply( T Object::*data, volatile Object& o) {
|
Chris@16
|
275 return o.*data;
|
Chris@16
|
276 }
|
Chris@16
|
277 template <class RET>
|
Chris@16
|
278 static RET apply( T Object::*data, const volatile Object& o) {
|
Chris@16
|
279 return o.*data;
|
Chris@16
|
280 }
|
Chris@16
|
281 template <class RET>
|
Chris@16
|
282 static RET apply( T Object::*data, Object* o) {
|
Chris@16
|
283 return o->*data;
|
Chris@16
|
284 }
|
Chris@16
|
285 template <class RET>
|
Chris@16
|
286 static RET apply( T Object::*data, const Object* o) {
|
Chris@16
|
287 return o->*data;
|
Chris@16
|
288 }
|
Chris@16
|
289 template <class RET>
|
Chris@16
|
290 static RET apply( T Object::*data, volatile Object* o) {
|
Chris@16
|
291 return o->*data;
|
Chris@16
|
292 }
|
Chris@16
|
293 template <class RET>
|
Chris@16
|
294 static RET apply( T Object::*data, const volatile Object* o) {
|
Chris@16
|
295 return o->*data;
|
Chris@16
|
296 }
|
Chris@16
|
297 };
|
Chris@16
|
298
|
Chris@16
|
299 // -- function adaptors with 1 argument apply
|
Chris@16
|
300
|
Chris@16
|
301 template <class Result>
|
Chris@16
|
302 struct function_adaptor<Result (void)> {
|
Chris@16
|
303
|
Chris@16
|
304 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
305 template <class RET>
|
Chris@16
|
306 static Result apply(Result (*func)()) {
|
Chris@16
|
307 return func();
|
Chris@16
|
308 }
|
Chris@16
|
309 };
|
Chris@16
|
310
|
Chris@16
|
311 template <class Result>
|
Chris@16
|
312 struct function_adaptor<Result (*)(void)> {
|
Chris@16
|
313
|
Chris@16
|
314 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
315 template <class RET>
|
Chris@16
|
316 static Result apply(Result (*func)()) {
|
Chris@16
|
317 return func();
|
Chris@16
|
318 }
|
Chris@16
|
319 };
|
Chris@16
|
320
|
Chris@16
|
321
|
Chris@16
|
322 // -- function adaptors with 2 argument apply
|
Chris@16
|
323 template <class Object, class Result>
|
Chris@16
|
324 struct function_adaptor<Result (Object::*)() const> {
|
Chris@16
|
325
|
Chris@16
|
326 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
327 template <class RET>
|
Chris@16
|
328 static Result apply( Result (Object::*func)() const, const Object* o) {
|
Chris@16
|
329 return (o->*func)();
|
Chris@16
|
330 }
|
Chris@16
|
331 template <class RET>
|
Chris@16
|
332 static Result apply( Result (Object::*func)() const, const Object& o) {
|
Chris@16
|
333 return (o.*func)();
|
Chris@16
|
334 }
|
Chris@16
|
335 };
|
Chris@16
|
336
|
Chris@16
|
337 template <class Object, class Result>
|
Chris@16
|
338 struct function_adaptor<Result (Object::*)()> {
|
Chris@16
|
339
|
Chris@16
|
340 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
341 template <class RET>
|
Chris@16
|
342 static Result apply( Result (Object::*func)(), Object* o) {
|
Chris@16
|
343 return (o->*func)();
|
Chris@16
|
344 }
|
Chris@16
|
345 template <class RET>
|
Chris@16
|
346 static Result apply( Result (Object::*func)(), Object& o) {
|
Chris@16
|
347 return (o.*func)();
|
Chris@16
|
348 }
|
Chris@16
|
349 };
|
Chris@16
|
350
|
Chris@16
|
351 template <class Arg1, class Result>
|
Chris@16
|
352 struct function_adaptor<Result (Arg1)> {
|
Chris@16
|
353
|
Chris@16
|
354 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
355 template <class RET, class A1>
|
Chris@16
|
356 static Result apply(Result (*func)(Arg1), A1& a1) {
|
Chris@16
|
357 return func(a1);
|
Chris@16
|
358 }
|
Chris@16
|
359 };
|
Chris@16
|
360
|
Chris@16
|
361 template <class Arg1, class Result>
|
Chris@16
|
362 struct function_adaptor<Result (*)(Arg1)> {
|
Chris@16
|
363
|
Chris@16
|
364 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
365 template <class RET, class A1>
|
Chris@16
|
366 static Result apply(Result (*func)(Arg1), A1& a1) {
|
Chris@16
|
367 return func(a1);
|
Chris@16
|
368 }
|
Chris@16
|
369 };
|
Chris@16
|
370
|
Chris@16
|
371
|
Chris@16
|
372 // -- function adaptors with 3 argument apply
|
Chris@16
|
373 template <class Object, class Arg1, class Result>
|
Chris@16
|
374 struct function_adaptor<Result (Object::*)(Arg1) const> {
|
Chris@16
|
375
|
Chris@16
|
376 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
377 template <class RET, class A1>
|
Chris@16
|
378 static Result apply( Result (Object::*func)(Arg1) const, const Object* o,
|
Chris@16
|
379 A1& a1) {
|
Chris@16
|
380 return (o->*func)(a1);
|
Chris@16
|
381 }
|
Chris@16
|
382 template <class RET, class A1>
|
Chris@16
|
383 static Result apply( Result (Object::*func)(Arg1) const, const Object& o,
|
Chris@16
|
384 A1& a1) {
|
Chris@16
|
385 return (o.*func)(a1);
|
Chris@16
|
386 }
|
Chris@16
|
387 };
|
Chris@16
|
388
|
Chris@16
|
389 template <class Object, class Arg1, class Result>
|
Chris@16
|
390 struct function_adaptor<Result (Object::*)(Arg1)> {
|
Chris@16
|
391
|
Chris@16
|
392 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
393 template <class RET, class A1>
|
Chris@16
|
394 static Result apply( Result (Object::*func)(Arg1), Object* o, A1& a1) {
|
Chris@16
|
395 return (o->*func)(a1);
|
Chris@16
|
396 }
|
Chris@16
|
397 template <class RET, class A1>
|
Chris@16
|
398 static Result apply( Result (Object::*func)(Arg1), Object& o, A1& a1) {
|
Chris@16
|
399 return (o.*func)(a1);
|
Chris@16
|
400 }
|
Chris@16
|
401 };
|
Chris@16
|
402
|
Chris@16
|
403 template <class Arg1, class Arg2, class Result>
|
Chris@16
|
404 struct function_adaptor<Result (Arg1, Arg2)> {
|
Chris@16
|
405
|
Chris@16
|
406 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
407 template <class RET, class A1, class A2>
|
Chris@16
|
408 static Result apply(Result (*func)(Arg1, Arg2), A1& a1, A2& a2) {
|
Chris@16
|
409 return func(a1, a2);
|
Chris@16
|
410 }
|
Chris@16
|
411 };
|
Chris@16
|
412
|
Chris@16
|
413 template <class Arg1, class Arg2, class Result>
|
Chris@16
|
414 struct function_adaptor<Result (*)(Arg1, Arg2)> {
|
Chris@16
|
415
|
Chris@16
|
416 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
417 template <class RET, class A1, class A2>
|
Chris@16
|
418 static Result apply(Result (*func)(Arg1, Arg2), A1& a1, A2& a2) {
|
Chris@16
|
419 return func(a1, a2);
|
Chris@16
|
420 }
|
Chris@16
|
421 };
|
Chris@16
|
422
|
Chris@16
|
423
|
Chris@16
|
424 // -- function adaptors with 4 argument apply
|
Chris@16
|
425 template <class Object, class Arg1, class Arg2, class Result>
|
Chris@16
|
426 struct function_adaptor<Result (Object::*)(Arg1, Arg2) const> {
|
Chris@16
|
427
|
Chris@16
|
428 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
429 template <class RET, class A1, class A2>
|
Chris@16
|
430 static Result apply( Result (Object::*func)(Arg1, Arg2) const, const Object* o, A1& a1, A2& a2) {
|
Chris@16
|
431 return (o->*func)(a1, a2);
|
Chris@16
|
432 }
|
Chris@16
|
433 template <class RET, class A1, class A2>
|
Chris@16
|
434 static Result apply( Result (Object::*func)(Arg1, Arg2) const, const Object& o, A1& a1, A2& a2) {
|
Chris@16
|
435 return (o.*func)(a1, a2);
|
Chris@16
|
436 }
|
Chris@16
|
437 };
|
Chris@16
|
438
|
Chris@16
|
439 template <class Object, class Arg1, class Arg2, class Result>
|
Chris@16
|
440 struct function_adaptor<Result (Object::*)(Arg1, Arg2)> {
|
Chris@16
|
441
|
Chris@16
|
442 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
443 template <class RET, class A1, class A2>
|
Chris@16
|
444 static Result apply( Result (Object::*func)(Arg1, Arg2), Object* o, A1& a1, A2& a2) {
|
Chris@16
|
445 return (o->*func)(a1, a2);
|
Chris@16
|
446 }
|
Chris@16
|
447 template <class RET, class A1, class A2>
|
Chris@16
|
448 static Result apply( Result (Object::*func)(Arg1, Arg2), Object& o, A1& a1, A2& a2) {
|
Chris@16
|
449 return (o.*func)(a1, a2);
|
Chris@16
|
450 }
|
Chris@16
|
451 };
|
Chris@16
|
452
|
Chris@16
|
453 template <class Arg1, class Arg2, class Arg3, class Result>
|
Chris@16
|
454 struct function_adaptor<Result (Arg1, Arg2, Arg3)> {
|
Chris@16
|
455
|
Chris@16
|
456 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
457 template <class RET, class A1, class A2, class A3>
|
Chris@16
|
458 static Result apply(Result (*func)(Arg1, Arg2, Arg3), A1& a1, A2& a2, A3& a3) {
|
Chris@16
|
459 return func(a1, a2, a3);
|
Chris@16
|
460 }
|
Chris@16
|
461 };
|
Chris@16
|
462
|
Chris@16
|
463 template <class Arg1, class Arg2, class Arg3, class Result>
|
Chris@16
|
464 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3)> {
|
Chris@16
|
465
|
Chris@16
|
466 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
467 template <class RET, class A1, class A2, class A3>
|
Chris@16
|
468 static Result apply(Result (*func)(Arg1, Arg2, Arg3), A1& a1, A2& a2, A3& a3) {
|
Chris@16
|
469 return func(a1, a2, a3);
|
Chris@16
|
470 }
|
Chris@16
|
471 };
|
Chris@16
|
472
|
Chris@16
|
473
|
Chris@16
|
474 // -- function adaptors with 5 argument apply
|
Chris@16
|
475 template <class Object, class Arg1, class Arg2, class Arg3, class Result>
|
Chris@16
|
476 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3) const> {
|
Chris@16
|
477
|
Chris@16
|
478 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
479 template <class RET, class A1, class A2, class A3>
|
Chris@16
|
480 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3) const, const Object* o, A1& a1, A2& a2, A3& a3) {
|
Chris@16
|
481 return (o->*func)(a1, a2, a3);
|
Chris@16
|
482 }
|
Chris@16
|
483 template <class RET, class A1, class A2, class A3>
|
Chris@16
|
484 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3) const, const Object& o, A1& a1, A2& a2, A3& a3) {
|
Chris@16
|
485 return (o.*func)(a1, a2, a3);
|
Chris@16
|
486 }
|
Chris@16
|
487 };
|
Chris@16
|
488
|
Chris@16
|
489 template <class Object, class Arg1, class Arg2, class Arg3, class Result>
|
Chris@16
|
490 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3)> {
|
Chris@16
|
491
|
Chris@16
|
492 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
493 template <class RET, class A1, class A2, class A3>
|
Chris@16
|
494 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3), Object* o, A1& a1, A2& a2, A3& a3) {
|
Chris@16
|
495 return (o->*func)(a1, a2, a3);
|
Chris@16
|
496 }
|
Chris@16
|
497 template <class RET, class A1, class A2, class A3>
|
Chris@16
|
498 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3), Object& o, A1& a1, A2& a2, A3& a3) {
|
Chris@16
|
499 return (o.*func)(a1, a2, a3);
|
Chris@16
|
500 }
|
Chris@16
|
501 };
|
Chris@16
|
502
|
Chris@16
|
503 template <class Arg1, class Arg2, class Arg3, class Arg4, class Result>
|
Chris@16
|
504 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4)> {
|
Chris@16
|
505
|
Chris@16
|
506 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
507 template <class RET, class A1, class A2, class A3, class A4>
|
Chris@16
|
508 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4), A1& a1, A2& a2, A3& a3, A4& a4) {
|
Chris@16
|
509 return func(a1, a2, a3, a4);
|
Chris@16
|
510 }
|
Chris@16
|
511 };
|
Chris@16
|
512
|
Chris@16
|
513 template <class Arg1, class Arg2, class Arg3, class Arg4, class Result>
|
Chris@16
|
514 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4)> {
|
Chris@16
|
515
|
Chris@16
|
516 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
517 template <class RET, class A1, class A2, class A3, class A4>
|
Chris@16
|
518 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4), A1& a1, A2& a2, A3& a3, A4& a4) {
|
Chris@16
|
519 return func(a1, a2, a3, a4);
|
Chris@16
|
520 }
|
Chris@16
|
521 };
|
Chris@16
|
522
|
Chris@16
|
523
|
Chris@16
|
524 // -- function adaptors with 6 argument apply
|
Chris@16
|
525 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Result>
|
Chris@16
|
526 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4) const> {
|
Chris@16
|
527
|
Chris@16
|
528 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
529 template <class RET, class A1, class A2, class A3, class A4>
|
Chris@16
|
530 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4) {
|
Chris@16
|
531 return (o->*func)(a1, a2, a3, a4);
|
Chris@16
|
532 }
|
Chris@16
|
533 template <class RET, class A1, class A2, class A3, class A4>
|
Chris@16
|
534 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4) {
|
Chris@16
|
535 return (o.*func)(a1, a2, a3, a4);
|
Chris@16
|
536 }
|
Chris@16
|
537 };
|
Chris@16
|
538
|
Chris@16
|
539 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Result>
|
Chris@16
|
540 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4)> {
|
Chris@16
|
541
|
Chris@16
|
542 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
543 template <class RET, class A1, class A2, class A3, class A4>
|
Chris@16
|
544 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4), Object* o, A1& a1, A2& a2, A3& a3, A4& a4) {
|
Chris@16
|
545 return (o->*func)(a1, a2, a3, a4);
|
Chris@16
|
546 }
|
Chris@16
|
547 template <class RET, class A1, class A2, class A3, class A4>
|
Chris@16
|
548 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4), Object& o, A1& a1, A2& a2, A3& a3, A4& a4) {
|
Chris@16
|
549 return (o.*func)(a1, a2, a3, a4);
|
Chris@16
|
550 }
|
Chris@16
|
551 };
|
Chris@16
|
552
|
Chris@16
|
553 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Result>
|
Chris@16
|
554 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5)> {
|
Chris@16
|
555
|
Chris@16
|
556 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
557 template <class RET, class A1, class A2, class A3, class A4, class A5>
|
Chris@16
|
558 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
|
Chris@16
|
559 return func(a1, a2, a3, a4, a5);
|
Chris@16
|
560 }
|
Chris@16
|
561 };
|
Chris@16
|
562
|
Chris@16
|
563 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Result>
|
Chris@16
|
564 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5)> {
|
Chris@16
|
565
|
Chris@16
|
566 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
567 template <class RET, class A1, class A2, class A3, class A4, class A5>
|
Chris@16
|
568 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
|
Chris@16
|
569 return func(a1, a2, a3, a4, a5);
|
Chris@16
|
570 }
|
Chris@16
|
571 };
|
Chris@16
|
572
|
Chris@16
|
573
|
Chris@16
|
574 // -- function adaptors with 7 argument apply
|
Chris@16
|
575 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Result>
|
Chris@16
|
576 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5) const> {
|
Chris@16
|
577
|
Chris@16
|
578 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
579 template <class RET, class A1, class A2, class A3, class A4, class A5>
|
Chris@16
|
580 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
|
Chris@16
|
581 return (o->*func)(a1, a2, a3, a4, a5);
|
Chris@16
|
582 }
|
Chris@16
|
583 template <class RET, class A1, class A2, class A3, class A4, class A5>
|
Chris@16
|
584 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
|
Chris@16
|
585 return (o.*func)(a1, a2, a3, a4, a5);
|
Chris@16
|
586 }
|
Chris@16
|
587 };
|
Chris@16
|
588
|
Chris@16
|
589 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Result>
|
Chris@16
|
590 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5)> {
|
Chris@16
|
591
|
Chris@16
|
592 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
593 template <class RET, class A1, class A2, class A3, class A4, class A5>
|
Chris@16
|
594 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
|
Chris@16
|
595 return (o->*func)(a1, a2, a3, a4, a5);
|
Chris@16
|
596 }
|
Chris@16
|
597 template <class RET, class A1, class A2, class A3, class A4, class A5>
|
Chris@16
|
598 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
|
Chris@16
|
599 return (o.*func)(a1, a2, a3, a4, a5);
|
Chris@16
|
600 }
|
Chris@16
|
601 };
|
Chris@16
|
602
|
Chris@16
|
603 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Result>
|
Chris@16
|
604 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> {
|
Chris@16
|
605
|
Chris@16
|
606 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
607 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
|
Chris@16
|
608 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
|
Chris@16
|
609 return func(a1, a2, a3, a4, a5, a6);
|
Chris@16
|
610 }
|
Chris@16
|
611 };
|
Chris@16
|
612
|
Chris@16
|
613 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Result>
|
Chris@16
|
614 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> {
|
Chris@16
|
615
|
Chris@16
|
616 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
617 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
|
Chris@16
|
618 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
|
Chris@16
|
619 return func(a1, a2, a3, a4, a5, a6);
|
Chris@16
|
620 }
|
Chris@16
|
621 };
|
Chris@16
|
622
|
Chris@16
|
623
|
Chris@16
|
624 // -- function adaptors with 8 argument apply
|
Chris@16
|
625 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Result>
|
Chris@16
|
626 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const> {
|
Chris@16
|
627
|
Chris@16
|
628 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
629 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
|
Chris@16
|
630 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
|
Chris@16
|
631 return (o->*func)(a1, a2, a3, a4, a5, a6);
|
Chris@16
|
632 }
|
Chris@16
|
633 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
|
Chris@16
|
634 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
|
Chris@16
|
635 return (o.*func)(a1, a2, a3, a4, a5, a6);
|
Chris@16
|
636 }
|
Chris@16
|
637 };
|
Chris@16
|
638
|
Chris@16
|
639 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Result>
|
Chris@16
|
640 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> {
|
Chris@16
|
641
|
Chris@16
|
642 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
643 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
|
Chris@16
|
644 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
|
Chris@16
|
645 return (o->*func)(a1, a2, a3, a4, a5, a6);
|
Chris@16
|
646 }
|
Chris@16
|
647 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
|
Chris@16
|
648 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
|
Chris@16
|
649 return (o.*func)(a1, a2, a3, a4, a5, a6);
|
Chris@16
|
650 }
|
Chris@16
|
651 };
|
Chris@16
|
652
|
Chris@16
|
653 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Result>
|
Chris@16
|
654 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> {
|
Chris@16
|
655
|
Chris@16
|
656 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
657 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
|
Chris@16
|
658 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
|
Chris@16
|
659 return func(a1, a2, a3, a4, a5, a6, a7);
|
Chris@16
|
660 }
|
Chris@16
|
661 };
|
Chris@16
|
662
|
Chris@16
|
663 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Result>
|
Chris@16
|
664 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> {
|
Chris@16
|
665
|
Chris@16
|
666 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
667 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
|
Chris@16
|
668 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
|
Chris@16
|
669 return func(a1, a2, a3, a4, a5, a6, a7);
|
Chris@16
|
670 }
|
Chris@16
|
671 };
|
Chris@16
|
672
|
Chris@16
|
673
|
Chris@16
|
674 // -- function adaptors with 9 argument apply
|
Chris@16
|
675 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Result>
|
Chris@16
|
676 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const> {
|
Chris@16
|
677
|
Chris@16
|
678 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
679 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
|
Chris@16
|
680 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
|
Chris@16
|
681 return (o->*func)(a1, a2, a3, a4, a5, a6, a7);
|
Chris@16
|
682 }
|
Chris@16
|
683 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
|
Chris@16
|
684 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
|
Chris@16
|
685 return (o.*func)(a1, a2, a3, a4, a5, a6, a7);
|
Chris@16
|
686 }
|
Chris@16
|
687 };
|
Chris@16
|
688
|
Chris@16
|
689 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Result>
|
Chris@16
|
690 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> {
|
Chris@16
|
691
|
Chris@16
|
692 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
693 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
|
Chris@16
|
694 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
|
Chris@16
|
695 return (o->*func)(a1, a2, a3, a4, a5, a6, a7);
|
Chris@16
|
696 }
|
Chris@16
|
697 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
|
Chris@16
|
698 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
|
Chris@16
|
699 return (o.*func)(a1, a2, a3, a4, a5, a6, a7);
|
Chris@16
|
700 }
|
Chris@16
|
701 };
|
Chris@16
|
702
|
Chris@16
|
703 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Result>
|
Chris@16
|
704 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)> {
|
Chris@16
|
705
|
Chris@16
|
706 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
707 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
|
Chris@16
|
708 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
|
Chris@16
|
709 return func(a1, a2, a3, a4, a5, a6, a7, a8);
|
Chris@16
|
710 }
|
Chris@16
|
711 };
|
Chris@16
|
712
|
Chris@16
|
713 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Result>
|
Chris@16
|
714 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)> {
|
Chris@16
|
715
|
Chris@16
|
716 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
717 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
|
Chris@16
|
718 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
|
Chris@16
|
719 return func(a1, a2, a3, a4, a5, a6, a7, a8);
|
Chris@16
|
720 }
|
Chris@16
|
721 };
|
Chris@16
|
722
|
Chris@16
|
723
|
Chris@16
|
724 // -- function adaptors with 10 argument apply
|
Chris@16
|
725 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Result>
|
Chris@16
|
726 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) const> {
|
Chris@16
|
727
|
Chris@16
|
728 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
729 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
|
Chris@16
|
730 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
|
Chris@16
|
731 return (o->*func)(a1, a2, a3, a4, a5, a6, a7, a8);
|
Chris@16
|
732 }
|
Chris@16
|
733 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
|
Chris@16
|
734 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
|
Chris@16
|
735 return (o.*func)(a1, a2, a3, a4, a5, a6, a7, a8);
|
Chris@16
|
736 }
|
Chris@16
|
737 };
|
Chris@16
|
738
|
Chris@16
|
739 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Result>
|
Chris@16
|
740 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)> {
|
Chris@16
|
741
|
Chris@16
|
742 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
743 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
|
Chris@16
|
744 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
|
Chris@16
|
745 return (o->*func)(a1, a2, a3, a4, a5, a6, a7, a8);
|
Chris@16
|
746 }
|
Chris@16
|
747 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
|
Chris@16
|
748 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
|
Chris@16
|
749 return (o.*func)(a1, a2, a3, a4, a5, a6, a7, a8);
|
Chris@16
|
750 }
|
Chris@16
|
751 };
|
Chris@16
|
752
|
Chris@16
|
753 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9, class Result>
|
Chris@16
|
754 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9)> {
|
Chris@16
|
755
|
Chris@16
|
756 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
757 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
|
Chris@16
|
758 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) {
|
Chris@16
|
759 return func(a1, a2, a3, a4, a5, a6, a7, a8, a9);
|
Chris@16
|
760 }
|
Chris@16
|
761 };
|
Chris@16
|
762
|
Chris@16
|
763 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9, class Result>
|
Chris@16
|
764 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9)> {
|
Chris@16
|
765
|
Chris@16
|
766 template<class T> struct sig { typedef Result type; };
|
Chris@16
|
767 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
|
Chris@16
|
768 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) {
|
Chris@16
|
769 return func(a1, a2, a3, a4, a5, a6, a7, a8, a9);
|
Chris@16
|
770 }
|
Chris@16
|
771 };
|
Chris@16
|
772
|
Chris@16
|
773 } // namespace lambda
|
Chris@16
|
774 } // namespace boost
|
Chris@16
|
775
|
Chris@16
|
776 #endif
|
Chris@16
|
777
|
Chris@16
|
778
|
Chris@16
|
779
|
Chris@16
|
780
|
Chris@16
|
781
|
Chris@16
|
782
|
Chris@16
|
783
|
Chris@16
|
784
|
Chris@16
|
785
|
Chris@16
|
786
|
Chris@16
|
787
|
Chris@16
|
788
|
Chris@16
|
789
|