#ifndef method_call_h#define method_call_hnamespace rsi {struct method_call_interface { virtual void operator()() = 0; };#define ARG_TYPE(n) typename tArg ## n = method_arg_unused#define ARG_TYPES \ ARG_TYPE(1),ARG_TYPE(2),ARG_TYPE(3),ARG_TYPE(4),ARG_TYPE(5),\ ARG_TYPE(6),ARG_TYPE(7),ARG_TYPE(8),ARG_TYPE(9)struct method_arg_unused { };template<typename tArg> struct method_arg_count { enum { value = 1 }; };template<> struct method_arg_count<method_arg_unused> { enum { value = 0 }; };template<ARG_TYPES> struct method_count_args { enum { value = ( method_arg_count<tArg1>::value+ method_arg_count<tArg2>::value+ method_arg_count<tArg3>::value+ method_arg_count<tArg4>::value+ method_arg_count<tArg5>::value+ method_arg_count<tArg6>::value+ method_arg_count<tArg7>::value+ method_arg_count<tArg8>::value+ method_arg_count<tArg9>::value) }; };template<int Args> struct method_closure { };template<> struct method_closure<0> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)(); tClass* mInstance; tMethod mMethod; void operator()() { (mInstance->*mMethod)(); } implementation( tClass* instance, tMethod method, tArg1 /*a1*/, tArg2 /*a2*/, tArg3 /*a3*/, tArg4 /*a4*/, tArg5 /*a5*/, tArg6 /*a6*/, tArg7 /*a7*/, tArg8 /*a8*/, tArg9 /*a9*/) : mInstance(instance), mMethod(method) { } };};template<> struct method_closure<1> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)(tArg1 a1); tClass* mInstance; tMethod mMethod; tArg1 Arg1; void operator()() { (mInstance->*mMethod)(Arg1); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 /*a2*/, tArg3 /*a3*/, tArg4 /*a4*/, tArg5 /*a5*/, tArg6 /*a6*/, tArg7 /*a7*/, tArg8 /*a8*/, tArg9 /*a9*/) : mInstance(instance), mMethod(method) , Arg1(a1) { } };};template<> struct method_closure<2> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)(tArg1 a1, tArg2 a2); tClass* mInstance; tMethod mMethod; tArg1 Arg1; tArg2 Arg2; void operator()() { (mInstance->*mMethod)(Arg1,Arg2); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 a2, tArg3 /*a3*/, tArg4 /*a4*/, tArg5 /*a5*/, tArg6 /*a6*/, tArg7 /*a7*/, tArg8 /*a8*/, tArg9 /*a9*/) : mInstance(instance), mMethod(method) , Arg1(a1), Arg2(a2) { } };};template<> struct method_closure<3> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)(tArg1 a1, tArg2 a2, tArg3 a3); tClass* mInstance; tMethod mMethod; tArg1 Arg1; tArg2 Arg2; tArg3 Arg3; void operator()() { (mInstance->*mMethod)(Arg1,Arg2,Arg3); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 /*a4*/, tArg5 /*a5*/, tArg6 /*a6*/, tArg7 /*a7*/, tArg8 /*a8*/, tArg9 /*a9*/) : mInstance(instance), mMethod(method) , Arg1(a1), Arg2(a2), Arg3(a3) { } };};template<> struct method_closure<4> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)( tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4); tClass* mInstance; tMethod mMethod; tArg1 Arg1; tArg2 Arg2; tArg3 Arg3; tArg4 Arg4; void operator()() { (mInstance->*mMethod)(Arg1,Arg2,Arg3,Arg4); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 /*a5*/, tArg6 /*a6*/, tArg7 /*a7*/, tArg8 /*a8*/, tArg9 /*a9*/) : mInstance(instance), mMethod(method) , Arg1(a1), Arg2(a2), Arg3(a3), Arg4(a4) { } };};template<> struct method_closure<5> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)( tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5); tClass* mInstance; tMethod mMethod; tArg1 Arg1; tArg2 Arg2; tArg3 Arg3; tArg4 Arg4; tArg5 Arg5; void operator()() { (mInstance->*mMethod)(Arg1,Arg2,Arg3,Arg4, Arg5); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 /*a6*/, tArg7 /*a7*/, tArg8 /*a8*/, tArg9 /*a9*/) : mInstance(instance), mMethod(method) , Arg1(a1), Arg2(a2), Arg3(a3), Arg4(a4) , Arg5(a5) { } };};template<> struct method_closure<6> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)( tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6); tClass* mInstance; tMethod mMethod; tArg1 Arg1; tArg2 Arg2; tArg3 Arg3; tArg4 Arg4; tArg5 Arg5; tArg6 Arg6; void operator()() { (mInstance->*mMethod)(Arg1,Arg2,Arg3,Arg4, Arg5,Arg6); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 /*a7*/, tArg8 /*a8*/, tArg9 /*a9*/) : mInstance(instance), mMethod(method) , Arg1(a1), Arg2(a2), Arg3(a3), Arg4(a4) , Arg5(a5), Arg6(a6) { } };};template<> struct method_closure<7> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)( tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7); tClass* mInstance; tMethod mMethod; tArg1 Arg1; tArg2 Arg2; tArg3 Arg3; tArg4 Arg4; tArg5 Arg5; tArg6 Arg6; tArg7 Arg7; void operator()() { (mInstance->*mMethod)(Arg1,Arg2,Arg3,Arg4, Arg5,Arg6,Arg7); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7, tArg8 /*a8*/, tArg9 /*a9*/) : mInstance(instance), mMethod(method) , Arg1(a1), Arg2(a2), Arg3(a3), Arg4(a4) , Arg5(a5), Arg6(a6), Arg7(a7) { } };};template<> struct method_closure<8> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)( tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7, tArg8 a8); tClass* mInstance; tMethod mMethod; tArg1 Arg1; tArg2 Arg2; tArg3 Arg3; tArg4 Arg4; tArg5 Arg5; tArg6 Arg6; tArg7 Arg7; tArg8 Arg8; void operator()() { (mInstance->*mMethod)(Arg1,Arg2,Arg3,Arg4, Arg5,Arg6,Arg7,Arg8); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7, tArg8 a8, tArg9 /*a9*/) : mInstance(instance), mMethod(method) , Arg1(a1), Arg2(a2), Arg3(a3), Arg4(a4) , Arg5(a5), Arg6(a6), Arg7(a7), Arg8(a8) { } };};template<> struct method_closure<9> { template<typename tClass,ARG_TYPES> struct implementation { typedef void (tClass::* tMethod)( tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7, tArg8 a8, tArg9 a9); tClass* mInstance; tMethod mMethod; tArg1 Arg1; tArg2 Arg2; tArg3 Arg3; tArg4 Arg4; tArg5 Arg5; tArg6 Arg6; tArg7 Arg7; tArg8 Arg8; tArg9 Arg9; void operator()() { (mInstance->*mMethod)(Arg1,Arg2,Arg3,Arg4, Arg5,Arg6,Arg7,Arg8,Arg9); } implementation( tClass* instance, tMethod method, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7, tArg8 a8, tArg9 a9) : mInstance(instance), mMethod(method) , Arg1(a1), Arg2(a2), Arg3(a3), Arg4(a4) , Arg5(a5), Arg6(a6), Arg7(a7), Arg8(a8), Arg9(a9) { } };};template<typename tClass,ARG_TYPES> struct method_call : public method_call_interface{ typedef method_closure<method_count_args<tArg1,tArg2,tArg3,tArg4, tArg5,tArg6,tArg7,tArg8,tArg9>::value> ::template implementation<tClass,tArg1,tArg2,tArg3,tArg4, tArg5,tArg6,tArg7,tArg8,tArg9> delegate; method_call( tClass * aInstance, delegate::tMethod aMethod) : mDelegate(aInstance,aMethod, method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused(),method_arg_unused(),method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1) : mDelegate(aInstance,aMethod,a1, method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused(),method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1, tArg2 a2) : mDelegate(aInstance,aMethod,a1,a2, method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1, tArg2 a2, tArg3 a3) : mDelegate(aInstance,aMethod,a1,a2,a3, method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused(),method_arg_unused(),method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4) : mDelegate(aInstance,aMethod,a1,a2,a3,a4, method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused(),method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5) : mDelegate(aInstance,aMethod,a1,a2,a3,a4,a5 method_arg_unused(),method_arg_unused(),method_arg_unused(), method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6) : mDelegate(aInstance,aMethod,a1,a2,a3,a4,a5,a6 method_arg_unused(),method_arg_unused(),method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7) : mDelegate(aInstance,aMethod,a1,a2,a3,a4,a5,a6,a7, method_arg_unused(),method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7, tArg8 a8) : mDelegate(aInstance,aMethod,a1,a2,a3,a4,a5,a6,a7,a8, method_arg_unused()) {} method_call( tClass * aInstance, delegate::tMethod aMethod, tArg1 a1, tArg2 a2, tArg3 a3, tArg4 a4, tArg5 a5, tArg6 a6, tArg7 a7, tArg8 a8, tArg9 a9) : mDelegate(aInstance,aMethod,a1,a2,a3,a4,a5,a6,a7,a8,a9) {} virtual void operator()() { mDelegate(); } delegate mDelegate;};#undef ARG_TYPE#undef ARG_TYPES}#endif |