// 2 args to Callback template struct CallbackMethodActionArg2Pte : public CallbackAction { Ptr object; M method; T1 arg1; T2 arg2; void Execute() { if(object) (object->*method)(arg1, arg2); } CallbackMethodActionArg2Pte(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; /* wrong type R? template Callback pteback2(O *object, R (M::*method)(Q1, Q2), T1 arg1, T2 arg2) { return Callback(new CallbackMethodActionArg2Pte (object, method, arg1, arg2)); } */ template Callback pteback2(O *object, void (M::*method)(Q1, Q2), T1 arg1, T2 arg2) { return Callback(new CallbackMethodActionArg2Pte (object, method, arg1, arg2)); } template struct CallbackMethodActionArg2 : public CallbackAction { O *object; M method; T1 arg1; T2 arg2; void Execute() { (object->*method)(arg1, arg2); } CallbackMethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; /* wrong type R? template Callback callback2(O *object, R (M::*method)(Q1, Q2), T1 arg1, T2 arg2) { return Callback(new CallbackMethodActionArg2 (object, method, arg1, arg2)); } template Callback callback2(const O *object, R (M::*method)(Q1, Q2) const, T1 arg1, T2 arg2) { return Callback(new CallbackMethodActionArg2 (object, method, arg1, arg2)); } */ template Callback callback2(O *object, void (M::*method)(Q1, Q2), T1 arg1, T2 arg2) { return Callback(new CallbackMethodActionArg2 (object, method, arg1, arg2)); } template Callback callback2(const O *object, void (M::*method)(Q1, Q2) const, T1 arg1, T2 arg2) { return Callback(new CallbackMethodActionArg2 (object, method, arg1, arg2)); } template struct CallbackActionCallArg2 : public CallbackAction { X x; T1 arg1; T2 arg2; void Execute() { x(arg1, arg2); } CallbackActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* wrong type R? template Callback callback2(R (*fn)(Q1, Q2), T1 arg1, T2 arg2) { return Callback(new CallbackActionCallArg2(fn, arg1, arg2)); } */ template Callback callback2(void (*fn)(Q1, Q2), T1 arg1, T2 arg2) { return Callback(new CallbackActionCallArg2(fn, arg1, arg2)); } template Callback callback2(Callback2 cb, T1 arg1, T2 arg2) { return Callback(new CallbackActionCallArg2, T1, T2>(cb, arg1, arg2)); } //2 args to Callback1 template struct Callback1MethodActionArg2 : public Callback1Action { O *object; M method; T1 arg1; T2 arg2; void Execute(P1 p1) { (object->*method)(p1, arg1, arg2); } Callback1MethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; template Callback1 callback2(O *object, void (M::*method)(P1, Q1, Q2), T1 arg1, T2 arg2) { return Callback1(new Callback1MethodActionArg2 (object, method, arg1, arg2)); } template Callback1 callback2(const O *object, void (M::*method)(P1, Q1, Q2) const, T1 arg1, T2 arg2) { return Callback1(new Callback1MethodActionArg2 (object, method, arg1, arg2)); } template struct Callback1ActionCallArg2 : public Callback1Action { X x; T1 arg1; T2 arg2; void Execute(P1 p1) { x(p1, arg1, arg2); } Callback1ActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* wrong type R? template Callback1 callback2(R (*fn)(P1, Q1, Q2), T1 arg1, T2 arg2) { return Callback1(new Callback1ActionCallArg2(fn, arg1, arg2)); } */ template Callback1 callback2(void (*fn)(P1, Q1, Q2), T1 arg1, T2 arg2) { return Callback1(new Callback1ActionCallArg2(fn, arg1, arg2)); } template Callback1 callback2(Callback3 cb, T1 arg1, T2 arg2) { return Callback1(new Callback1ActionCallArg2, P1, T1, T2>(cb, arg1, arg2)); } //2 args to Callback2 template struct Callback2MethodActionArg2 : public Callback2Action { O *object; M method; T1 arg1; T2 arg2; void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2, arg1, arg2); } Callback2MethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; template Callback2 callback2(O *object, void (M::*method)(P1, P2, Q1, Q2), T1 arg1, T2 arg2) { return Callback2(new Callback2MethodActionArg2 (object, method, arg1, arg2)); } template Callback2 callback2(const O *object, void (M::*method)(P1, P2, Q1, Q2) const, T1 arg1, T2 arg2) { return Callback2(new Callback2MethodActionArg2 (object, method, arg1, arg2)); } template struct Callback2ActionCallArg2 : public Callback2Action { X x; T1 arg1; T2 arg2; void Execute(P1 p1, P2 p2) { x(p1, p2, arg1, arg2); } Callback2ActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* wrong type R? template Callback2 callback2(R (*fn)(P1, P2, Q1, Q2), T1 arg1, T2 arg2) { return Callback2(new Callback2ActionCallArg2(fn, arg1, arg2)); } */ template Callback2 callback2(void (*fn)(P1, P2, Q1, Q2), T1 arg1, T2 arg2) { return Callback2(new Callback2ActionCallArg2(fn, arg1, arg2)); } template Callback2 callback2(Callback4 cb, T1 arg1, T2 arg2) { return Callback2(new Callback2ActionCallArg2, P1, P2, T1, T2>(cb, arg1, arg2)); } //2 args to Callback3 template struct Callback3MethodActionArg2 : public Callback3Action { O *object; M method; T1 arg1; T2 arg2; void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3, arg1, arg2); } Callback3MethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; template Callback3 callback2(O *object, void (M::*method)(P1, P2, P3, Q1, Q2), T1 arg1, T2 arg2) { return Callback3(new Callback3MethodActionArg2 (object, method, arg1, arg2)); } template Callback3 callback2(const O *object, void (M::*method)(P1, P2, P3, Q1, Q2) const, T1 arg1, T2 arg2) { return Callback3(new Callback3MethodActionArg2 (object, method, arg1, arg2)); } template struct Callback3ActionCallArg2 : public Callback3Action { X x; T1 arg1; T2 arg2; void Execute(P1 p1, P2 p2, P3 p3) { x(p1, p2, p3, arg1, arg2); } Callback3ActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* wrong type R? template Callback3 callback2(R (*fn)(P1, P2, P3, Q1, Q2), T1 arg1, T2 arg2) { return Callback3(new Callback3ActionCallArg2(fn, arg1, arg2)); } */ template Callback3 callback2(void (*fn)(P1, P2, P3, Q1, Q2), T1 arg1, T2 arg2) { return Callback3(new Callback3ActionCallArg2(fn, arg1, arg2)); } //2 args to Callback4 template struct Callback4MethodActionArg2 : public Callback4Action { O *object; M method; T1 arg1; T2 arg2; void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (object->*method)(p1, p2, p3, p4, arg1, arg2); } Callback4MethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; template Callback4 callback2(O *object, void (M::*method)(P1, P2, P3, P4, Q1, Q2), T1 arg1, T2 arg2) { return Callback4(new Callback4MethodActionArg2 (object, method, arg1, arg2)); } template Callback4 callback2(const O *object, void (M::*method)(P1, P2, P3, P4, Q1, Q2) const, T1 arg1, T2 arg2) { return Callback4(new Callback4MethodActionArg2 (object, method, arg1, arg2)); } template struct Callback4ActionCallArg2 : public Callback4Action { X x; T1 arg1; T2 arg2; void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { x(p1, p2, p3, p4, arg1, arg2); } Callback4ActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* wrong type R? template Callback4 callback2(R (*fn)(P1, P2, P3, P4, Q1, Q2), T1 arg1, T2 arg2) { return Callback4(new Callback4ActionCallArg2(fn, arg1, arg2)); } */ template Callback4 callback2(void (*fn)(P1, P2, P3, P4, Q1, Q2), T1 arg1, T2 arg2) { return Callback4(new Callback4ActionCallArg2(fn, arg1, arg2)); } // --------------------------------------------------------- // 2 args to Gate template struct GateMethodActionArg2Pte : public GateAction { Ptr object; M method; T1 arg1; T2 arg2; bool Execute() { return object ? (object->*method)(arg1, arg2) : false; } GateMethodActionArg2Pte(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; /* ambigiuous with Callback versions template Gate pteback2(O *object, R (M::*method)(Q1, Q2), T1 arg1, T2 arg2) { return Gate(new GateMethodActionArg2Pte (object, method, arg1, arg2)); } */ template Gate pteback2(O *object, bool (M::*method)(Q1, Q2), T1 arg1, T2 arg2) { return Gate(new GateMethodActionArg2Pte (object, method, arg1, arg2)); } template struct GateMethodActionArg2 : public GateAction { O *object; M method; T1 arg1; T2 arg2; bool Execute() { return object ? (object->*method)(arg1, arg2) : false; } GateMethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; /* ambigiuous with Callback versions template Gate callback2(O *object, R (M::*method)(Q1, Q2), T1 arg1, T2 arg2) { return Gate(new GateMethodActionArg2 (object, method, arg1, arg2)); } template Gate callback2(const O *object, R (M::*method)(Q1, Q2) const, T1 arg1, T2 arg2) { return Gate(new GateMethodActionArg2 (object, method, arg1, arg2)); } */ template Gate callback2(O *object, bool (M::*method)(Q1, Q2), T1 arg1, T2 arg2) { return Gate(new GateMethodActionArg2 (object, method, arg1, arg2)); } template Gate callback2(const O *object, bool (M::*method)(Q1, Q2) const, T1 arg1, T2 arg2) { return Gate(new GateMethodActionArg2 (object, method, arg1, arg2)); } template struct GateActionCallArg2 : public GateAction { X x; T1 arg1; T2 arg2; bool Execute() { return x(arg1, arg2); } GateActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* ambigiuous with Callback versions template Gate callback2(R (*fn)(Q1, Q2), T1 arg1, T2 arg2) { return Gate(new GateActionCallArg2(fn, arg1, arg2)); } */ template Gate callback2(bool (*fn)(Q1, Q2), T1 arg1, T2 arg2) { return Gate(new GateActionCallArg2(fn, arg1, arg2)); } template Gate callback2(Gate2 cb, T1 arg1, T2 arg2) { return Gate(new GateActionCallArg2, T1, T2>(cb, arg1, arg2)); } //2 args to Gate1 template struct Gate1MethodActionArg2 : public Gate1Action { O *object; M method; T1 arg1; T2 arg2; bool Execute(P1 p1) { return object ? (object->*method)(p1, arg1, arg2) : false; } Gate1MethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; template Gate1 callback2(O *object, bool (M::*method)(P1, Q1, Q2), T1 arg1, T2 arg2) { return Gate1(new Gate1MethodActionArg2 (object, method, arg1, arg2)); } template Gate1 callback2(const O *object, bool (M::*method)(P1, Q1, Q2) const, T1 arg1, T2 arg2) { return Gate1(new Gate1MethodActionArg2 (object, method, arg1, arg2)); } template struct Gate1ActionCallArg2 : public Gate1Action { X x; T1 arg1; T2 arg2; bool Execute(P1 p1) { return x(p1, arg1, arg2); } Gate1ActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* ambigiuous with Callback versions template Gate1 callback2(R (*fn)(P1, Q1, Q2), T1 arg1, T2 arg2) { return Gate1(new Gate1ActionCallArg2(fn, arg1, arg2)); } */ template Gate1 callback2(bool (*fn)(P1, Q1, Q2), T1 arg1, T2 arg2) { return Gate1(new Gate1ActionCallArg2(fn, arg1, arg2)); } template Gate1 callback2(Gate3 cb, T1 arg1, T2 arg2) { return Gate1(new Gate1ActionCallArg2, P1, T1, T2>(cb, arg1, arg2)); } //2 args to Gate2 template struct Gate2MethodActionArg2 : public Gate2Action { O *object; M method; T1 arg1; T2 arg2; bool Execute(P1 p1, P2 p2) { return object ? (object->*method)(p1, p2, arg1, arg2) : false; } Gate2MethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; template Gate2 callback2(O *object, bool (M::*method)(P1, P2, Q1, Q2), T1 arg1, T2 arg2) { return Gate2(new Gate2MethodActionArg2 (object, method, arg1, arg2)); } template Gate2 callback2(const O *object, bool (M::*method)(P1, P2, Q1, Q2) const, T1 arg1, T2 arg2) { return Gate2(new Gate2MethodActionArg2 (object, method, arg1, arg2)); } template struct Gate2ActionCallArg2 : public Gate2Action { X x; T1 arg1; T2 arg2; bool Execute(P1 p1, P2 p2) { return x(p1, p2, arg1, arg2); } Gate2ActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* ambigiuous with Callback versions template Gate2 callback2(R (*fn)(P1, P2, Q1, Q2), T1 arg1, T2 arg2) { return Gate2(new Gate2ActionCallArg2(fn, arg1, arg2)); } */ template Gate2 callback2(bool (*fn)(P1, P2, Q1, Q2), T1 arg1, T2 arg2) { return Gate2(new Gate2ActionCallArg2(fn, arg1, arg2)); } template Gate2 callback2(Gate4 cb, T1 arg1, T2 arg2) { return Gate2(new Gate2ActionCallArg2, P1, P2, T1, T2>(cb, arg1, arg2)); } //2 args to Gate3 template struct Gate3MethodActionArg2 : public Gate3Action { O *object; M method; T1 arg1; T2 arg2; bool Execute(P1 p1, P2 p2, P3 p3) { return object ? (object->*method)(p1, p2, p3, arg1, arg2) : false; } Gate3MethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; template Gate3 callback2(O *object, bool (M::*method)(P1, P2, P3, Q1, Q2), T1 arg1, T2 arg2) { return Gate3(new Gate3MethodActionArg2 (object, method, arg1, arg2)); } template Gate3 callback2(const O *object, bool (M::*method)(P1, P2, P3, Q1, Q2) const, T1 arg1, T2 arg2) { return Gate3(new Gate3MethodActionArg2 (object, method, arg1, arg2)); } template struct Gate3ActionCallArg2 : public Gate3Action { X x; T1 arg1; T2 arg2; bool Execute(P1 p1, P2 p2, P3 p3) { return x(p1, p2, p3, arg1, arg2); } Gate3ActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* ambigiuous with Callback versions template Gate3 callback2(R (*fn)(P1, P2, P3, Q1, Q2), T1 arg1, T2 arg2) { return Gate3(new Gate3ActionCallArg2(fn, arg1, arg2)); } */ template Gate3 callback2(bool (*fn)(P1, P2, P3, Q1, Q2), T1 arg1, T2 arg2) { return Gate3(new Gate3ActionCallArg2(fn, arg1, arg2)); } //2 args to Gate4 template struct Gate4MethodActionArg2 : public Gate4Action { O *object; M method; T1 arg1; T2 arg2; bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return object ? (object->*method)(p1, p2, p3, p4, arg1, arg2) : false; } Gate4MethodActionArg2(O *object, M method, T1 arg1, T2 arg2) : object(object), method(method), arg1(arg1), arg2(arg2) {} }; template Gate4 callback2(O *object, bool (M::*method)(P1, P2, P3, P4, Q1, Q2), T1 arg1, T2 arg2) { return Gate4(new Gate4MethodActionArg2 (object, method, arg1, arg2)); } template Gate4 callback2(const O *object, bool (M::*method)(P1, P2, P3, P4, Q1, Q2) const, T1 arg1, T2 arg2) { return Gate4(new Gate4MethodActionArg2 (object, method, arg1, arg2)); } template struct Gate4ActionCallArg2 : public Gate4Action { X x; T1 arg1; T2 arg2; bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return x(p1, p2, p3, p4, arg1, arg2); } Gate4ActionCallArg2(X x, T1 arg1, T2 arg2) : x(x), arg1(arg1), arg2(arg2) {} }; /* ambigiuous with Callback versions template Gate4 callback2(R (*fn)(P1, P2, P3, P4, Q1, Q2), T1 arg1, T2 arg2) { return Gate4(new Gate4ActionCallArg2(fn, arg1, arg2)); } */ template Gate4 callback2(bool (*fn)(P1, P2, P3, P4, Q1, Q2), T1 arg1, T2 arg2) { return Gate4(new Gate4ActionCallArg2(fn, arg1, arg2)); }