//0 args to Callback template struct CallbackMethodActionPte : public CallbackAction { Ptr object; M method; void Execute() { if(object) (object->*method)(); } bool IsValid() const { return object; } CallbackMethodActionPte(O *object, M method) : object(object), method(method) {} }; template Callback pteback(O *object, void (M::*method)()) { return Callback(new CallbackMethodActionPte(object, method)); } template struct CallbackMethodAction : public CallbackAction { O *object; M method; void Execute() { (object->*method)(); } CallbackMethodAction(O *object, M method) : object(object), method(method) {} }; template Callback callback(O *object, void (M::*method)()) { return Callback(new CallbackMethodAction(object, method)); } template Callback callback(const O *object, void (M::*method)() const) { return Callback(new CallbackMethodAction(object, method)); } struct CallbackFnAction : public CallbackAction { void (*fn)(); void Execute() { (*fn)(); } CallbackFnAction(void (*fn)()) : fn(fn) {} }; inline Callback callback(void (*fn)()) { return Callback(new CallbackFnAction (fn)); } struct CallbackForkAction : public CallbackAction { Callback cb1, cb2; void Execute() { cb1(); cb2(); } CallbackForkAction(Callback cb1, Callback cb2) : cb1(cb1), cb2(cb2) {} }; inline Callback Proxy(Callback& cb) { return callback(&cb, &Callback::Execute); } Callback callback(Callback cb1, Callback cb2); Callback& operator<<(Callback& a, Callback b); //0 args to Callback1 template struct Callback1MethodActionPte : public Callback1Action { Ptr object; M method; void Execute(P1 p1) { if(object) (object->*method)(p1); } bool IsValid() const { return object; } Callback1MethodActionPte(O *object, M method) : object(object), method(method) {} }; template Callback1 pteback(O *object, void (M::*method)(P1 p1)) { return Callback1(new Callback1MethodActionPte(object, method)); } template struct Callback1MethodAction : public Callback1Action { O *object; M method; void Execute(P1 p1) { (object->*method)(p1); } Callback1MethodAction(O *object, M method) : object(object), method(method) {} }; template Callback1 callback(O *object, void (M::*method)(P1 p1)) { return Callback1(new Callback1MethodAction(object, method)); } template Callback1 callback(const O *object, void (M::*method)(P1 p1) const) { return Callback1(new Callback1MethodAction(object, method)); } template struct Callback1FnAction : public Callback1Action { void (*fn)(P1 p1); void Execute(P1 p1) { (*fn)(p1); } Callback1FnAction(void (*fn)(P1 p1)) : fn(fn) {} }; template inline Callback1 callback(void (*fn)(P1 p1)) { return Callback1(new Callback1FnAction (fn)); } template struct Callback1ForkAction : public Callback1Action { Callback1 cb1, cb2; void Execute(P1 p1) { cb1(p1); cb2(p1); } Callback1ForkAction(Callback1 cb1, Callback1 cb2) : cb1(cb1), cb2(cb2) {} }; template inline Callback1 Proxy(Callback1& cb) { return callback(&cb, &Callback1::Execute); } template Callback1 callback(Callback1 cb1, Callback1 cb2) { return Callback1(new Callback1ForkAction (cb1, cb2)); } template Callback1& operator<<(Callback1& a, Callback1 b) { if(a) a = callback(a, b); else a = b; return a; } //0 args to Callback2 template struct Callback2MethodActionPte : public Callback2Action { Ptr object; M method; void Execute(P1 p1, P2 p2) { if(object) (object->*method)(p1, p2); } bool IsValid() const { return object; } Callback2MethodActionPte(O *object, M method) : object(object), method(method) {} }; template Callback2 pteback(O *object, void (M::*method)(P1 p1, P2 p2)) { return Callback2(new Callback2MethodActionPte(object, method)); } template struct Callback2MethodAction : public Callback2Action { O *object; M method; void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2); } Callback2MethodAction(O *object, M method) : object(object), method(method) {} }; template Callback2 callback(O *object, void (M::*method)(P1 p1, P2 p2)) { return Callback2(new Callback2MethodAction(object, method)); } template Callback2 callback(const O *object, void (M::*method)(P1 p1, P2 p2) const) { return Callback2(new Callback2MethodAction(object, method)); } template struct Callback2FnAction : public Callback2Action { void (*fn)(P1 p1, P2 p2); void Execute(P1 p1, P2 p2) { (*fn)(p1, p2); } Callback2FnAction(void (*fn)(P1 p1, P2 p2)) : fn(fn) {} }; template inline Callback2 callback(void (*fn)(P1 p1, P2 p2)) { return Callback2(new Callback2FnAction (fn)); } template struct Callback2ForkAction : public Callback2Action { Callback2 cb1, cb2; void Execute(P1 p1, P2 p2) { cb1(p1, p2); cb2(p1, p2); } Callback2ForkAction(Callback2 cb1, Callback2 cb2) : cb1(cb1), cb2(cb2) {} }; template inline Callback2 Proxy(Callback2& cb) { return callback(&cb, &Callback2::Execute); } template Callback2 callback(Callback2 cb1, Callback2 cb2) { return Callback2(new Callback2ForkAction (cb1, cb2)); } template Callback2& operator<<(Callback2& a, Callback2 b) { if(a) a = callback(a, b); else a = b; return a; } //0 args to Callback3 template struct Callback3MethodActionPte : public Callback3Action { Ptr object; M method; void Execute(P1 p1, P2 p2, P3 p3) { if(object) (object->*method)(p1, p2, p3); } bool IsValid() const { return object; } Callback3MethodActionPte(O *object, M method) : object(object), method(method) {} }; template Callback3 pteback(O *object, void (M::*method)(P1 p1, P2 p2, P3 p3)) { return Callback3(new Callback3MethodActionPte(object, method)); } template struct Callback3MethodAction : public Callback3Action { O *object; M method; void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3); } Callback3MethodAction(O *object, M method) : object(object), method(method) {} }; template Callback3 callback(O *object, void (M::*method)(P1 p1, P2 p2, P3 p3)) { return Callback3(new Callback3MethodAction(object, method)); } template Callback3 callback(const O *object, void (M::*method)(P1 p1, P2 p2, P3 p3) const) { return Callback3(new Callback3MethodAction(object, method)); } template struct Callback3FnAction : public Callback3Action { void (*fn)(P1 p1, P2 p2, P3 p3); void Execute(P1 p1, P2 p2, P3 p3) { (*fn)(p1, p2, p3); } Callback3FnAction(void (*fn)(P1 p1, P2 p2, P3 p3)) : fn(fn) {} }; template inline Callback3 callback(void (*fn)(P1 p1, P2 p2, P3 p3)) { return Callback3(new Callback3FnAction (fn)); } template struct Callback3ForkAction : public Callback3Action { Callback3 cb1, cb2; void Execute(P1 p1, P2 p2, P3 p3) { cb1(p1, p2, p3); cb2(p1, p2, p3); } Callback3ForkAction(Callback3 cb1, Callback3 cb2) : cb1(cb1), cb2(cb2) {} }; template inline Callback3 Proxy(Callback3& cb) { return callback(&cb, &Callback3::Execute); } template Callback3 callback(Callback3 cb1, Callback3 cb2) { return Callback3(new Callback3ForkAction (cb1, cb2)); } template Callback3& operator<<(Callback3& a, Callback3 b) { if(a) a = callback(a, b); else a = b; return a; } //0 args to Callback4 template struct Callback4MethodActionPte : public Callback4Action { Ptr object; M method; void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { if(object) (object->*method)(p1, p2, p3, p4); } bool IsValid() const { return object; } Callback4MethodActionPte(O *object, M method) : object(object), method(method) {} }; template Callback4 pteback(O *object, void (M::*method)(P1 p1, P2 p2, P3 p3, P4 p4)) { return Callback4(new Callback4MethodActionPte(object, method)); } template struct Callback4MethodAction : public Callback4Action { O *object; M method; void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (object->*method)(p1, p2, p3, p4); } Callback4MethodAction(O *object, M method) : object(object), method(method) {} }; template Callback4 callback(O *object, void (M::*method)(P1 p1, P2 p2, P3 p3, P4 p4)) { return Callback4(new Callback4MethodAction(object, method)); } template Callback4 callback(const O *object, void (M::*method)(P1 p1, P2 p2, P3 p3, P4 p4) const) { return Callback4(new Callback4MethodAction(object, method)); } template struct Callback4FnAction : public Callback4Action { void (*fn)(P1 p1, P2 p2, P3 p3, P4 p4); void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (*fn)(p1, p2, p3, p4); } Callback4FnAction(void (*fn)(P1 p1, P2 p2, P3 p3, P4 p4)) : fn(fn) {} }; template inline Callback4 callback(void (*fn)(P1 p1, P2 p2, P3 p3, P4 p4)) { return Callback4(new Callback4FnAction (fn)); } template struct Callback4ForkAction : public Callback4Action { Callback4 cb1, cb2; void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { cb1(p1, p2, p3, p4); cb2(p1, p2, p3, p4); } Callback4ForkAction(Callback4 cb1, Callback4 cb2) : cb1(cb1), cb2(cb2) {} }; template inline Callback4 Proxy(Callback4& cb) { return callback(&cb, &Callback4::Execute); } template Callback4 callback(Callback4 cb1, Callback4 cb2) { return Callback4(new Callback4ForkAction (cb1, cb2)); } template Callback4& operator<<(Callback4& a, Callback4 b) { if(a) a = callback(a, b); else a = b; return a; } // ----------------------------------------------------------- //0 args to Gate template struct GateMethodActionPte : public GateAction { Ptr object; M method; bool Execute() { return object ? (object->*method)() : false; } bool IsValid() const { return object; } GateMethodActionPte(O *object, M method) : object(object), method(method) {} }; template struct GateMethodAction : public GateAction { O *object; M method; bool Execute() { return (object->*method)(); } GateMethodAction(O *object, M method) : object(object), method(method) {} }; struct GateFnAction : public GateAction { bool (*fn)(); bool Execute() { return (*fn)(); } GateFnAction(bool (*fn)()) : fn(fn) {} }; template Gate pteback(O *object, bool (M::*method)()) { return Gate(new GateMethodActionPte(object, method)); } template Gate callback(O *object, bool (M::*method)()) { return Gate(new GateMethodAction(object, method)); } template Gate callback(const O *object, bool (M::*method)() const) { return Gate(new GateMethodAction(object, method)); } inline Gate callback(bool (*fn)()) { return Gate(new GateFnAction (fn)); } struct GateForkAction : public GateAction { Gate cb1, cb2; bool Execute() { cb1(); return cb2(); } GateForkAction(Gate cb1, Gate cb2) : cb1(cb1), cb2(cb2) {} }; inline Gate Proxy(Gate& cb) { return callback(&cb, &Gate::Execute); } Gate callback(Gate cb1, Gate cb2); Gate& operator<<(Gate& a, Gate b); //0 args to Gate1 template struct Gate1MethodActionPte : public Gate1Action { Ptr object; M method; bool Execute(P1 p1) { return object ? (object->*method)(p1) : false; } bool IsValid() const { return object; } Gate1MethodActionPte(O *object, M method) : object(object), method(method) {} }; template Gate1 pteback(O *object, bool (M::*method)(P1 p1)) { return Gate1(new Gate1MethodActionPte(object, method)); } template struct Gate1MethodAction : public Gate1Action { O *object; M method; bool Execute(P1 p1) { return (object->*method)(p1); } Gate1MethodAction(O *object, M method) : object(object), method(method) {} }; template Gate1 callback(O *object, bool (M::*method)(P1 p1)) { return Gate1(new Gate1MethodAction(object, method)); } template Gate1 callback(const O *object, bool (M::*method)(P1 p1) const) { return Gate1(new Gate1MethodAction(object, method)); } template struct Gate1FnAction : public Gate1Action { bool (*fn)(P1 p1); bool Execute(P1 p1) { return (*fn)(p1); } Gate1FnAction(bool (*fn)(P1 p1)) : fn(fn) {} }; template inline Gate1 callback(bool (*fn)(P1 p1)) { return Gate1(new Gate1FnAction (fn)); } template struct Gate1ForkAction : public Gate1Action { Gate1 cb1, cb2; bool Execute(P1 p1) { cb1(p1); return cb2(p1); } Gate1ForkAction(Gate1 cb1, Gate1 cb2) : cb1(cb1), cb2(cb2) {} }; template inline Gate1 Proxy(Gate1& cb) { return callback(&cb, &Gate1::Execute); } template Gate1 callback(Gate1 cb1, Gate1 cb2) { return Gate1(new Gate1ForkAction (cb1, cb2)); } template Gate1& operator<<(Gate1& a, Gate1 b) { if(a) a = callback(a, b); else a = b; return a; } //0 args to Gate2 template struct Gate2MethodActionPte : public Gate2Action { Ptr object; M method; bool Execute(P1 p1, P2 p2) { return object ? (object->*method)(p1, p2) : false; } bool IsValid() const { return object; } Gate2MethodActionPte(O *object, M method) : object(object), method(method) {} }; template Gate2 pteback(O *object, bool (M::*method)(P1 p1, P2 p2)) { return Gate2(new Gate2MethodActionPte(object, method)); } template struct Gate2MethodAction : public Gate2Action { O *object; M method; bool Execute(P1 p1, P2 p2) { return (object->*method)(p1, p2); } Gate2MethodAction(O *object, M method) : object(object), method(method) {} }; template Gate2 callback(O *object, bool (M::*method)(P1 p1, P2 p2)) { return Gate2(new Gate2MethodAction(object, method)); } template Gate2 callback(const O *object, bool (M::*method)(P1 p1, P2 p2) const) { return Gate2(new Gate2MethodAction(object, method)); } template struct Gate2FnAction : public Gate2Action { bool (*fn)(P1 p1, P2 p2); bool Execute(P1 p1, P2 p2) { return (*fn)(p1, p2); } Gate2FnAction(bool (*fn)(P1 p1, P2 p2)) : fn(fn) {} }; template inline Gate2 callback(bool (*fn)(P1 p1, P2 p2)) { return Gate2(new Gate2FnAction (fn)); } template struct Gate2ForkAction : public Gate2Action { Gate2 cb1, cb2; bool Execute(P1 p1, P2 p2) { cb1(p1, p2); return cb2(p1, p2); } Gate2ForkAction(Gate2 cb1, Gate2 cb2) : cb1(cb1), cb2(cb2) {} }; template inline Gate2 Proxy(Gate2& cb) { return callback(&cb, &Gate2::Execute); } template Gate2 callback(Gate2 cb1, Gate2 cb2) { return Gate2(new Gate2ForkAction (cb1, cb2)); } template Gate2& operator<<(Gate2& a, Gate2 b) { if(a) a = callback(a, b); else a = b; return a; } //0 args to Gate3 template struct Gate3MethodActionPte : public Gate3Action { Ptr object; M method; bool Execute(P1 p1, P2 p2, P3 p3) { return object ? (object->*method)(p1, p2, p3) : false; } bool IsValid() const { return object; } Gate3MethodActionPte(O *object, M method) : object(object), method(method) {} }; template Gate3 pteback(O *object, bool (M::*method)(P1 p1, P2 p2, P3 p3)) { return Gate3(new Gate3MethodActionPte(object, method)); } template struct Gate3MethodAction : public Gate3Action { O *object; M method; bool Execute(P1 p1, P2 p2, P3 p3) { return (object->*method)(p1, p2, p3); } Gate3MethodAction(O *object, M method) : object(object), method(method) {} }; template Gate3 callback(O *object, bool (M::*method)(P1 p1, P2 p2, P3 p3)) { return Gate3(new Gate3MethodAction(object, method)); } template Gate3 callback(const O *object, bool (M::*method)(P1 p1, P2 p2, P3 p3) const) { return Gate3(new Gate3MethodAction(object, method)); } template struct Gate3FnAction : public Gate3Action { bool (*fn)(P1 p1, P2 p2, P3 p3); bool Execute(P1 p1, P2 p2, P3 p3) { return (*fn)(p1, p2, p3); } Gate3FnAction(bool (*fn)(P1 p1, P2 p2, P3 p3)) : fn(fn) {} }; template inline Gate3 callback(bool (*fn)(P1 p1, P2 p2, P3 p3)) { return Gate3(new Gate3FnAction (fn)); } template struct Gate3ForkAction : public Gate3Action { Gate3 cb1, cb2; bool Execute(P1 p1, P2 p2, P3 p3) { cb1(p1, p2, p3); return cb2(p1, p2, p3); } Gate3ForkAction(Gate3 cb1, Gate3 cb2) : cb1(cb1), cb2(cb2) {} }; template inline Gate3 Proxy(Gate3& cb) { return callback(&cb, &Gate3::Execute); } template Gate3 callback(Gate3 cb1, Gate3 cb2) { return Gate3(new Gate3ForkAction (cb1, cb2)); } template Gate3& operator<<(Gate3& a, Gate3 b) { if(a) a = callback(a, b); else a = b; return a; } //0 args to Gate4 template struct Gate4MethodActionPte : public Gate4Action { Ptr object; M method; bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return object ? (object->*method)(p1, p2, p3, p4) : false; } bool IsValid() const { return object; } Gate4MethodActionPte(O *object, M method) : object(object), method(method) {} }; template Gate4 pteback(O *object, bool (M::*method)(P1 p1, P2 p2, P3 p3, P4 p4)) { return Gate4(new Gate4MethodActionPte(object, method)); } template struct Gate4MethodAction : public Gate4Action { O *object; M method; bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return (object->*method)(p1, p2, p3, p4); } Gate4MethodAction(O *object, M method) : object(object), method(method) {} }; template Gate4 callback(O *object, bool (M::*method)(P1 p1, P2 p2, P3 p3, P4 p4)) { return Gate4(new Gate4MethodAction(object, method)); } template Gate4 callback(const O *object, bool (M::*method)(P1 p1, P2 p2, P3 p3, P4 p4) const) { return Gate4(new Gate4MethodAction(object, method)); } template struct Gate4FnAction : public Gate4Action { bool (*fn)(P1 p1, P2 p2, P3 p3, P4 p4); bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return (*fn)(p1, p2, p3, p4); } Gate4FnAction(bool (*fn)(P1 p1, P2 p2, P3 p3, P4 p4)) : fn(fn) {} }; template inline Gate4 callback(bool (*fn)(P1 p1, P2 p2, P3 p3, P4 p4)) { return Gate4(new Gate4FnAction (fn)); } template struct Gate4ForkAction : public Gate4Action { Gate4 cb1, cb2; bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { cb1(p1, p2, p3, p4); return cb2(p1, p2, p3, p4); } Gate4ForkAction(Gate4 cb1, Gate4 cb2) : cb1(cb1), cb2(cb2) {} }; template inline Gate4 Proxy(Gate4& cb) { return callback(&cb, &Gate4::Execute); } template Gate4 callback(Gate4 cb1, Gate4 cb2) { return Gate4(new Gate4ForkAction (cb1, cb2)); } template Gate4& operator<<(Gate4& a, Gate4 b) { if(a) a = callback(a, b); else a = b; return a; }