1#ifndef CLASSDESC_FUNCTIONDB2
2#define CLASSDESC_FUNCTIONDB2
3template <
class R,
class A1,
class A2>
4struct Arg<R (*)(A1,A2), 1>
10template <
class C,
class R,
class A1,
class A2>
11struct Arg<R (C::*)(A1,A2), 1>
17template <
class C,
class R,
class A1,
class A2>
18struct Arg<R (C::*)(A1,A2) const, 1>
24#if defined(__cplusplus) && __cplusplus>=201703L
26template <
class R,
class A1,
class A2>
27struct Arg<R (*)(A1,A2)
noexcept, 1>
33template <
class C,
class R,
class A1,
class A2>
34struct Arg<R (C::*)(A1,A2) noexcept, 1>
40template <
class C,
class R,
class A1,
class A2>
41struct Arg<R (C::*)(A1,A2) const noexcept, 1>
47template <
class R,
class A1,
class A2>
48struct Arg<R (*)(A1,A2), 2>
54template <
class C,
class R,
class A1,
class A2>
55struct Arg<R (C::*)(A1,A2), 2>
61template <
class C,
class R,
class A1,
class A2>
62struct Arg<R (C::*)(A1,A2) const, 2>
68#if defined(__cplusplus) && __cplusplus>=201703L
70template <
class R,
class A1,
class A2>
71struct Arg<R (*)(A1,A2)
noexcept, 2>
77template <
class C,
class R,
class A1,
class A2>
78struct Arg<R (C::*)(A1,A2) noexcept, 2>
84template <
class C,
class R,
class A1,
class A2>
85struct Arg<R (C::*)(A1,A2) const noexcept, 2>
91template <
class F,
template<
class>
class P>
94 static const bool value=
true && P<typename Arg<F,1>::T>::value && P<typename Arg<F,2>::T>::value;
98template <
class R,
class A1,
class A2>
99struct Arity<R (*)(A1,A2)>
101 static const int V=2;
102 static const int value=2;
105template <
class R,
class A1,
class A2>
106struct Return<R (*)(A1,A2)>
112template <
class C,
class R,
class A1,
class A2>
113struct Arity<R (* C::*)(A1,A2)>
115 static const int V=2;
116 static const int value=2;
119template <
class C,
class R,
class A1,
class A2>
120struct Return<R (* C::*)(A1,A2)>
126template <
class C,
class R,
class A1,
class A2>
127struct Arity<R (C::*)(A1,A2)>
129 static const int V=2;
130 static const int value=2;
133template <
class C,
class R,
class A1,
class A2>
134struct Return<R (C::*)(A1,A2)>
140template <
class C,
class R,
class A1,
class A2>
141struct Arity<R (C::*)(A1,A2) const>
143 static const int V=2;
144 static const int value=2;
147template <
class C,
class R,
class A1,
class A2>
148struct Return<R (C::*)(A1,A2) const>
154template <
class C,
class R,
class A1,
class A2>
155struct ClassOf<R (C::*)(A1,A2)>
161template <
class C,
class R,
class A1,
class A2>
162struct ClassOf<R (*C::*)(A1,A2)>
168template <
class C,
class R,
class A1,
class A2>
169struct ClassOf<R (C::*)(A1,A2) const>
175template <
class C,
class R,
class A1,
class A2>
176struct is_member_function_ptr<R (C::*)(A1,A2)>
178 static const bool value=
true;
181template <
class C,
class R,
class A1,
class A2>
182struct is_member_function_ptr<R (C::*)(A1,A2) const>
184 static const bool value=
true;
187template <
class C,
class R,
class A1,
class A2>
188struct is_const_method<R (C::*)(A1,A2) const>
190 static const bool value=
true;
193template <
class R,
class A1,
class A2>
194struct is_nonmember_function_ptr<R (*)(A1,A2)>
196 static const bool value=
true;
199template <
class C,
class R,
class A1,
class A2>
200struct is_nonmember_function_ptr<R (*C::*)(A1,A2)>
202 static const bool value=
true;
205template <
class C,
class D,
class R,
class A1,
class A2>
206class bound_method<C, R (D::*)(A1,A2)>
208 typedef R (D::*M)(A1,A2);
212 static const int arity=2;
214 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
215 bound_method(C& obj, M method): obj(&obj), method(method) {}
216 typename enable_if<Not<classdesc::is_const<C> >, R>::T
217 operator()(A1 a1,A2 a2)
const {
return (obj->*method)(a1,a2);}
218 void rebind(C& newObj) {obj=&newObj;}
219 static const bool is_const=
false;
222template <
class C,
class D,
class R,
class A1,
class A2>
223class bound_method<const C, R (D::*)(A1,A2)>
225 typedef R (D::*M)(A1,A2);
229 static const int arity=2;
231 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
232 bound_method(
const C& obj, M method): obj(&obj), method(method) {}
233 R operator()(A1 a1,A2 a2)
const {
234 throw std::runtime_error(
"cannot call method, inappropriate argument type");
236 void rebind(C& newObj) {obj=&newObj;}
237 static const bool is_const=
false;
240template <
class C,
class D,
class R,
class A1,
class A2>
241class bound_method<C, R (D::*)(A1,A2) const>
243 typedef R (D::*M)(A1,A2)
const;
247 static const int arity=2;
249 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
250 bound_method(C& obj, M method): obj(obj), method(method) {}
251 R operator()(A1 a1,A2 a2)
const {
return (obj.*method)(a1,a2);}
252 static const bool is_const=
true;
255#if defined(__cplusplus) && __cplusplus>=201703L
258template <
class R,
class A1,
class A2>
259struct Arity<R (*)(A1,A2)
noexcept>
261 static const int V=2;
262 static const int value=2;
265template <
class R,
class A1,
class A2>
266struct Return<R (*)(A1,A2)
noexcept>
272template <
class C,
class R,
class A1,
class A2>
273struct Arity<R (* C::*)(A1,A2)
noexcept>
275 static const int V=2;
276 static const int value=2;
279template <
class C,
class R,
class A1,
class A2>
280struct Return<R (* C::*)(A1,A2)
noexcept>
286template <
class C,
class R,
class A1,
class A2>
287struct Arity<R (C::*)(A1,A2) noexcept>
289 static const int V=2;
290 static const int value=2;
293template <
class C,
class R,
class A1,
class A2>
294struct Return<R (C::*)(A1,A2) noexcept>
300template <
class C,
class R,
class A1,
class A2>
301struct Arity<R (C::*)(A1,A2) const noexcept>
303 static const int V=2;
304 static const int value=2;
307template <
class C,
class R,
class A1,
class A2>
308struct Return<R (C::*)(A1,A2) const noexcept>
314template <
class C,
class R,
class A1,
class A2>
315struct ClassOf<R (C::*)(A1,A2) noexcept>
321template <
class C,
class R,
class A1,
class A2>
322struct ClassOf<R (*C::*)(A1,A2)
noexcept>
328template <
class C,
class R,
class A1,
class A2>
329struct ClassOf<R (C::*)(A1,A2) const noexcept>
335template <
class C,
class R,
class A1,
class A2>
336struct is_member_function_ptr<R (C::*)(A1,A2) noexcept>
338 static const bool value=
true;
341template <
class C,
class R,
class A1,
class A2>
342struct is_member_function_ptr<R (C::*)(A1,A2) const noexcept>
344 static const bool value=
true;
347template <
class C,
class R,
class A1,
class A2>
348struct is_const_method<R (C::*)(A1,A2) const noexcept>
350 static const bool value=
true;
353template <
class R,
class A1,
class A2>
354struct is_nonmember_function_ptr<R (*)(A1,A2)
noexcept>
356 static const bool value=
true;
359template <
class C,
class R,
class A1,
class A2>
360struct is_nonmember_function_ptr<R (*C::*)(A1,A2)
noexcept>
362 static const bool value=
true;
365template <
class C,
class D,
class R,
class A1,
class A2>
366class bound_method<C, R (D::*)(A1,A2) noexcept>
368 typedef R (D::*M)(A1,A2);
372 static const int arity=2;
374 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
375 bound_method(C& obj, M method): obj(&obj), method(method) {}
376 typename enable_if<Not<classdesc::is_const<C> >, R>::T
377 operator()(A1 a1,A2 a2)
const {
return (obj->*method)(a1,a2);}
378 void rebind(C& newObj) {obj=&newObj;}
379 static const bool is_const=
false;
382template <
class C,
class D,
class A1,
class A2>
383class bound_method<C, void (D::*)(A1,A2) noexcept>
385 typedef void (D::*M)(A1,A2);
389 static const int arity=2;
391 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
392 bound_method(C& obj, M method): obj(&obj), method(method) {}
393 typename enable_if<Not<classdesc::is_const<C> > >::T
394 operator()(A1 a1,A2 a2)
const {(obj->*method)(a1,a2);}
395 void rebind(C& newObj) {obj=&newObj;}
396 static const bool is_const=
false;
399template <
class C,
class D,
class R,
class A1,
class A2>
400class bound_method<const C, R (D::*)(A1,A2) noexcept>
402 typedef R (D::*M)(A1,A2);
406 static const int arity=2;
408 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
409 bound_method(
const C& obj, M method): obj(&obj), method(method) {}
410 R operator()(A1 a1,A2 a2)
const {
411 throw std::runtime_error(
"cannot call method, inappropriate argument type");
413 void rebind(C& newObj) {obj=&newObj;}
414 static const bool is_const=
false;
417template <
class C,
class D,
class A1,
class A2>
418class bound_method<const C, void (D::*)(A1,A2) noexcept>
420 typedef void (D::*M)(A1,A2);
424 static const int arity=2;
426 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
427 bound_method(
const C& obj, M method): obj(&obj), method(method) {}
428 typename enable_if<Not<classdesc::is_const<C> > >::T
429 operator()(A1 a1,A2 a2)
const {
430 throw std::runtime_error(
"cannot call method, inappropriate argument type");
432 void rebind(C& newObj) {obj=&newObj;}
433 static const bool is_const=
false;
436template <
class C,
class D,
class R,
class A1,
class A2>
437class bound_method<C, R (D::*)(A1,A2) const noexcept>
439 typedef R (D::*M)(A1,A2)
const;
443 static const int arity=2;
445 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
446 bound_method(C& obj, M method): obj(obj), method(method) {}
447 R operator()(A1 a1,A2 a2)
const {
return (obj.*method)(a1,a2);}
448 static const bool is_const=
true;
451template <
class C,
class D,
class A1,
class A2>
452class bound_method<C, void (D::*)(A1,A2) const noexcept>
454 typedef void (D::*M)(A1,A2)
const;
458 static const int arity=2;
460 template <
int i>
struct Arg:
public functional::Arg<M,i> {};
461 bound_method(C& obj, M method): obj(obj), method(method) {}
462 void operator()(A1 a1,A2 a2)
const {(obj.*method)(a1,a2);}
463 static const bool is_const=
true;
467template <
class F,
class Args>
468typename enable_if<And<AllArgs<F, is_rvalue>, Eq<Arity<F>::value, 2> >,
469 typename Return<F>::T>::T
470apply_nonvoid_fn(F f, Args& a, Fdummy<F> dum=0)
481template <
class F,
class Args>
482typename enable_if<And<AllArgs<F, is_rvalue>, Eq<Arity<F>::value, 2> >,
484apply_void_fn(F f, Args& a, Fdummy<F> dum=0)
489template <
class Buffer,
class F>
490typename enable_if<Eq<Arity<F>::value, 2>,
typename Return<F>::T>::T
491callOnBuffer(Buffer& buffer, F f)
493 typename remove_const<typename remove_reference<typename Arg<F,1>::T>::type>::type a1;
495 typename remove_const<typename remove_reference<typename Arg<F,2>::T>::type>::type a2;
Definition functiondb2.h:249
Definition functiondb2.h:214
Definition functiondb2.h:231