1 #if !defined( INCLUDED_FUNCTIONAL_H )
2 #define INCLUDED_FUNCTIONAL_H
10 template<class R, class... Ts>
12 using result_type = R;
15 using get = typename std::tuple_element<N, std::tuple<Ts...>>::type;
19 template<class Caller>
20 using get_result_type = typename detail::Fn<typename Caller::func>::result_type;
22 template<class Caller, int N>
23 using get_argument = typename detail::Fn<typename Caller::func>::template get<N>;
25 template<class Object, class F>
28 template<class Object, class R, class... Ts>
29 class MemberN<Object, R(Ts...)> {
31 template<R(Object::*f)(Ts...)>
34 using func = R(Object &, Ts...);
36 static R call(Object &object, Ts... args) {
37 return (object.*f)(args...);
42 template<class Object, class F>
45 template<class Object, class R, class... Ts>
46 class ConstMemberN<Object, R(Ts...)> {
48 template<R(Object::*f)(Ts...) const>
51 using func = R(const Object &, Ts...);
53 static R call(const Object &object, Ts... args) {
54 return (object.*f)(args...);
62 template<class R, class... Ts>
63 class FunctionN<R(Ts...)> {
65 template<R(*f)(Ts...)>
68 using func = R(Ts...);
70 static R call(Ts... args) {
76 template<class Caller, class F>
77 class CallerShiftFirst;
79 template<class Caller, class R, class FirstArgument, class... Ts>
80 class CallerShiftFirst<Caller, R(FirstArgument, Ts...)> {
82 using func = R(FirstArgument, Ts...);
84 static R call(FirstArgument, Ts... args) {
85 return Caller::call(args...);
89 template<class Functor, class F>
97 template<int N, int... S>
98 struct gens : gens<N - 1, N - 1, S...> {
102 struct gens<0, S...> {
103 using type = seq<S...>;
107 using seq_new = typename gens<N>::type;
110 template<class Functor, class R, class... Ts>
111 class FunctorNInvoke<Functor, R(Ts...)> {
112 std::tuple<Ts...> args;
118 struct caller<detail::seq<I...>> {
119 static inline R call(FunctorNInvoke<Functor, R(Ts...)> *self, Functor functor) {
121 return functor(std::get<I>(self->args)...);
126 FunctorNInvoke(Ts... args) : args(args...) {
129 inline R operator()(Functor functor) {
130 return caller<detail::seq_new<sizeof...(Ts)>>::call(this, functor);
134 template<class Functor>
135 using FunctorInvoke = FunctorNInvoke<Functor, typename Functor::func>;
137 template<class Object, class R, R(Object::*member)()>
138 using Member = typename MemberN<Object, R()>::template instance<member>;
140 template<class Object, class R, R(Object::*member)() const>
141 using ConstMember = typename ConstMemberN<Object, R()>::template instance<member>;
143 template<class Object, class A1, class R, R(Object::*member)(A1)>
144 using Member1 = typename MemberN<Object, R(A1)>::template instance<member>;
146 template<class Object, class A1, class R, R(Object::*member)(A1) const>
147 using ConstMember1 = typename ConstMemberN<Object, R(A1)>::template instance<member>;
149 template<class Object, class A1, class A2, class R, R(Object::*member)(A1, A2)>
150 using Member2 = typename MemberN<Object, R(A1, A2)>::template instance<member>;
152 template<class Object, class A1, class A2, class R, R(Object::*member)(A1, A2) const>
153 using ConstMember2 = typename ConstMemberN<Object, R(A1, A2)>::template instance<member>;
155 template<class Object, class A1, class A2, class A3, class R, R(Object::*member)(A1, A2, A3)>
156 using Member3 = typename MemberN<Object, R(A1, A2, A3)>::template instance<member>;
158 template<class Object, class A1, class A2, class A3, class R, R(Object::*member)(A1, A2, A3) const>
159 using ConstMember3 = typename ConstMemberN<Object, R(A1, A2, A3)>::template instance<member>;
161 template<class R, R(*func)()>
162 using Function0 = typename FunctionN<R()>::template instance<func>;
164 template<class A1, class R, R(*func)(A1)>
165 using Function1 = typename FunctionN<R(A1)>::template instance<func>;
167 template<class A1, class A2, class R, R(*func)(A1, A2)>
168 using Function2 = typename FunctionN<R(A1, A2)>::template instance<func>;
170 template<class A1, class A2, class A3, class R, R(*func)(A1, A2, A3)>
171 using Function3 = typename FunctionN<R(A1, A2, A3)>::template instance<func>;
173 template<class A1, class A2, class A3, class A4, class R, R(*func)(A1, A2, A3, A4)>
174 using Function4 = typename FunctionN<R(A1, A2, A3, A4)>::template instance<func>;
176 template<class Caller, class FirstArgument = void *>
177 using Caller0To1 = CallerShiftFirst<Caller, get_result_type<Caller>(
181 template<class Caller, class FirstArgument = void *>
182 using Caller1To2 = CallerShiftFirst<Caller, get_result_type<Caller>(
184 get_argument<Caller, 0>
187 template<class Caller, class FirstArgument = void *>
188 using Caller2To3 = CallerShiftFirst<Caller, get_result_type<Caller>(
190 get_argument<Caller, 0>,
191 get_argument<Caller, 1>
194 template<class Caller, class FirstArgument = void *>
195 using Caller3To4 = CallerShiftFirst<Caller, get_result_type<Caller>(
197 get_argument<Caller, 0>,
198 get_argument<Caller, 1>,
199 get_argument<Caller, 2>