#if !defined(INCLUDED_FUNCTIONAL_H) #define INCLUDED_FUNCTIONAL_H template class Member { public: typedef Object& first_argument_type; typedef R result_type; static result_type call(first_argument_type object) { return (object.*member)(); } }; template class ConstMember { public: typedef const Object& first_argument_type; typedef R result_type; static result_type call(first_argument_type object) { return (object.*member)(); } }; template class Member1 { public: typedef Object& first_argument_type; typedef A1 second_argument_type; typedef R result_type; static result_type call(first_argument_type object, second_argument_type a1) { return (object.*member)(a1); } }; template class ConstMember1 { public: typedef const Object& first_argument_type; typedef A1 second_argument_type; typedef R result_type; static result_type call(first_argument_type object, second_argument_type a1) { return (object.*member)(a1); } }; template class Member2 { public: typedef Object& first_argument_type; typedef A2 second_argument_type; typedef A3 third_argument_type; typedef R result_type; static result_type call(first_argument_type object, second_argument_type a2, third_argument_type a3) { return (object.*member)(a2, a3); } }; template class ConstMember2 { public: typedef const Object& first_argument_type; typedef A2 second_argument_type; typedef A3 third_argument_type; typedef R result_type; static result_type call(first_argument_type object, second_argument_type a2, third_argument_type a3) { return (object.*member)(a2, a3); } }; template class Member3 { public: typedef Object& first_argument_type; typedef A2 second_argument_type; typedef A3 third_argument_type; typedef A4 fourth_argument_type; typedef R result_type; static result_type call(first_argument_type object, second_argument_type a2, third_argument_type a3, fourth_argument_type a4) { return (object.*member)(a2, a3, a4); } }; template class ConstMember3 { public: typedef const Object& first_argument_type; typedef A2 second_argument_type; typedef A3 third_argument_type; typedef A4 fourth_argument_type; typedef R result_type; static result_type call(first_argument_type object, second_argument_type a2, third_argument_type a3, fourth_argument_type a4) { return (object.*member)(a2, a3, a4); } }; template class Function0 { public: typedef R result_type; static result_type call() { return (func)(); } }; template class Function1 { public: typedef A1 first_argument_type; typedef R result_type; static result_type call(first_argument_type a1) { return (func)(a1); } }; template class Function2 { public: typedef A1 first_argument_type; typedef A2 second_argument_type; typedef R result_type; static result_type call(first_argument_type a1, second_argument_type a2) { return (func)(a1, a2); } }; template class Function3 { public: typedef A1 first_argument_type; typedef A2 second_argument_type; typedef A3 third_argument_type; typedef R result_type; static result_type call(first_argument_type a1, second_argument_type a2, third_argument_type a3) { return (func)(a1, a2, a3); } }; template class Function4 { public: typedef A1 first_argument_type; typedef A2 second_argument_type; typedef A3 third_argument_type; typedef A4 fourth_argument_type; typedef R result_type; static result_type call(first_argument_type a1, second_argument_type a2, third_argument_type a3, fourth_argument_type a4) { return (func)(a1, a2, a3, a4); } }; template class Caller0To1 { public: typedef FirstArgument first_argument_type; typedef typename Caller::result_type result_type; static result_type call(first_argument_type) { return Caller::call(); } }; template class Caller1To2 { public: typedef FirstArgument first_argument_type; typedef typename Caller::first_argument_type second_argument_type; typedef typename Caller::result_type result_type; static result_type call(first_argument_type, second_argument_type a2) { return Caller::call(a2); } }; template class Caller2To3 { public: typedef FirstArgument first_argument_type; typedef typename Caller::first_argument_type second_argument_type; typedef typename Caller::second_argument_type third_argument_type; typedef typename Caller::result_type result_type; static result_type call(first_argument_type, second_argument_type a2, third_argument_type a3) { return Caller::call(a2, a3); } }; template class Caller3To4 { public: typedef FirstArgument first_argument_type; typedef typename Caller::first_argument_type second_argument_type; typedef typename Caller::second_argument_type third_argument_type; typedef typename Caller::third_argument_type fourth_argument_type; typedef typename Caller::result_type result_type; static result_type call(first_argument_type, second_argument_type a2, third_argument_type a3, fourth_argument_type a4) { return Caller::call(a2, a3, a4); } }; template class FunctorInvoke { public: typedef typename Functor::result_type result_type; inline result_type operator()(Functor functor) { return functor(); } }; template class Functor1Invoke { typename Functor::first_argument_type a1; public: typedef typename Functor::first_argument_type first_argument_type; typedef typename Functor::result_type result_type; Functor1Invoke(first_argument_type a1) : a1(a1) { } inline result_type operator()(Functor functor) { return functor(a1); } }; template class Functor2Invoke { typename Functor::first_argument_type a1; typename Functor::second_argument_type a2; public: typedef typename Functor::first_argument_type first_argument_type; typedef typename Functor::second_argument_type second_argument_type; typedef typename Functor::result_type result_type; Functor2Invoke(first_argument_type a1, second_argument_type a2) : a1(a1), a2(a2) { } inline result_type operator()(Functor functor) { return functor(a1, a2); } }; template class Functor3Invoke { typename Functor::first_argument_type a1; typename Functor::second_argument_type a2; typename Functor::third_argument_type a3; public: typedef typename Functor::first_argument_type first_argument_type; typedef typename Functor::second_argument_type second_argument_type; typedef typename Functor::third_argument_type third_argument_type; typedef typename Functor::result_type result_type; Functor3Invoke(first_argument_type a1, second_argument_type a2, third_argument_type a3) : a1(a1), a2(a2), a3(a3) { } inline result_type operator()(Functor functor) { return functor(a1, a2, a3); } }; template class TypeEqual { template class Match { public: typedef False type; }; template<> class Match { public: typedef True type; }; public: typedef typename Match::type type; }; #endif