//3 args to Callback template struct CallbackMethodActionArg3Pte : public CallbackAction { Ptr object; M method; T1 arg1; T2 arg2; T3 arg3; void Execute() { if(object) (object->*method)(arg1, arg2, arg3); } CallbackMethodActionArg3Pte(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; /* wrong type R? template Callback pteback3(O *object, R (M::*method)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback(new CallbackMethodActionArg3Pte (object, method, arg1, arg2, arg3)); } */ template Callback pteback3(O *object, void (M::*method)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback(new CallbackMethodActionArg3Pte (object, method, arg1, arg2, arg3)); } template struct CallbackMethodActionArg3 : public CallbackAction { O *object; M method; T1 arg1; T2 arg2; T3 arg3; void Execute() { (object->*method)(arg1, arg2, arg3); } CallbackMethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; /* wrong type R? template Callback callback3(O *object, R (M::*method)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback( new CallbackMethodActionArg3(object, method, arg1, arg2, arg3)); } template Callback callback3(const O *object, R (M::*method)(Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Callback(new CallbackMethodActionArg3 (object, method, arg1, arg2, arg3)); } */ template Callback callback3(O *object, void (M::*method)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback( new CallbackMethodActionArg3(object, method, arg1, arg2, arg3)); } template Callback callback3(const O *object, void (M::*method)(Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Callback(new CallbackMethodActionArg3 (object, method, arg1, arg2, arg3)); } template struct CallbackActionCallArg3 : public CallbackAction { X x; T1 arg1; T2 arg2; T3 arg3; void Execute() { x(arg1, arg2, arg3); } CallbackActionCallArg3(X x, T1 arg1, T2 arg2, T3 arg3) : x(x), arg1(arg1), arg2(arg2), arg3(arg3) {} }; /* wrong type R? template Callback callback3(R (*fn)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback( new CallbackActionCallArg3(fn, arg1, arg2, arg3)); } */ template Callback callback3(void (*fn)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback( new CallbackActionCallArg3(fn, arg1, arg2, arg3)); } template Callback callback3(Callback3 cb, T1 arg1, T2 arg2, T3 arg3) { return Callback( new CallbackActionCallArg3, T1, T2, T3>(cb, arg1, arg2, arg3)); } //3 args to Callback1 template struct Callback1MethodActionArg3 : public Callback1Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; void Execute(P1 p1) { (object->*method)(p1, arg1, arg2, arg3); } Callback1MethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; template Callback1 callback3(O *object, void (M::*method)(P1, Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback1(new Callback1MethodActionArg3 (object, method, arg1, arg2, arg3)); } template Callback1 callback3(const O *object, void (M::*method)(P1, Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Callback1(new Callback1MethodActionArg3 (object, method, arg1, arg2, arg3)); } //3 args to Callback2 template struct Callback2MethodActionArg3 : public Callback2Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2, arg1, arg2, arg3); } Callback2MethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; template Callback2 callback3(O *object, void (M::*method)(P1, P2, Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback2(new Callback2MethodActionArg3 (object, method, arg1, arg2, arg3)); } template Callback2 callback3(const O *object, void (M::*method)(P1, P2, Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Callback2(new Callback2MethodActionArg3 (object, method, arg1, arg2, arg3)); } //3 args to Callback3 template struct Callback3MethodActionArg3 : public Callback3Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3, arg1, arg2, arg3); } Callback3MethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; template Callback3 callback3(O *object, void (M::*method)(P1, P2, P3, Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback3(new Callback3MethodActionArg3 (object, method, arg1, arg2, arg3)); } template Callback3 callback3(const O *object, void (M::*method)(P1, P2, P3, Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Callback3(new Callback3MethodActionArg3 (object, method, arg1, arg2, arg3)); } //3 args to Callback4 template struct Callback4MethodActionArg3 : public Callback4Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (object->*method)(p1, p2, p3, p4, arg1, arg2, arg3); } Callback4MethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; template Callback4 callback3(O *object, void (M::*method)(P1, P2, P3, P4, Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Callback4(new Callback4MethodActionArg3 (object, method, arg1, arg2, arg3)); } template Callback4 callback3(const O *object, void (M::*method)(P1, P2, P3, P4, Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Callback4(new Callback4MethodActionArg3 (object, method, arg1, arg2, arg3)); } // -------------------------------------------------------- //3 args to Gate template struct GateMethodActionArg3Pte : public GateAction { Ptr object; M method; T1 arg1; T2 arg2; T3 arg3; bool Execute() { return object ? (object->*method)(arg1, arg2, arg3): false; } GateMethodActionArg3Pte(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; /* ambigiuous with Callback versions template Gate pteback3(O *object, R (M::*method)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate(new GateMethodActionArg3Pte (object, method, arg1, arg2, arg3)); } */ template Gate pteback3(O *object, bool (M::*method)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate(new GateMethodActionArg3Pte (object, method, arg1, arg2, arg3)); } template struct GateMethodActionArg3 : public GateAction { O *object; M method; T1 arg1; T2 arg2; T3 arg3; bool Execute() { return object ? (object->*method)(arg1, arg2, arg3) : false; } GateMethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; /* ambigiuous with Callback versions template Gate callback3(O *object, R (M::*method)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate( new GateMethodActionArg3(object, method, arg1, arg2, arg3)); } template Gate callback3(const O *object, R (M::*method)(Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Gate(new GateMethodActionArg3 (object, method, arg1, arg2, arg3)); } */ template Gate callback3(O *object, bool (M::*method)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate( new GateMethodActionArg3(object, method, arg1, arg2, arg3)); } template Gate callback3(const O *object, bool (M::*method)(Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Gate(new GateMethodActionArg3 (object, method, arg1, arg2, arg3)); } template struct GateActionCallArg3 : public GateAction { X x; T1 arg1; T2 arg2; T3 arg3; bool Execute() { return x(arg1, arg2, arg3); } GateActionCallArg3(X x, T1 arg1, T2 arg2, T3 arg3) : x(x), arg1(arg1), arg2(arg2), arg3(arg3) {} }; /* ambigiuous with Callback versions template Gate callback3(R (*fn)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate( new GateActionCallArg3(fn, arg1, arg2, arg3)); } */ template Gate callback3(bool (*fn)(Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate( new GateActionCallArg3(fn, arg1, arg2, arg3)); } template Gate callback3(Gate3 cb, T1 arg1, T2 arg2, T3 arg3) { return Gate( new GateActionCallArg3, T1, T2, T3>(cb, arg1, arg2, arg3)); } //3 args to Gate1 template struct Gate1MethodActionArg3 : public Gate1Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; bool Execute(P1 p1) { return object ? (object->*method)(p1, arg1, arg2, arg3) : false; } Gate1MethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; template Gate1 callback3(O *object, bool (M::*method)(P1, Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate1(new Gate1MethodActionArg3 (object, method, arg1, arg2, arg3)); } template Gate1 callback3(const O *object, bool (M::*method)(P1, Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Gate1(new Gate1MethodActionArg3 (object, method, arg1, arg2, arg3)); } //3 args to Gate2 template struct Gate2MethodActionArg3 : public Gate2Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; bool Execute(P1 p1, P2 p2) { return object ? (object->*method)(p1, p2, arg1, arg2, arg3) : false; } Gate2MethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; template Gate2 callback3(O *object, bool (M::*method)(P1, P2, Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate2(new Gate2MethodActionArg3 (object, method, arg1, arg2, arg3)); } template Gate2 callback3(const O *object, bool (M::*method)(P1, P2, Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Gate2(new Gate2MethodActionArg3 (object, method, arg1, arg2, arg3)); } //3 args to Gate3 template struct Gate3MethodActionArg3 : public Gate3Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; bool Execute(P1 p1, P2 p2, P3 p3) { return object ? (object->*method)(p1, p2, p3, arg1, arg2, arg3) : false; } Gate3MethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; template Gate3 callback3(O *object, bool (M::*method)(P1, P2, P3, Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate3(new Gate3MethodActionArg3 (object, method, arg1, arg2, arg3)); } template Gate3 callback3(const O *object, bool (M::*method)(P1, P2, P3, Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Gate3(new Gate3MethodActionArg3 (object, method, arg1, arg2, arg3)); } //3 args to Gate4 template struct Gate4MethodActionArg3 : public Gate4Action { O *object; M method; T1 arg1; T2 arg2; T3 arg3; bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return object ? (object->*method)(p1, p2, p3, p4, arg1, arg2, arg3) : false; } Gate4MethodActionArg3(O *object, M method, T1 arg1, T2 arg2, T3 arg3) : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} }; template Gate4 callback3(O *object, bool (M::*method)(P1, P2, P3, P4, Q1, Q2, Q3), T1 arg1, T2 arg2, T3 arg3) { return Gate4(new Gate4MethodActionArg3 (object, method, arg1, arg2, arg3)); } template Gate4 callback3(const O *object, bool (M::*method)(P1, P2, P3, P4, Q1, Q2, Q3) const, T1 arg1, T2 arg2, T3 arg3) { return Gate4(new Gate4MethodActionArg3 (object, method, arg1, arg2, arg3)); }