Classdesc 3.44
functiondb6.h
1#ifndef CLASSDESC_FUNCTIONDB6
2#define CLASSDESC_FUNCTIONDB6
3template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
4struct Arg<R (*)(A1,A2,A3,A4,A5,A6), 1>
5{
6 typedef A1 T;
7 typedef T type;
8};
9
10template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
11struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6), 1>
12{
13 typedef A1 T;
14 typedef T type;
15};
16
17template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
18struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const, 1>
19{
20 typedef A1 T;
21 typedef T type;
22};
23
24#if defined(__cplusplus) && __cplusplus>=201703L
25// noexcept methods
26template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
27struct Arg<R (*)(A1,A2,A3,A4,A5,A6) noexcept, 1>
28{
29 typedef A1 T;
30 typedef T type;
31};
32
33template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
34struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept, 1>
35{
36 typedef A1 T;
37 typedef T type;
38};
39
40template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
41struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept, 1>
42{
43 typedef A1 T;
44 typedef T type;
45};
46#endif
47template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
48struct Arg<R (*)(A1,A2,A3,A4,A5,A6), 2>
49{
50 typedef A2 T;
51 typedef T type;
52};
53
54template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
55struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6), 2>
56{
57 typedef A2 T;
58 typedef T type;
59};
60
61template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
62struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const, 2>
63{
64 typedef A2 T;
65 typedef T type;
66};
67
68#if defined(__cplusplus) && __cplusplus>=201703L
69// noexcept methods
70template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
71struct Arg<R (*)(A1,A2,A3,A4,A5,A6) noexcept, 2>
72{
73 typedef A2 T;
74 typedef T type;
75};
76
77template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
78struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept, 2>
79{
80 typedef A2 T;
81 typedef T type;
82};
83
84template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
85struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept, 2>
86{
87 typedef A2 T;
88 typedef T type;
89};
90#endif
91template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
92struct Arg<R (*)(A1,A2,A3,A4,A5,A6), 3>
93{
94 typedef A3 T;
95 typedef T type;
96};
97
98template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
99struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6), 3>
100{
101 typedef A3 T;
102 typedef T type;
103};
104
105template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
106struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const, 3>
107{
108 typedef A3 T;
109 typedef T type;
110};
111
112#if defined(__cplusplus) && __cplusplus>=201703L
113// noexcept methods
114template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
115struct Arg<R (*)(A1,A2,A3,A4,A5,A6) noexcept, 3>
116{
117 typedef A3 T;
118 typedef T type;
119};
120
121template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
122struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept, 3>
123{
124 typedef A3 T;
125 typedef T type;
126};
127
128template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
129struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept, 3>
130{
131 typedef A3 T;
132 typedef T type;
133};
134#endif
135template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
136struct Arg<R (*)(A1,A2,A3,A4,A5,A6), 4>
137{
138 typedef A4 T;
139 typedef T type;
140};
141
142template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
143struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6), 4>
144{
145 typedef A4 T;
146 typedef T type;
147};
148
149template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
150struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const, 4>
151{
152 typedef A4 T;
153 typedef T type;
154};
155
156#if defined(__cplusplus) && __cplusplus>=201703L
157// noexcept methods
158template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
159struct Arg<R (*)(A1,A2,A3,A4,A5,A6) noexcept, 4>
160{
161 typedef A4 T;
162 typedef T type;
163};
164
165template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
166struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept, 4>
167{
168 typedef A4 T;
169 typedef T type;
170};
171
172template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
173struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept, 4>
174{
175 typedef A4 T;
176 typedef T type;
177};
178#endif
179template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
180struct Arg<R (*)(A1,A2,A3,A4,A5,A6), 5>
181{
182 typedef A5 T;
183 typedef T type;
184};
185
186template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
187struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6), 5>
188{
189 typedef A5 T;
190 typedef T type;
191};
192
193template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
194struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const, 5>
195{
196 typedef A5 T;
197 typedef T type;
198};
199
200#if defined(__cplusplus) && __cplusplus>=201703L
201// noexcept methods
202template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
203struct Arg<R (*)(A1,A2,A3,A4,A5,A6) noexcept, 5>
204{
205 typedef A5 T;
206 typedef T type;
207};
208
209template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
210struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept, 5>
211{
212 typedef A5 T;
213 typedef T type;
214};
215
216template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
217struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept, 5>
218{
219 typedef A5 T;
220 typedef T type;
221};
222#endif
223template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
224struct Arg<R (*)(A1,A2,A3,A4,A5,A6), 6>
225{
226 typedef A6 T;
227 typedef T type;
228};
229
230template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
231struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6), 6>
232{
233 typedef A6 T;
234 typedef T type;
235};
236
237template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
238struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const, 6>
239{
240 typedef A6 T;
241 typedef T type;
242};
243
244#if defined(__cplusplus) && __cplusplus>=201703L
245// noexcept methods
246template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
247struct Arg<R (*)(A1,A2,A3,A4,A5,A6) noexcept, 6>
248{
249 typedef A6 T;
250 typedef T type;
251};
252
253template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
254struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept, 6>
255{
256 typedef A6 T;
257 typedef T type;
258};
259
260template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
261struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept, 6>
262{
263 typedef A6 T;
264 typedef T type;
265};
266#endif
267template <class F, template<class> class P>
268struct AllArgs<F,P,6>
269{
270 static const bool value=true && P<typename Arg<F,1>::T>::value && P<typename Arg<F,2>::T>::value && P<typename Arg<F,3>::T>::value && P<typename Arg<F,4>::T>::value && P<typename Arg<F,5>::T>::value && P<typename Arg<F,6>::T>::value;
271};
272
273
274template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
275struct Arity<R (*)(A1,A2,A3,A4,A5,A6)>
276{
277 static const int V=6;
278 static const int value=6;
279};
280
281template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
282struct Return<R (*)(A1,A2,A3,A4,A5,A6)>
283{
284 typedef R T;
285 typedef R type;
286};
287
288template <class C,class R, class A1, class A2, class A3, class A4, class A5, class A6>
289struct Arity<R (* C::*)(A1,A2,A3,A4,A5,A6)>
290{
291 static const int V=6;
292 static const int value=6;
293};
294
295template <class C,class R, class A1, class A2, class A3, class A4, class A5, class A6>
296struct Return<R (* C::*)(A1,A2,A3,A4,A5,A6)>
297{
298 typedef R T;
299 typedef R type;
300};
301
302template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
303struct Arity<R (C::*)(A1,A2,A3,A4,A5,A6)>
304{
305 static const int V=6;
306 static const int value=6;
307};
308
309template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
310struct Return<R (C::*)(A1,A2,A3,A4,A5,A6)>
311{
312 typedef R T;
313 typedef R type;
314};
315
316template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
317struct Arity<R (C::*)(A1,A2,A3,A4,A5,A6) const>
318{
319 static const int V=6;
320 static const int value=6;
321};
322
323template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
324struct Return<R (C::*)(A1,A2,A3,A4,A5,A6) const>
325{
326 typedef R T;
327 typedef R type;
328};
329
330template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
331struct ClassOf<R (C::*)(A1,A2,A3,A4,A5,A6)>
332{
333 typedef C T;
334 typedef C type;
335};
336
337template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
338struct ClassOf<R (*C::*)(A1,A2,A3,A4,A5,A6)>
339{
340 typedef C T;
341 typedef C type;
342};
343
344template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
345struct ClassOf<R (C::*)(A1,A2,A3,A4,A5,A6) const>
346{
347 typedef C T;
348 typedef C type;
349};
350
351template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
352struct is_member_function_ptr<R (C::*)(A1,A2,A3,A4,A5,A6)>
353{
354 static const bool value=true;
355};
356
357template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
358struct is_member_function_ptr<R (C::*)(A1,A2,A3,A4,A5,A6) const>
359{
360 static const bool value=true;
361};
362
363template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
364struct is_const_method<R (C::*)(A1,A2,A3,A4,A5,A6) const>
365{
366 static const bool value=true;
367};
368
369template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
370struct is_nonmember_function_ptr<R (*)(A1,A2,A3,A4,A5,A6)>
371{
372 static const bool value=true;
373};
374
375template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
376struct is_nonmember_function_ptr<R (*C::*)(A1,A2,A3,A4,A5,A6)>
377{
378 static const bool value=true;
379};
380
381template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6>
382class bound_method<C, R (D::*)(A1,A2,A3,A4,A5,A6)>
383{
384 typedef R (D::*M)(A1,A2,A3,A4,A5,A6);
385 C* obj;
386 M method;
387 public:
388 static const int arity=6;
389 typedef R Ret;
390 template <int i> struct Arg: public functional::Arg<M,i> {};
391 bound_method(C& obj, M method): obj(&obj), method(method) {}
392 typename enable_if<Not<classdesc::is_const<C> >, R>::T
393 operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {return (obj->*method)(a1,a2,a3,a4,a5,a6);}
394 void rebind(C& newObj) {obj=&newObj;}
395 static const bool is_const=false;
396};
397
398template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6>
399class bound_method<const C, R (D::*)(A1,A2,A3,A4,A5,A6)>
400{
401 typedef R (D::*M)(A1,A2,A3,A4,A5,A6);
402 const C* obj;
403 M method;
404 public:
405 static const int arity=6;
406 typedef R Ret;
407 template <int i> struct Arg: public functional::Arg<M,i> {};
408 bound_method(const C& obj, M method): obj(&obj), method(method) {}
409 R operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {
410 throw std::runtime_error("cannot call method, inappropriate argument type");
411 }
412 void rebind(C& newObj) {obj=&newObj;}
413 static const bool is_const=false;
414};
415
416template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6>
417class bound_method<C, R (D::*)(A1,A2,A3,A4,A5,A6) const>
418{
419 typedef R (D::*M)(A1,A2,A3,A4,A5,A6) const;
420 C& obj;
421 M method;
422 public:
423 static const int arity=6;
424 typedef R Ret;
425 template <int i> struct Arg: public functional::Arg<M,i> {};
426 bound_method(C& obj, M method): obj(obj), method(method) {}
427 R operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {return (obj.*method)(a1,a2,a3,a4,a5,a6);}
428 static const bool is_const=true;
429};
430
431#if defined(__cplusplus) && __cplusplus>=201703L
432// noexcept methods
433
434template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
435struct Arity<R (*)(A1,A2,A3,A4,A5,A6) noexcept>
436{
437 static const int V=6;
438 static const int value=6;
439};
440
441template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
442struct Return<R (*)(A1,A2,A3,A4,A5,A6) noexcept>
443{
444 typedef R T;
445 typedef R type;
446};
447
448template <class C,class R, class A1, class A2, class A3, class A4, class A5, class A6>
449struct Arity<R (* C::*)(A1,A2,A3,A4,A5,A6) noexcept>
450{
451 static const int V=6;
452 static const int value=6;
453};
454
455template <class C,class R, class A1, class A2, class A3, class A4, class A5, class A6>
456struct Return<R (* C::*)(A1,A2,A3,A4,A5,A6) noexcept>
457{
458 typedef R T;
459 typedef R type;
460};
461
462template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
463struct Arity<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept>
464{
465 static const int V=6;
466 static const int value=6;
467};
468
469template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
470struct Return<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept>
471{
472 typedef R T;
473 typedef R type;
474};
475
476template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
477struct Arity<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept>
478{
479 static const int V=6;
480 static const int value=6;
481};
482
483template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
484struct Return<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept>
485{
486 typedef R T;
487 typedef R type;
488};
489
490template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
491struct ClassOf<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept>
492{
493 typedef C T;
494 typedef C type;
495};
496
497template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
498struct ClassOf<R (*C::*)(A1,A2,A3,A4,A5,A6) noexcept>
499{
500 typedef C T;
501 typedef C type;
502};
503
504template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
505struct ClassOf<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept>
506{
507 typedef C T;
508 typedef C type;
509};
510
511template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
512struct is_member_function_ptr<R (C::*)(A1,A2,A3,A4,A5,A6) noexcept>
513{
514 static const bool value=true;
515};
516
517template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
518struct is_member_function_ptr<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept>
519{
520 static const bool value=true;
521};
522
523template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
524struct is_const_method<R (C::*)(A1,A2,A3,A4,A5,A6) const noexcept>
525{
526 static const bool value=true;
527};
528
529template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
530struct is_nonmember_function_ptr<R (*)(A1,A2,A3,A4,A5,A6) noexcept>
531{
532 static const bool value=true;
533};
534
535template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
536struct is_nonmember_function_ptr<R (*C::*)(A1,A2,A3,A4,A5,A6) noexcept>
537{
538 static const bool value=true;
539};
540
541template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6>
542class bound_method<C, R (D::*)(A1,A2,A3,A4,A5,A6) noexcept>
543{
544 typedef R (D::*M)(A1,A2,A3,A4,A5,A6);
545 C* obj;
546 M method;
547 public:
548 static const int arity=6;
549 typedef R Ret;
550 template <int i> struct Arg: public functional::Arg<M,i> {};
551 bound_method(C& obj, M method): obj(&obj), method(method) {}
552 typename enable_if<Not<classdesc::is_const<C> >, R>::T
553 operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {return (obj->*method)(a1,a2,a3,a4,a5,a6);}
554 void rebind(C& newObj) {obj=&newObj;}
555 static const bool is_const=false;
556};
557
558template <class C, class D, class A1, class A2, class A3, class A4, class A5, class A6>
559class bound_method<C, void (D::*)(A1,A2,A3,A4,A5,A6) noexcept>
560{
561 typedef void (D::*M)(A1,A2,A3,A4,A5,A6);
562 C* obj;
563 M method;
564 public:
565 static const int arity=6;
566 typedef void Ret;
567 template <int i> struct Arg: public functional::Arg<M,i> {};
568 bound_method(C& obj, M method): obj(&obj), method(method) {}
569 typename enable_if<Not<classdesc::is_const<C> > >::T
570 operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {(obj->*method)(a1,a2,a3,a4,a5,a6);}
571 void rebind(C& newObj) {obj=&newObj;}
572 static const bool is_const=false;
573};
574
575template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6>
576class bound_method<const C, R (D::*)(A1,A2,A3,A4,A5,A6) noexcept>
577{
578 typedef R (D::*M)(A1,A2,A3,A4,A5,A6);
579 const C* obj;
580 M method;
581 public:
582 static const int arity=6;
583 typedef R Ret;
584 template <int i> struct Arg: public functional::Arg<M,i> {};
585 bound_method(const C& obj, M method): obj(&obj), method(method) {}
586 R operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {
587 throw std::runtime_error("cannot call method, inappropriate argument type");
588 }
589 void rebind(C& newObj) {obj=&newObj;}
590 static const bool is_const=false;
591};
592
593template <class C, class D, class A1, class A2, class A3, class A4, class A5, class A6>
594class bound_method<const C, void (D::*)(A1,A2,A3,A4,A5,A6) noexcept>
595{
596 typedef void (D::*M)(A1,A2,A3,A4,A5,A6);
597 const C* obj;
598 M method;
599 public:
600 static const int arity=6;
601 typedef void Ret;
602 template <int i> struct Arg: public functional::Arg<M,i> {};
603 bound_method(const C& obj, M method): obj(&obj), method(method) {}
604 typename enable_if<Not<classdesc::is_const<C> > >::T
605 operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {
606 throw std::runtime_error("cannot call method, inappropriate argument type");
607 }
608 void rebind(C& newObj) {obj=&newObj;}
609 static const bool is_const=false;
610};
611
612template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6>
613class bound_method<C, R (D::*)(A1,A2,A3,A4,A5,A6) const noexcept>
614{
615 typedef R (D::*M)(A1,A2,A3,A4,A5,A6) const;
616 C& obj;
617 M method;
618 public:
619 static const int arity=6;
620 typedef R Ret;
621 template <int i> struct Arg: public functional::Arg<M,i> {};
622 bound_method(C& obj, M method): obj(obj), method(method) {}
623 R operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {return (obj.*method)(a1,a2,a3,a4,a5,a6);}
624 static const bool is_const=true;
625};
626
627template <class C, class D, class A1, class A2, class A3, class A4, class A5, class A6>
628class bound_method<C, void (D::*)(A1,A2,A3,A4,A5,A6) const noexcept>
629{
630 typedef void (D::*M)(A1,A2,A3,A4,A5,A6) const;
631 C& obj;
632 M method;
633 public:
634 static const int arity=6;
635 typedef void Ret;
636 template <int i> struct Arg: public functional::Arg<M,i> {};
637 bound_method(C& obj, M method): obj(obj), method(method) {}
638 void operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6) const {(obj.*method)(a1,a2,a3,a4,a5,a6);}
639 static const bool is_const=true;
640};
641#endif
642
643template <class F, class Args>
644typename enable_if<And<AllArgs<F, is_rvalue>, Eq<Arity<F>::value, 6> >,
645 typename Return<F>::T>::T
646apply_nonvoid_fn(F f, Args& a, Fdummy<F> dum=0)
647{
648 return f(a[0],a[1],a[2],a[3],a[4],a[5]);
649}
650
651/*
652 TODO: if any of the arguments to f are lvalues, we need to construct temporaries,
653 which require C++-11 ability to test for the existence of a copy constructor.
654 If the return type is not copy constructable, the user must arrange for the return value to be discarded
655*/
656
657template <class F, class Args>
658typename enable_if<And<AllArgs<F, is_rvalue>, Eq<Arity<F>::value, 6> >,
659 void>::T
660apply_void_fn(F f, Args& a, Fdummy<F> dum=0)
661{
662 f(a[0],a[1],a[2],a[3],a[4],a[5]);
663}
664
665template <class Buffer, class F>
666typename enable_if<Eq<Arity<F>::value, 6>, typename Return<F>::T>::T
667callOnBuffer(Buffer& buffer, F f)
668{
669 typename remove_const<typename remove_reference<typename Arg<F,1>::T>::type>::type a1;
670 buffer>>a1;
671 typename remove_const<typename remove_reference<typename Arg<F,2>::T>::type>::type a2;
672 buffer>>a2;
673 typename remove_const<typename remove_reference<typename Arg<F,3>::T>::type>::type a3;
674 buffer>>a3;
675 typename remove_const<typename remove_reference<typename Arg<F,4>::T>::type>::type a4;
676 buffer>>a4;
677 typename remove_const<typename remove_reference<typename Arg<F,5>::T>::type>::type a5;
678 buffer>>a5;
679 typename remove_const<typename remove_reference<typename Arg<F,6>::T>::type>::type a6;
680 buffer>>a6;
681 return f(
682a1
683,
684a2
685,
686a3
687,
688a4
689,
690a5
691,
692a6
693 );
694}
695#endif