13#ifndef CLASSDESC_FUNCTION_H
14#define CLASSDESC_FUNCTION_H
19#if defined(__cplusplus) && __cplusplus>=201103L
25#if defined(__GNUC__) && !defined(__ICC)
26#pragma GCC diagnostic push
27#pragma GCC diagnostic ignored "-Wnoexcept-type"
43 template <
class F>
struct Arity;
50 template <
class F,
size_t>
struct Arg;
54 {
typedef F
T;
typedef F type;};
55 template <
class C,
class U>
struct ClassOf<U C::*>
56 {
typedef C T;
typedef C type;};
61 {
static const bool value=
false;};
65 {
static const bool value=
false;};
69 {
static const bool value=
false;};
74 static const bool value=is_member_function_ptr<F>::value||
75 is_nonmember_function_ptr<F>::value;
83 template <class C, class M, class R=typename Return<M>::T,
class Enable=
void>
86 template <
class O,
class M>
91 template <
class T>
struct Fdummy {Fdummy(
int) {} };
109#if defined(__cplusplus) && __cplusplus>=201103L
111 struct ArgAcceptable:
114 And<is_default_constructible<typename remove_reference<A>::type>,
115 is_copy_constructible<typename remove_reference<A>::type>>,
117 Not<std::is_rvalue_reference<A>>,
118 Or<Not<is_reference<A>>, is_const<typename remove_reference<A>::type>>
121 Or<Not<is_pointer<A>>, is_same<A,const char*>>
128#if defined(__cplusplus) && __cplusplus>=201103L && !defined(USE_UNROLLED)
129 template <
class...
Args>
struct ArityArgs;
131 template <
class A,
class...
Args>
132 struct ArityArgs<A,
Args...>
134 static const size_t value=ArityArgs<
Args...>::value+1;
140 static const size_t value=0;
143 template <
size_t N,
class A,
class...
Args>
146 typedef typename ArgOf<N-1,
Args...>
::T T;
149 template <
class A,
class...
Args>
150 struct ArgOf<1,A,
Args...>
155 template <
template<
class>
class P,
class...
Args>
struct AllArgsHelper;
156 template <
template<
class>
class P,
class A,
class...
Args>
struct AllArgsHelper<P,A,
Args...>
158 static const bool value=P<A>::value && AllArgsHelper<P,
Args...>::value;
161 template <
template<
class>
class P>
struct AllArgsHelper<P>
163 static const bool value=
true;
166 template <
class R,
class...
Args>
struct FunctionalHelper
168 static const size_t arity=ArityArgs<
Args...>::value;
170 template <
size_t N>
struct Arg
174 template <
template<
class>
class P>
struct AllArgs
176 typedef AllArgsHelper<P,
Args...>
T;
181 template <
class R>
struct FunctionalHelper<R>
183 static const size_t arity=0;
185 template <
size_t N>
struct Arg
189 template <
template<
class>
class P>
struct AllArgs
191 typedef AllArgsHelper<P>
T;
195 template <
class F>
struct FunctionalHelperFor;
197 template <
class R,
class...
Args>
struct FunctionalHelperFor<R(
Args...)>
199 typedef FunctionalHelper<R,
Args...>
T;
202 template <
class R,
class...
Args>
struct FunctionalHelperFor<R(*)(
Args...)>
204 typedef FunctionalHelper<R,
Args...>
T;
207 template <
class R,
class C,
class...
Args>
struct FunctionalHelperFor<R(C::*)(Args...)>
209 typedef FunctionalHelper<R,
Args...> T;
211 template <
class R,
class C,
class...
Args>
struct FunctionalHelperFor<R(*C::*)(
Args...)>
213 typedef FunctionalHelper<R,Args...> T;
215 template <class R, class C, class... Args>
struct FunctionalHelperFor<R(C::*)(
Args...)
const>
217 typedef FunctionalHelper<R,Args...> T;
219#
if defined(__cplusplus) && __cplusplus>=201703L
220 template <class R, class... Args>
struct FunctionalHelperFor<R(
Args...)
noexcept>
222 typedef FunctionalHelper<R,Args...> T;
224 template <class R, class... Args>
struct FunctionalHelperFor<R(*)(
Args...)
noexcept>
226 typedef FunctionalHelper<R,Args...> T;
228 template <class R, class C, class... Args>
struct FunctionalHelperFor<R(C::*)(
Args...)
noexcept>
230 typedef FunctionalHelper<R,Args...> T;
232 template <class R, class C, class... Args>
struct FunctionalHelperFor<R(C::*)(
Args...)
const noexcept>
234 typedef FunctionalHelper<R,Args...> T;
238 template <class R, class C>
struct FunctionalHelperFor<R(C::*)>
240 typedef FunctionalHelper<R> T;
243 template <
class F>
struct FunctionalHelperFor<
std::function<F>>:
244 public FunctionalHelperFor<F> {};
259 typedef typename FunctionalHelperFor<F>::T Helper;
260 static const size_t V=Helper::arity;
261 static const size_t value=Helper::arity;
264 template <
class F>
struct Return
266 typedef typename FunctionalHelperFor<F>::T Helper;
267 typedef typename Helper::Return T;
270 template <
class F,
size_t N>
struct Arg
272 typedef typename FunctionalHelperFor<F>::T Helper;
273 typedef typename Helper::template
Arg<N>::T T;
277 template <
class R,
class C,
class...
Args>
278 struct ClassOf<R (C::*)(Args...)>
284 template <
class R,
class C,
class...
Args>
291 template <class R, class C, class... Args>
298 template <class C, class R, class... Args>
301 static const bool value=true;
304 template <class C, class R, class... Args>
307 static const bool value=true;
310 template <class C, class R, class... Args>
313 static const bool value=true;
316 template <class R, class... Args>
319 static const bool value=true;
322 template <class C, class R, class... Args>
325 static const bool value=true;
329 template <class C, class M>
330 struct ConstCorrect:
public
331 Or<
Not<is_const<C>>,
334 template <class C, class M, class R>
343 bound_method(C& obj, M method): obj(&obj), method(method) {}
344 template <class... Args>
345 R
operator()(
Args... args)
const {return (obj->*method)(args...);}
346 void rebind(C& newObj) {obj=&newObj;}
347 static const bool is_const=is_const_method<M>::value;
350 template <
class C,
class M,
class R>
360 template <
class...
Args>
361 R operator()(
Args... args)
const
364 throw std::runtime_error(
"cannot call method, inappropriate argument type");
366 void rebind(C& newObj) {obj=&newObj;}
367 static const bool is_const=is_const_method<M>::value;
370 template <
class C,
class M>
373 And<ConstCorrect<C,M>,
AllArgs<M,ArgAcceptable>>,
379 bound_method(C& obj, M method): obj(&obj), method(method) {}
380 template <
class...
Args>
381 void operator()(
Args... args)
const {(obj->*method)(args...);}
382 void rebind(C& newObj) {obj=&newObj;}
383 static const bool is_const=is_const_method<M>::value;
386 template <
class C,
class F>
struct FunctionalHelperFor<
bound_method<C,F>>
388 typedef typename FunctionalHelperFor<F>::T T;
391 template <
class F,
template<
class>
class P,
int N>
394 typedef typename FunctionalHelperFor<F>::T Helper;
395 typedef typename Helper::template
AllArgs<P>::T AllArgsHelper;
396 static const bool value=AllArgsHelper::value;
399 template <class F, class ArgVector, size_t N=Arity<F>::value>
400 struct CurryLastNonVoid;
402 template <
class F,
class ArgVector,
size_t N>
403 struct CurryLastNonVoid
407 CurryLastNonVoid(F f,
ArgVector& a): f(f), a(a) {}
414 {
return CurryLastNonVoid<CurryLastNonVoid, ArgVector>(*
this, a).apply();}
417 template <
class F,
class ArgVector>
424 typename Return<F>::T apply()
const {
return f();}
427 template <
class F,
class ArgVector,
size_t N>
433 template <
class F,
class ArgVector,
size_t N>
439 template <class F, class ArgVector, size_t N=Arity<F>::value>
446 void operator()(
Args... args)
const {
451 {CurryLastVoid<CurryLastVoid, ArgVector>(*
this, a).apply();}
454 template <
class F,
class ArgVector>
460 void operator()()
const {f();}
461 void apply()
const {f();}
464 template <
class F,
class ArgVector>
470 template <
class F,
class Args>
472 apply_nonvoid_fn(F f,
Args& a)
474 return CurryLastNonVoid<F,Args>(f,a).apply();
478 template <
class F,
class Args>
482 CurryLastVoid<F,Args>(f,a).apply();
497 template <class F, class R=typename Return<F>::T,
501 template <
class F,
class R,
class A,
size_t I>
502 struct Arg<CurryFirst<F,R,A>,I>
508 template <
class F,
class R,
class A>
515 template <
class F,
class R,
class A>
516 struct Arity<CurryFirst<F,R,A> >
523 template <
class F,
class R,
class A>
529 CurryFirst(F f, A& a): f(f), a(a) {}
530 template <
class...
Args>
532 return f(std::forward<A>(a),std::forward<Args>(args)...);
536 template <
class F,
class A>
537 class CurryFirst<F,void,A>
542 CurryFirst(F f, A& a): f(f), a(a) {}
543 template <
class...
Args>
544 void operator()(
Args... args) {
545 f(std::forward<A>(a),std::forward<Args>(args)...);
549 template <
class F,
class R,
class A>
550 struct FunctionalHelperFor<CurryFirst<F,R,A>>:
551 public FunctionalHelperFor<F>
556 template <class Buffer, class F, class R=typename Return<F>::T,
560 template <
class F,
class A,
class R,
class B>
569 template <
class F,
class A,
class R,
class B>
575 const char* tmp=a.c_str();
579 template <
class F,
class A,
class R,
class B>
583 throw std::runtime_error(
"unable to unpack into "+typeName<A>());
586 template <
class Buffer,
class F,
class R,
int N>
591 typedef typename remove_const
592 <
typename remove_reference
595 CallOnBuffer(Buffer& buffer, F f): buffer(buffer), f(f) {}
597 auto ff=[&](
typename Arg<F,1>::T a)->R {
return CallOnBuffer<Buffer, CurryFirst<F>, R, N-1>
598 (buffer, CurryFirst<F>(f,a))();};
599 return eval<decltype(ff),A1,R,Buffer>(ff, buffer);
603 template <
class Buffer,
class F,
class R>
604 class CallOnBuffer<Buffer,F,R,0>
608 CallOnBuffer(Buffer& buffer, F f): f(f) {}
609 R operator()() {
return f();}
612 template <
class Buffer,
class F>
614 {
return CallOnBuffer<Buffer,F,typename Return<F>::T>(buff,f)();}
617 template <
class Buffer>
625 template <
class F,
class...
Args>
627 {packArg<F,1>(args...);}
631 {packArg<void(
Args...),1>(args...);}
632 template <
class F,
int N,
class A,
class...
Args>
633 void packArg(A a,
Args... args)
636 packArg<F,N+1>(args...);
638 template <
class F,
int N>
643 return CallOnBuffer<Buffer, F>(*
this,f)();
651 template <
class R,
class C>
struct Return<R (C::*)>
652 {
typedef R T;
typedef R type;};
654 template <
class C,
class M>
658 static const int value=V;
661 template <
class C,
class M>
668 template <
class C,
class M,
size_t i>
675#if defined(__GNUC__) && !defined(__ICC)
676#pragma GCC diagnostic push
677#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
679#include "functiondb.h"
680#if defined(__GNUC__) && !defined(__ICC)
681#pragma GCC diagnostic pop
684 template <
class Buffer>
688 PackFunctor(
const Buffer& buffer): Buffer(buffer) {}
692 typename Return<F>::T call(F f) {
return callOnBuffer(*
this, f);}
698 template <
class F,
class Args>
704 {*r=apply_nonvoid_fn(f,args);}
706 template <
class F,
class Args>
709 {apply_void_fn(f,args);}
713#pragma omit typeName functional::bound_method<C,M,R,E>
716 template <
class C,
class M,
class R,
class E>
719 static string name() {
return "classdesc::bound_method<"+typeName<C>()+
","+typeName<M>()+
">";}
724#if defined(__GNUC__) && !defined(__ICC)
725#pragma GCC diagnostic pop
Definition javaClass_base.h:249
contains code generated by functiondb.sh that defines functional attributes.
Contains definitions related to classdesc functionality.
void pack(pack_t &targ, const string &desc, is_treenode dum, const T *const &arg)
serialise a tree (or DAG)
Definition pack_graph.h:28
Definition classdesc.h:420
Definition RESTProcess_epilogue.h:159
Definition classdesc.h:405
Definition classdesc.h:423
Definition classdesc.h:299
controlled template specialisation: stolen from boost::enable_if.
Definition classdesc.h:282
Arity::V (or ::value) is the number of arguments of
Definition function.h:43
Definition function.h:686
Return::T (or ::type) is the return type of F
Definition function.h:45
is_const_method::value is true if F is a pointer to a const method
Definition function.h:65
is_member_function_ptr::value is true if F is a member function pointer
Definition function.h:61
is_nonmember_function_ptr::value is true if F is an ordinary function pointer (maybe a member)
Definition function.h:69
Definition classdesc.h:571