//4 args to Callback template struct CallbackMethodActionArg4Pte : public CallbackAction { Ptr object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; void Execute() { if(object) (object->*method)(arg1, arg2, arg3, arg4); } CallbackMethodActionArg4Pte(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; /* ambigiuous with Callback versions template Callback pteback4(O *object, R (M::*method)(Q1, Q2,Q3,Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback(new CallbackMethodActionArg4Pte (object, method, arg1, arg2, arg3, arg4)); } */ template Callback pteback4(O *object, void (M::*method)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback(new CallbackMethodActionArg4Pte (object, method, arg1, arg2, arg3, arg4)); } template struct CallbackMethodActionArg4 : public CallbackAction { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; void Execute() { (object->*method)(arg1, arg2, arg3, arg4); } CallbackMethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; /* ambigiuous with Callback versions template Callback callback4(O *object, R (M::*method)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback( new CallbackMethodActionArg4(object, method, arg1, arg2, arg3, arg4)); } template Callback callback4(const O *object, R (M::*method)(Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback(new CallbackMethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } */ template Callback callback4(O *object, void (M::*method)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback( new CallbackMethodActionArg4(object, method, arg1, arg2, arg3, arg4)); } template Callback callback4(const O *object, void (M::*method)(Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback(new CallbackMethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template struct CallbackActionCallArg4 : public CallbackAction { X x; T1 arg1; T2 arg2; T3 arg3; T4 arg4; void Execute() { x(arg1, arg2, arg3, arg4); } CallbackActionCallArg4(X x, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : x(x), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; /* ambigiuous with Callback versions template Callback callback4(R (*fn)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback( new CallbackActionCallArg4(fn, arg1, arg2, arg3, arg4)); } */ template Callback callback4(void (*fn)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback( new CallbackActionCallArg4(fn, arg1, arg2, arg3, arg4)); } template Callback callback4(Callback4 cb, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback( new CallbackActionCallArg4, T1, T2, T3, T4>(cb, arg1, arg2, arg3, arg4)); } //4 args to Callback1 template struct Callback1MethodActionArg4 : public Callback1Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; void Execute(P1 p1) { (object->*method)(p1, arg1, arg2, arg3, arg4); } Callback1MethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; template Callback1 callback4(O *object, void (M::*method)(P1, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback1(new Callback1MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template Callback1 callback4(const O *object, void (M::*method)(P1, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback1(new Callback1MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } //4 args to Callback2 template struct Callback2MethodActionArg4 : public Callback2Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2, arg1, arg2, arg3, arg4); } Callback2MethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; template Callback2 callback4(O *object, void (M::*method)(P1, P2, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback2(new Callback2MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template Callback2 callback4(const O *object, void (M::*method)(P1, P2, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback2(new Callback2MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } //4 args to Callback3 template struct Callback3MethodActionArg4 : public Callback3Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T3 arg4; void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3, arg1, arg2, arg3, arg4); } Callback3MethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; template Callback3 callback4(O *object, void (M::*method)(P1, P2, P3, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback3(new Callback3MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template Callback3 callback4(const O *object, void (M::*method)(P1, P2, P3, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback3(new Callback3MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } //4 args to Callback4 template struct Callback4MethodActionArg4 : public Callback4Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (object->*method)(p1, p2, p3, p4, arg1, arg2, arg3, arg4); } Callback4MethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; template Callback4 callback4(O *object, void (M::*method)(P1, P2, P3, P4, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback4(new Callback4MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template Callback4 callback4(const O *object, void (M::*method)(P1, P2, P3, P4, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback4(new Callback4MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } //---------------------------------------------------------- //4 args to Gate template struct GateMethodActionArg4Pte : public GateAction { Ptr object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; bool Execute() { return object ? (object->*method)(arg1, arg2, arg3, arg4) : false; } GateMethodActionArg4Pte(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; /* template Gate pteback4(O *object, R (M::*method)(Q1, Q2,Q3,Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate(new GateMethodActionArg4Pte (object, method, arg1, arg2, arg3, arg4)); } */ template Gate pteback4(O *object, bool (M::*method)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate(new GateMethodActionArg4Pte (object, method, arg1, arg2, arg3, arg4)); } template struct GateMethodActionArg4 : public GateAction { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; bool Execute() { return object ? (object->*method)(arg1, arg2, arg3, arg4) : false; } GateMethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; /* template Gate callback4(O *object, R (M::*method)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate( new GateMethodActionArg4(object, method, arg1, arg2, arg3, arg4)); } template Gate callback4(const O *object, R (M::*method)(Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate(new GateMethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } */ template Gate callback4(O *object, bool (M::*method)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate( new GateMethodActionArg4(object, method, arg1, arg2, arg3, arg4)); } template Gate callback4(const O *object, bool (M::*method)(Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate(new GateMethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template struct GateActionCallArg4 : public GateAction { X x; T1 arg1; T2 arg2; T3 arg3; T4 arg4; bool Execute() { return x(arg1, arg2, arg3, arg4); } GateActionCallArg4(X x, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : x(x), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; /* template Gate callback4(R (*fn)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate( new GateActionCallArg4(fn, arg1, arg2, arg3, arg4)); } */ template Gate callback4(bool (*fn)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate( new GateActionCallArg4(fn, arg1, arg2, arg3, arg4)); } template Gate callback4(Gate4 cb, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate( new GateActionCallArg4, T1, T2, T3, T4>(cb, arg1, arg2, arg3, arg4)); } //4 args to Gate1 template struct Gate1MethodActionArg4 : public Gate1Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; bool Execute(P1 p1) { return object ? (object->*method)(p1, arg1, arg2, arg3, arg4) : false; } Gate1MethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; template Gate1 callback4(O *object, bool (M::*method)(P1, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate1(new Gate1MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template Gate1 callback4(const O *object, bool (M::*method)(P1, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate1(new Gate1MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } //4 args to Gate2 template struct Gate2MethodActionArg4 : public Gate2Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; bool Execute(P1 p1, P2 p2) { return object ? (object->*method)(p1, p2, arg1, arg2, arg3, arg4) : false; } Gate2MethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; template Gate2 callback4(O *object, bool (M::*method)(P1, P2, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate2(new Gate2MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template Gate2 callback4(const O *object, bool (M::*method)(P1, P2, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate2(new Gate2MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } //4 args to Gate3 template struct Gate3MethodActionArg4 : public Gate3Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T3 arg4; bool Execute(P1 p1, P2 p2, P3 p3) { return object ? (object->*method)(p1, p2, p3, arg1, arg2, arg3, arg4) : false; } Gate3MethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; template Gate3 callback4(O *object, bool (M::*method)(P1, P2, P3, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate3(new Gate3MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template Gate3 callback4(const O *object, bool (M::*method)(P1, P2, P3, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate3(new Gate3MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } //4 args to Gate4 template struct Gate4MethodActionArg4 : public Gate4Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return object ? (object->*method)(p1, p2, p3, p4, arg1, arg2, arg3, arg4) : false; } Gate4MethodActionArg4(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} }; template Gate4 callback4(O *object, bool (M::*method)(P1, P2, P3, P4, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate4(new Gate4MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); } template Gate4 callback4(const O *object, bool (M::*method)(P1, P2, P3, P4, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate4(new Gate4MethodActionArg4 (object, method, arg1, arg2, arg3, arg4)); }