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