Classdesc 3.44
functiondb7.h
1#ifndef CLASSDESC_FUNCTIONDB7
2#define CLASSDESC_FUNCTIONDB7
3template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
4struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
11struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
18struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
27struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
34struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
41struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
48struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
55struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
62struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
71struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
78struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
85struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
92struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
99struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
106struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
115struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
122struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
129struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
136struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
143struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
150struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
159struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
166struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
173struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
180struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
187struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
194struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
203struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
210struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
217struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
224struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
231struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7), 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, class A7>
238struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
247struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
254struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) 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, class A7>
261struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept, 6>
262{
263 typedef A6 T;
264 typedef T type;
265};
266#endif
267template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
268struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7), 7>
269{
270 typedef A7 T;
271 typedef T type;
272};
273
274template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
275struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7), 7>
276{
277 typedef A7 T;
278 typedef T type;
279};
280
281template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
282struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const, 7>
283{
284 typedef A7 T;
285 typedef T type;
286};
287
288#if defined(__cplusplus) && __cplusplus>=201703L
289// noexcept methods
290template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
291struct Arg<R (*)(A1,A2,A3,A4,A5,A6,A7) noexcept, 7>
292{
293 typedef A7 T;
294 typedef T type;
295};
296
297template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
298struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept, 7>
299{
300 typedef A7 T;
301 typedef T type;
302};
303
304template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
305struct Arg<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept, 7>
306{
307 typedef A7 T;
308 typedef T type;
309};
310#endif
311template <class F, template<class> class P>
312struct AllArgs<F,P,7>
313{
314 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 && P<typename Arg<F,7>::T>::value;
315};
316
317
318template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
319struct Arity<R (*)(A1,A2,A3,A4,A5,A6,A7)>
320{
321 static const int V=7;
322 static const int value=7;
323};
324
325template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
326struct Return<R (*)(A1,A2,A3,A4,A5,A6,A7)>
327{
328 typedef R T;
329 typedef R type;
330};
331
332template <class C,class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
333struct Arity<R (* C::*)(A1,A2,A3,A4,A5,A6,A7)>
334{
335 static const int V=7;
336 static const int value=7;
337};
338
339template <class C,class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
340struct Return<R (* C::*)(A1,A2,A3,A4,A5,A6,A7)>
341{
342 typedef R T;
343 typedef R type;
344};
345
346template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
347struct Arity<R (C::*)(A1,A2,A3,A4,A5,A6,A7)>
348{
349 static const int V=7;
350 static const int value=7;
351};
352
353template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
354struct Return<R (C::*)(A1,A2,A3,A4,A5,A6,A7)>
355{
356 typedef R T;
357 typedef R type;
358};
359
360template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
361struct Arity<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const>
362{
363 static const int V=7;
364 static const int value=7;
365};
366
367template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
368struct Return<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const>
369{
370 typedef R T;
371 typedef R type;
372};
373
374template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
375struct ClassOf<R (C::*)(A1,A2,A3,A4,A5,A6,A7)>
376{
377 typedef C T;
378 typedef C type;
379};
380
381template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
382struct ClassOf<R (*C::*)(A1,A2,A3,A4,A5,A6,A7)>
383{
384 typedef C T;
385 typedef C type;
386};
387
388template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
389struct ClassOf<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const>
390{
391 typedef C T;
392 typedef C type;
393};
394
395template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
396struct is_member_function_ptr<R (C::*)(A1,A2,A3,A4,A5,A6,A7)>
397{
398 static const bool value=true;
399};
400
401template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
402struct is_member_function_ptr<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const>
403{
404 static const bool value=true;
405};
406
407template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
408struct is_const_method<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const>
409{
410 static const bool value=true;
411};
412
413template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
414struct is_nonmember_function_ptr<R (*)(A1,A2,A3,A4,A5,A6,A7)>
415{
416 static const bool value=true;
417};
418
419template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
420struct is_nonmember_function_ptr<R (*C::*)(A1,A2,A3,A4,A5,A6,A7)>
421{
422 static const bool value=true;
423};
424
425template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
426class bound_method<C, R (D::*)(A1,A2,A3,A4,A5,A6,A7)>
427{
428 typedef R (D::*M)(A1,A2,A3,A4,A5,A6,A7);
429 C* obj;
430 M method;
431 public:
432 static const int arity=7;
433 typedef R Ret;
434 template <int i> struct Arg: public functional::Arg<M,i> {};
435 bound_method(C& obj, M method): obj(&obj), method(method) {}
436 typename enable_if<Not<classdesc::is_const<C> >, R>::T
437 operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {return (obj->*method)(a1,a2,a3,a4,a5,a6,a7);}
438 void rebind(C& newObj) {obj=&newObj;}
439 static const bool is_const=false;
440};
441
442template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
443class bound_method<const C, R (D::*)(A1,A2,A3,A4,A5,A6,A7)>
444{
445 typedef R (D::*M)(A1,A2,A3,A4,A5,A6,A7);
446 const C* obj;
447 M method;
448 public:
449 static const int arity=7;
450 typedef R Ret;
451 template <int i> struct Arg: public functional::Arg<M,i> {};
452 bound_method(const C& obj, M method): obj(&obj), method(method) {}
453 R operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {
454 throw std::runtime_error("cannot call method, inappropriate argument type");
455 }
456 void rebind(C& newObj) {obj=&newObj;}
457 static const bool is_const=false;
458};
459
460template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
461class bound_method<C, R (D::*)(A1,A2,A3,A4,A5,A6,A7) const>
462{
463 typedef R (D::*M)(A1,A2,A3,A4,A5,A6,A7) const;
464 C& obj;
465 M method;
466 public:
467 static const int arity=7;
468 typedef R Ret;
469 template <int i> struct Arg: public functional::Arg<M,i> {};
470 bound_method(C& obj, M method): obj(obj), method(method) {}
471 R operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {return (obj.*method)(a1,a2,a3,a4,a5,a6,a7);}
472 static const bool is_const=true;
473};
474
475#if defined(__cplusplus) && __cplusplus>=201703L
476// noexcept methods
477
478template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
479struct Arity<R (*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
480{
481 static const int V=7;
482 static const int value=7;
483};
484
485template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
486struct Return<R (*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
487{
488 typedef R T;
489 typedef R type;
490};
491
492template <class C,class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
493struct Arity<R (* C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
494{
495 static const int V=7;
496 static const int value=7;
497};
498
499template <class C,class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
500struct Return<R (* C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
501{
502 typedef R T;
503 typedef R type;
504};
505
506template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
507struct Arity<R (C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
508{
509 static const int V=7;
510 static const int value=7;
511};
512
513template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
514struct Return<R (C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
515{
516 typedef R T;
517 typedef R type;
518};
519
520template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
521struct Arity<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept>
522{
523 static const int V=7;
524 static const int value=7;
525};
526
527template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
528struct Return<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept>
529{
530 typedef R T;
531 typedef R type;
532};
533
534template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
535struct ClassOf<R (C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
536{
537 typedef C T;
538 typedef C type;
539};
540
541template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
542struct ClassOf<R (*C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
543{
544 typedef C T;
545 typedef C type;
546};
547
548template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
549struct ClassOf<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept>
550{
551 typedef C T;
552 typedef C type;
553};
554
555template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
556struct is_member_function_ptr<R (C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
557{
558 static const bool value=true;
559};
560
561template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
562struct is_member_function_ptr<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept>
563{
564 static const bool value=true;
565};
566
567template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
568struct is_const_method<R (C::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept>
569{
570 static const bool value=true;
571};
572
573template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
574struct is_nonmember_function_ptr<R (*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
575{
576 static const bool value=true;
577};
578
579template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
580struct is_nonmember_function_ptr<R (*C::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
581{
582 static const bool value=true;
583};
584
585template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
586class bound_method<C, R (D::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
587{
588 typedef R (D::*M)(A1,A2,A3,A4,A5,A6,A7);
589 C* obj;
590 M method;
591 public:
592 static const int arity=7;
593 typedef R Ret;
594 template <int i> struct Arg: public functional::Arg<M,i> {};
595 bound_method(C& obj, M method): obj(&obj), method(method) {}
596 typename enable_if<Not<classdesc::is_const<C> >, R>::T
597 operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {return (obj->*method)(a1,a2,a3,a4,a5,a6,a7);}
598 void rebind(C& newObj) {obj=&newObj;}
599 static const bool is_const=false;
600};
601
602template <class C, class D, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
603class bound_method<C, void (D::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
604{
605 typedef void (D::*M)(A1,A2,A3,A4,A5,A6,A7);
606 C* obj;
607 M method;
608 public:
609 static const int arity=7;
610 typedef void Ret;
611 template <int i> struct Arg: public functional::Arg<M,i> {};
612 bound_method(C& obj, M method): obj(&obj), method(method) {}
613 typename enable_if<Not<classdesc::is_const<C> > >::T
614 operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {(obj->*method)(a1,a2,a3,a4,a5,a6,a7);}
615 void rebind(C& newObj) {obj=&newObj;}
616 static const bool is_const=false;
617};
618
619template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
620class bound_method<const C, R (D::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
621{
622 typedef R (D::*M)(A1,A2,A3,A4,A5,A6,A7);
623 const C* obj;
624 M method;
625 public:
626 static const int arity=7;
627 typedef R Ret;
628 template <int i> struct Arg: public functional::Arg<M,i> {};
629 bound_method(const C& obj, M method): obj(&obj), method(method) {}
630 R operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {
631 throw std::runtime_error("cannot call method, inappropriate argument type");
632 }
633 void rebind(C& newObj) {obj=&newObj;}
634 static const bool is_const=false;
635};
636
637template <class C, class D, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
638class bound_method<const C, void (D::*)(A1,A2,A3,A4,A5,A6,A7) noexcept>
639{
640 typedef void (D::*M)(A1,A2,A3,A4,A5,A6,A7);
641 const C* obj;
642 M method;
643 public:
644 static const int arity=7;
645 typedef void Ret;
646 template <int i> struct Arg: public functional::Arg<M,i> {};
647 bound_method(const C& obj, M method): obj(&obj), method(method) {}
648 typename enable_if<Not<classdesc::is_const<C> > >::T
649 operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {
650 throw std::runtime_error("cannot call method, inappropriate argument type");
651 }
652 void rebind(C& newObj) {obj=&newObj;}
653 static const bool is_const=false;
654};
655
656template <class C, class D, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
657class bound_method<C, R (D::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept>
658{
659 typedef R (D::*M)(A1,A2,A3,A4,A5,A6,A7) const;
660 C& obj;
661 M method;
662 public:
663 static const int arity=7;
664 typedef R Ret;
665 template <int i> struct Arg: public functional::Arg<M,i> {};
666 bound_method(C& obj, M method): obj(obj), method(method) {}
667 R operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {return (obj.*method)(a1,a2,a3,a4,a5,a6,a7);}
668 static const bool is_const=true;
669};
670
671template <class C, class D, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
672class bound_method<C, void (D::*)(A1,A2,A3,A4,A5,A6,A7) const noexcept>
673{
674 typedef void (D::*M)(A1,A2,A3,A4,A5,A6,A7) const;
675 C& obj;
676 M method;
677 public:
678 static const int arity=7;
679 typedef void Ret;
680 template <int i> struct Arg: public functional::Arg<M,i> {};
681 bound_method(C& obj, M method): obj(obj), method(method) {}
682 void operator()(A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7) const {(obj.*method)(a1,a2,a3,a4,a5,a6,a7);}
683 static const bool is_const=true;
684};
685#endif
686
687template <class F, class Args>
688typename enable_if<And<AllArgs<F, is_rvalue>, Eq<Arity<F>::value, 7> >,
689 typename Return<F>::T>::T
690apply_nonvoid_fn(F f, Args& a, Fdummy<F> dum=0)
691{
692 return f(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
693}
694
695/*
696 TODO: if any of the arguments to f are lvalues, we need to construct temporaries,
697 which require C++-11 ability to test for the existence of a copy constructor.
698 If the return type is not copy constructable, the user must arrange for the return value to be discarded
699*/
700
701template <class F, class Args>
702typename enable_if<And<AllArgs<F, is_rvalue>, Eq<Arity<F>::value, 7> >,
703 void>::T
704apply_void_fn(F f, Args& a, Fdummy<F> dum=0)
705{
706 f(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
707}
708
709template <class Buffer, class F>
710typename enable_if<Eq<Arity<F>::value, 7>, typename Return<F>::T>::T
711callOnBuffer(Buffer& buffer, F f)
712{
713 typename remove_const<typename remove_reference<typename Arg<F,1>::T>::type>::type a1;
714 buffer>>a1;
715 typename remove_const<typename remove_reference<typename Arg<F,2>::T>::type>::type a2;
716 buffer>>a2;
717 typename remove_const<typename remove_reference<typename Arg<F,3>::T>::type>::type a3;
718 buffer>>a3;
719 typename remove_const<typename remove_reference<typename Arg<F,4>::T>::type>::type a4;
720 buffer>>a4;
721 typename remove_const<typename remove_reference<typename Arg<F,5>::T>::type>::type a5;
722 buffer>>a5;
723 typename remove_const<typename remove_reference<typename Arg<F,6>::T>::type>::type a6;
724 buffer>>a6;
725 typename remove_const<typename remove_reference<typename Arg<F,7>::T>::type>::type a7;
726 buffer>>a7;
727 return f(
728a1
729,
730a2
731,
732a3
733,
734a4
735,
736a5
737,
738a6
739,
740a7
741 );
742}
743#endif