//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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Callback pteback4(O *object, void (M::*method)(Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback(new CallbackMethodActionArg4Pte (object, method, pick(arg1), pick(arg2), pick(arg3), pick(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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Callback callback4(O *object, void (M::*method)(Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback(new CallbackMethodActionArg4 (object, method, pick(arg1), pick(arg2), pick(arg3), pick(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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(arg4)) {} }; template Callback callback4(void (*fn)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback( new CallbackActionCallArg4(fn, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Callback callback4(Callback4 cb, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback( new CallbackActionCallArg4, T1, T2, T3, T4>(cb, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } //4 args to Callback1 template struct Callback1FnActionArg4 : public Callback1Action { X fn; T1 arg1; T2 arg2; T3 arg3; T4 arg4; void Execute(P1 p1) { fn(p1, arg1, arg2, arg3, arg4); } Callback1FnActionArg4(X fn, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : fn(fn), arg1(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(arg4)) {} }; template Callback1 callback4(void (*fn)(P1, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback1(new Callback1FnActionArg4 (fn, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } 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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Callback1 callback4(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template struct Callback1MethodActionArg4Pte : public Callback1Action { Ptr object; M method; T1 arg1; T2 arg2; T3 arg3; T4 arg4; void Execute(P1 p1) { (object->*method)(p1, arg1, arg2, arg3, arg4); } Callback1MethodActionArg4Pte(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(arg4)) {} }; template Callback1 pteback4(O *object, void (M::*method)(P1, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback1(new Callback1MethodActionArg4Pte (object, method, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Callback1 pteback4(O *object, void (M::*method)(P1, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Callback1(new Callback1MethodActionArg4Pte (object, method, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } //4 args to Callback2 (obsolete - we only provide up to 5 parameters of receiving function) 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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Callback2 callback4(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } //4 args to Callback3 (obsolete - we only provide up to 5 parameters of receiving function) 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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Callback3 callback4(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } //4 args to Callback4 (obsolete - we only provide up to 5 parameters of receiving function) 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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Callback4 callback4(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, pick(arg1), pick(arg2), pick(arg3), pick(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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Gate pteback4(O *object, bool (M::*method)(Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate(new GateMethodActionArg4Pte (object, method, pick(arg1), pick(arg2), pick(arg3), pick(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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Gate callback4(O *object, bool (M::*method)(Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate(new GateMethodActionArg4 (object, method, pick(arg1), pick(arg2), pick(arg3), pick(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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(arg4)) {} }; template Gate callback4(bool (*fn)(Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate( new GateActionCallArg4(fn, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Gate callback4(Gate4 cb, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate( new GateActionCallArg4, T1, T2, T3, T4>(cb, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } //4 args to Gate1 template struct Gate1FnActionArg4 : public Gate1Action { X fn; T1 arg1; T2 arg2; T3 arg3; T4 arg4; bool Execute(P1 p1) { return fn ? fn(p1, arg1, arg2, arg3, arg4) : false; } Gate1FnActionArg4(X fn, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : fn(fn), arg1(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(arg4)) {} }; template Gate1 callback4(bool (*fn)(P1, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate1(new Gate1FnActionArg4 (fn, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } 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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Gate1 callback4(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template struct Gate1MethodActionArg4Pte : public Gate1Action { Ptr 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; } Gate1MethodActionArg4Pte(O *object, M method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) : object(object), method(method), arg1(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(arg4)) {} }; template Gate1 pteback4(O *object, bool (M::*method)(P1, Q1, Q2, Q3, Q4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate1(new Gate1MethodActionArg4Pte (object, method, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Gate1 pteback4(O *object, bool (M::*method)(P1, Q1, Q2, Q3, Q4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return Gate1(new Gate1MethodActionArg4Pte (object, method, pick(arg1), pick(arg2), pick(arg3), pick(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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Gate2 callback4(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, pick(arg1), pick(arg2), pick(arg3), pick(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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Gate3 callback4(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, pick(arg1), pick(arg2), pick(arg3), pick(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(pick(arg1)), arg2(pick(arg2)), arg3(pick(arg3)), arg4(pick(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); } template Gate4 callback4(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, pick(arg1), pick(arg2), pick(arg3), pick(arg4))); }