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