diff --git a/uppsrc/Core/Callback.cpp b/uppsrc/Core/Callback.cpp index 16d2bf2f9..c016beac3 100644 --- a/uppsrc/Core/Callback.cpp +++ b/uppsrc/Core/Callback.cpp @@ -2,18 +2,82 @@ NAMESPACE_UPP -//#BLITZ_APPROVE -#define CPP_PART__ -#include "Cbgen.h" - void Callback::Execute() const { if(action) action->Execute(); } +Callback& Callback::operator=(const Callback& c) +{ + c.Retain(); + Release(); + action = c.action; + return *this; +} + +Callback::Callback(const Callback& c) +{ + action = c.action; + Retain(); +} + +Callback::~Callback() +{ + Release(); +} + +Callback callback(Callback cb1, Callback cb2) +{ + return Callback(new CallbackForkAction (cb1, cb2)); +} + +Callback& operator<<(Callback& a, Callback b) +{ + if(a) + a = callback(a, b); + else + a = b; + return a; +} + +// + bool Gate::Execute() const { return (void *)action == (void *)1 ? true : action ? action->Execute() : false; } +Gate& Gate::operator=(const Gate& c) +{ + c.Retain(); + Release(); + action = c.action; + return *this; +} + +Gate::Gate(const Gate& c) +{ + action = c.action; + Retain(); +} + +Gate::~Gate() +{ + Release(); +} + +Gate callback(Gate cb1, Gate cb2) +{ + return Gate(new GateForkAction (cb1, cb2)); +} + +Gate& operator<<(Gate& a, Gate b) +{ + if(a) + a = callback(a, b); + else + a = b; + return a; +} + END_UPP_NAMESPACE diff --git a/uppsrc/Core/Callback.h b/uppsrc/Core/Callback.h index 4a2906777..0ab88efc8 100644 --- a/uppsrc/Core/Callback.h +++ b/uppsrc/Core/Callback.h @@ -4,740 +4,11 @@ template inline D brutal_cast(const S& source) { return *(D *)&source; } #include "Cbgen.h" - -template -struct CallbackMethodActionArgPte : public CallbackAction { - Ptr object; - METHOD_ method; - T arg; - - void Execute() { if(object) (object->*method)(arg); } - - CallbackMethodActionArgPte(OBJECT_ *object, METHOD_ method, T arg) - : object(object), method(method), arg(arg) {} -}; - -template -Callback pteback1(Object *object, void (M::*method)(P), T arg) { - return Callback(new CallbackMethodActionArgPte(object, method, arg)); -} - -template -struct CallbackMethodActionArg : public CallbackAction { - OBJECT_ *object; - METHOD_ method; - T arg; - - void Execute() { (object->*method)(arg); } - - CallbackMethodActionArg(OBJECT_ *object, METHOD_ method, T arg) - : object(object), method(method), arg(arg) {} -}; - -template -Callback callback1(Object *object, void (M::*method)(P), T arg) { - return Callback(new CallbackMethodActionArg - (object, method, arg)); -} - -template -Callback callback1(const Object *object, void (M::*method)(P) const, T arg) { - return Callback(new CallbackMethodActionArg - (object, method, arg)); -} - -template -struct CallbackActionCallArg : public CallbackAction { - F fn; - T arg; - void Execute() { fn(arg); } - - CallbackActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} -}; - -template -Callback callback1(void (*fn)(P), T arg) -{ - return Callback(new CallbackActionCallArg(fn, arg)); -} - -template -struct CallbackMethodActionArg1Pte : public Callback1Action { - Ptr object; - METHOD_ method; - T arg; - void Execute(P1 p1) { if(object) (object->*method)(p1, arg); } - - CallbackMethodActionArg1Pte(OBJECT_ *object, METHOD_ method, T arg) - : object(object), method(method), arg(arg) {} -}; - -template -Callback1 pteback1(Object *object, void (M::*method)(P1, P), T arg) { - return Callback1(new CallbackMethodActionArg1Pte (object, method, arg)); -} - -template -struct CallbackMethodActionArg1 : public Callback1Action { - OBJECT_ *object; - METHOD_ method; - T arg; - void Execute(P1 p1) { (object->*method)(p1, arg); } - - CallbackMethodActionArg1(OBJECT_ *object, METHOD_ method, T arg) - : object(object), method(method), arg(arg) {} -}; - -template -Callback1 callback1(Object *object, void (M::*method)(P1, P), T arg) { - return Callback1(new CallbackMethodActionArg1 - (object, method, arg)); -} - -template -Callback1 callback1(const Object *object, void (M::*method)(P1, P) const, T arg) { - return Callback1(new CallbackMethodActionArg1 - (object, method, arg)); -} - -template -struct CallbackMethodActionArg1_2 : public Callback2Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2, arg1);} - - CallbackMethodActionArg1_2(OBJECT_ *object, METHOD_ method, T1 arg1) - : object(object), method(method), arg1(arg1) {} -}; - -template -Callback2 callback1(Object *object, void (M::*method)(P1, P2, T1), T1 arg1) { - return Callback2(new CallbackMethodActionArg1_2 - (object, method, arg1)); -} - -template -Callback2 callback1(const Object *object, void (M::*method)(P1, P2, T1) const, T1 arg1) { - return Callback2(new CallbackMethodActionArg1_2 - (object, method, arg1)); -} - -template -struct CallbackMethodActionArg1_3 : public Callback3Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3, arg1);} - - CallbackMethodActionArg1_3(OBJECT_ *object, METHOD_ method, T1 arg1) - : object(object), method(method), arg1(arg1) {} -}; - -template -Callback3 callback1(Object *object, void (M::*method)(P1, P2, P3, T1), T1 arg1) { - return Callback3(new CallbackMethodActionArg1_3 - (object, method, arg1)); -} - -template -Callback3 callback1(const Object *object, void (M::*method)(P1, P2, P3, T1) const, T1 arg1) { - return Callback3(new CallbackMethodActionArg1_3 - (object, method, arg1)); -} - -template -struct CallbackMethodActionArg1_4 : public Callback4Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (object->*method)(p1, p2, p3, p4, arg1);} - - CallbackMethodActionArg1_4(OBJECT_ *object, METHOD_ method, T1 arg1) - : object(object), method(method), arg1(arg1) {} -}; - -template -Callback4 callback1(Object *object, void (M::*method)(P1, P2, P3, P4, T1), T1 arg1) { - return Callback4(new CallbackMethodActionArg1_4 - (object, method, arg1)); -} - -template -Callback4 callback1(const Object *object, void (M::*method)(P1, P2, P3, P4, T1) const, T1 arg1) { - return Callback4(new CallbackMethodActionArg1_4 - (object, method, arg1)); -} - -template -struct GateMethodActionArg1 : public Gate1Action { - OBJECT_ *object; - METHOD_ method; - T arg; - bool Execute(P1 p1) { return (object->*method)(p1, arg); } - - GateMethodActionArg1(OBJECT_ *object, METHOD_ method, T arg) - : object(object), method(method), arg(arg) {} -}; - -template -Gate1 callback1(Object *object, bool (M::*method)(P1, P), T arg) { - return Gate1(new GateMethodActionArg1 - (object, method, arg)); -} - -template -struct CallbackActionCallArg1 : Callback1Action { - F fn; - T arg; - void Execute(P1 p1) { fn(p1, arg); } - - CallbackActionCallArg1(F fn, T arg) : fn(fn), arg(arg) {} -}; - -template -Callback1 callback1(void (*fn)(P1, P), T arg) -{ - return Callback1(new CallbackActionCallArg1(fn, arg)); -} - -template -Callback callback1(Callback1

cb, T arg) -{ - return Callback(new CallbackActionCallArg, T>(cb, arg)); -} - -template -Callback1 callback1(Callback2 cb, T arg) { - return Callback1(new CallbackActionCallArg1, P1, T>(cb, arg)); -} - -template -bool Gate1::Execute(P1 p1) const { - return (void *)action == (void *)1 ? true : action ? action->Execute(p1) : false; -} - -template -bool Gate2::Execute(P1 p1, P2 p2) const { - return (void *)action == (void *)1 ? true : action ? action->Execute(p1, p2) : false; -} - -template -bool Gate3::Execute(P1 p1, P2 p2, P3 p3) const { - return (void *)action == (void *)1 ? true : action ? action->Execute(p1, p2, p3) : false; -} - -template -bool Gate4::Execute(P1 p1, P2 p2, P3 p3, P4 p4) const { - return (void *)action == (void *)1 ? true : action ? action->Execute(p1, p2, p3, p4) : false; -} - -template -struct CallbackMethodActionArg2Pte : public CallbackAction { - Ptr object; - METHOD_ method; - T1 arg1; - T2 arg2; - void Execute() { if(object) (object->*method)(arg1, arg2); } - - CallbackMethodActionArg2Pte(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2) - : object(object), method(method), arg1(arg1), arg2(arg2) {} -}; - -template -Callback pteback2(Object *object, R (O::*method)(A, B), T1 arg1, T2 arg2) { - return Callback(new CallbackMethodActionArg2Pte - (object, method, arg1, arg2)); -} - -template -struct CallbackMethodActionArg2 : public CallbackAction { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - void Execute() { (object->*method)(arg1, arg2); } - - CallbackMethodActionArg2(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2) - : object(object), method(method), arg1(arg1), arg2(arg2) {} -}; - -template -Callback callback2(Object *object, R (O::*method)(A, B), T1 arg1, T2 arg2) { - return Callback(new CallbackMethodActionArg2 - (object, method, arg1, arg2)); -} - -template -Callback callback2(const Object *object, R (O::*method)(A, B) const, T1 arg1, T2 arg2) { - return Callback(new CallbackMethodActionArg2 - (object, method, arg1, arg2)); -} - -template -struct CallbackMethodActionArg2_1 : public Callback1Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - void Execute(P1 p1) { (object->*method)(p1, arg1, arg2); } - - CallbackMethodActionArg2_1(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2) - : object(object), method(method), arg1(arg1), arg2(arg2) {} -}; - -template -Callback1 callback2(Object *object, void (M::*method)(P1, T1, T2), T1 arg1, T2 arg2) { - return Callback1(new CallbackMethodActionArg2_1 - (object, method, arg1, arg2)); -} - -template -Callback1 callback2(const Object *object, void (M::*method)(P1, T1, T2) const, T1 arg1, T2 arg2) { - return Callback1(new CallbackMethodActionArg2_1 - (object, method, arg1, arg2)); -} - -template -struct CallbackMethodActionArg2_2 : public Callback2Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2, arg1, arg2);} - - CallbackMethodActionArg2_2(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2) - : object(object), method(method), arg1(arg1), arg2(arg2) {} -}; - -template -Callback2 callback2(Object *object, void (M::*method)(P1, P2, T1, T2), T1 arg1, T2 arg2) { - return Callback2(new CallbackMethodActionArg2_2 - (object, method, arg1, arg2)); -} - -template -Callback2 callback2(const Object *object, void (M::*method)(P1, P2, T1, T2) const, T1 arg1, T2 arg2) { - return Callback2(new CallbackMethodActionArg2_2 - (object, method, arg1, arg2)); -} - -template -struct CallbackMethodActionArg2_3 : public Callback3Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3, arg1, arg2);} - - CallbackMethodActionArg2_3(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2) - : object(object), method(method), arg1(arg1), arg2(arg2) {} -}; - -template -Callback3 callback2(Object *object, void (M::*method)(P1, P2, P3, T1, T2), T1 arg1, T2 arg2) { - return Callback3(new CallbackMethodActionArg2_3 - (object, method, arg1, arg2)); -} - -template -Callback3 callback2(const Object *object, void (M::*method)(P1, P2, P3, T1, T2) const, T1 arg1, T2 arg2) { - return Callback3(new CallbackMethodActionArg2_3 - (object, method, arg1, arg2)); -} - -template -struct CallbackMethodActionArg2_4 : public Callback4Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (object->*method)(p1, p2, p3, p4, arg1, arg2);} - - CallbackMethodActionArg2_4(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2) - : object(object), method(method), arg1(arg1), arg2(arg2) {} -}; - -template -Callback4 callback2(Object *object, void (M::*method)(P1, P2, P3, P4, T1, T2), T1 arg1, T2 arg2) { - return Callback4(new CallbackMethodActionArg2_4 - (object, method, arg1, arg2)); -} - -template -Callback4 callback2(const Object *object, void (M::*method)(P1, P2, P3, P4, T1, T2) const, T1 arg1, T2 arg2) { - return Callback4(new CallbackMethodActionArg2_4 - (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) {} -}; - -template -Callback callback2(R (*fn)(A, B), 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)); -} - -template -struct CallbackMethodActionArg3Pte : public CallbackAction { - Ptr object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - void Execute() { if(object) (object->*method)(arg1, arg2, arg3); } - - CallbackMethodActionArg3Pte(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} -}; - -template -Callback pteback3(Object *object, R (O::*method)(A, B, C), T1 arg1, T2 arg2, T3 arg3) { - return Callback(new CallbackMethodActionArg3Pte - (object, method, arg1, arg2, arg3)); -} - -template -struct CallbackMethodActionArg3 : public CallbackAction -{ - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - - void Execute() { (object->*method)(arg1, arg2, arg3); } - - CallbackMethodActionArg3(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} -}; - -template -Callback callback3(Object *object, R (O::*method)(A, B, C), T1 arg1, T2 arg2, T3 arg3) -{ - return Callback( - new CallbackMethodActionArg3(object, method, arg1, arg2, arg3)); -} - -template -Callback callback3(const Object *object, R (O::*method)(A, B, C) const, T1 arg1, T2 arg2, T3 arg3) { - return Callback(new CallbackMethodActionArg3 - (object, method, arg1, arg2, arg3)); -} - -template -struct CallbackMethodActionArg3_1 : public Callback1Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - void Execute(P1 p1) { (object->*method)(p1, arg1, arg2, arg3); } - - CallbackMethodActionArg3_1(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} -}; - -template -Callback1 callback3(Object *object, void (M::*method)(P1, T1, T2, T3), T1 arg1, T2 arg2, T3 arg3) { - return Callback1(new CallbackMethodActionArg3_1 - (object, method, arg1, arg2, arg3)); -} - -template -Callback1 callback3(const Object *object, void (M::*method)(P1, T1, T2, T3) const, T1 arg1, T2 arg2, T3 arg3) { - return Callback1(new CallbackMethodActionArg3_1 - (object, method, arg1, arg2, arg3)); -} - -template -struct CallbackMethodActionArg3_2 : public Callback2Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2, arg1, arg2, arg3);} - - CallbackMethodActionArg3_2(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} -}; - -template -Callback2 callback3(Object *object, void (M::*method)(P1, P2, T1, T2, T3), T1 arg1, T2 arg2, T3 arg3) { - return Callback2(new CallbackMethodActionArg3_2 - (object, method, arg1, arg2, arg3)); -} - -template -Callback2 callback3(const Object *object, void (M::*method)(P1, P2, T1, T2, T3) const, T1 arg1, T2 arg2, T3 arg3) { - return Callback2(new CallbackMethodActionArg3_2 - (object, method, arg1, arg2, arg3)); -} - -template -struct CallbackMethodActionArg3_3 : public Callback3Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3, arg1, arg2, arg3);} - - CallbackMethodActionArg3_3(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} -}; - -template -Callback3 callback3(Object *object, void (M::*method)(P1, P2, P3, T1, T2, T3), T1 arg1, T2 arg2, T3 arg3) { - return Callback3(new CallbackMethodActionArg3_3 - (object, method, arg1, arg2, arg3)); -} - -template -Callback3 callback3(const Object *object, void (M::*method)(P1, P2, P3, T1, T2, T3) const, T1 arg1, T2 arg2, T3 arg3) { - return Callback3(new CallbackMethodActionArg3_3 - (object, method, arg1, arg2, arg3)); -} - -template -struct CallbackMethodActionArg3_4 : public Callback4Action { - OBJECT_ *object; - METHOD_ 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);} - - CallbackMethodActionArg3_4(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3) {} -}; - -template -Callback4 callback3(Object *object, void (M::*method)(P1, P2, P3, P4, T1, T2, T3), T1 arg1, T2 arg2, T3 arg3) { - return Callback4(new CallbackMethodActionArg3_4 - (object, method, arg1, arg2, arg3)); -} - -template -Callback4 callback3(const Object *object, void (M::*method)(P1, P2, P3, P4, T1, T2, T3) const, T1 arg1, T2 arg2, T3 arg3) { - return Callback4(new CallbackMethodActionArg3_4 - (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) {} -}; - -template -Callback callback3(R (*fn)(A, B, C), 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)); -} - -template -struct CallbackMethodActionArg4Pte : public CallbackAction { - Ptr object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - T4 arg4; - void Execute() { if(object) (object->*method)(arg1, arg2, arg3, arg4); } - - CallbackMethodActionArg4Pte(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} -}; - -template -Callback pteback4(Object *object, R (O::*method)(A, B,C,D), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback(new CallbackMethodActionArg4Pte - (object, method, arg1, arg2, arg3, arg4)); -} - -template -struct CallbackMethodActionArg4 : public CallbackAction -{ - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - T4 arg4; - - void Execute() { (object->*method)(arg1, arg2, arg3, arg4); } - - CallbackMethodActionArg4(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} -}; - -template -Callback callback4(Object *object, R (O::*method)(A, B, C, D), T1 arg1, T2 arg2, T3 arg3, T4 arg4) -{ - return Callback( - new CallbackMethodActionArg4(object, method, arg1, arg2, arg3, arg4)); -} - -template -Callback callback4(const Object *object, R (O::*method)(A, B, C, D) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback(new CallbackMethodActionArg4 - (object, method, arg1, arg2, arg3, arg4)); -} - -template -struct CallbackMethodActionArg4_1 : public Callback1Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - T4 arg4; - void Execute(P1 p1) { (object->*method)(p1, arg1, arg2, arg3, arg4); } - - CallbackMethodActionArg4_1(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} -}; - -template -Callback1 callback4(Object *object, void (M::*method)(P1, T1, T2, T3, T4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback1(new CallbackMethodActionArg4_1 - (object, method, arg1, arg2, arg3, arg4)); -} - -template -Callback1 callback4(const Object *object, void (M::*method)(P1, T1, T2, T3, T4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback1(new CallbackMethodActionArg4_1 - (object, method, arg1, arg2, arg3, arg4)); -} - -template -struct CallbackMethodActionArg4_2 : public Callback2Action { - OBJECT_ *object; - METHOD_ method; - T1 arg1; - T2 arg2; - T3 arg3; - T4 arg4; - void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2, arg1, arg2, arg3, arg4);} - - CallbackMethodActionArg4_2(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} -}; - -template -Callback2 callback4(Object *object, void (M::*method)(P1, P2, T1, T2, T3, T4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback2(new CallbackMethodActionArg4_2 - (object, method, arg1, arg2, arg3, arg4)); -} - -template -Callback2 callback4(const Object *object, void (M::*method)(P1, P2, T1, T2, T3, T4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback2(new CallbackMethodActionArg4_2 - (object, method, arg1, arg2, arg3, arg4)); -} - -template -struct CallbackMethodActionArg4_3 : public Callback3Action { - OBJECT_ *object; - METHOD_ 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);} - - CallbackMethodActionArg4_3(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} -}; - -template -Callback3 callback4(Object *object, void (M::*method)(P1, P2, P3, T1, T2, T3, T4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback3(new CallbackMethodActionArg4_3 - (object, method, arg1, arg2, arg3, arg4)); -} - -template -Callback3 callback4(const Object *object, void (M::*method)(P1, P2, P3, T1, T2, T3, T4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback3(new CallbackMethodActionArg4_3 - (object, method, arg1, arg2, arg3, arg4)); -} - -template -struct CallbackMethodActionArg4_4 : public Callback4Action { - OBJECT_ *object; - METHOD_ 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);} - - CallbackMethodActionArg4_4(OBJECT_ *object, METHOD_ method, T1 arg1, T2 arg2, T3 arg3, T4 arg4) - : object(object), method(method), arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) {} -}; - -template -Callback4 callback4(Object *object, void (M::*method)(P1, P2, P3, P4, T1, T2, T3, T4), T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback4(new CallbackMethodActionArg4_4 - (object, method, arg1, arg2, arg3, arg4)); -} - -template -Callback4 callback4(const Object *object, void (M::*method)(P1, P2, P3, P4, T1, T2, T3, T4) const, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { - return Callback4(new CallbackMethodActionArg4_4 - (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) {} -}; - -template -Callback callback4(R (*fn)(A, B, C, D), 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)); -} +#include "Callback0.h" +#include "Callback1.h" +#include "Callback2.h" +#include "Callback3.h" +#include "Callback4.h" #define THISBACK(x) callback(this, &CLASSNAME::x) #define THISBACK1(x, arg) callback1(this, &CLASSNAME::x, arg) @@ -751,6 +22,12 @@ Callback callback4(Callback4 cb, T1 arg1, T2 arg2, T3 arg3, T4 arg4) #define PTEBACK3(m, a, b, c) pteback3(this, &CLASSNAME::m, a, b, c) #define PTEBACK4(m, a, b, c, d) pteback4(this, &CLASSNAME::m, a, b, c, d) +#define STDBACK(x) callback(&x) +#define STDBACK1(x, arg) callback1(&x, arg) +#define STDBACK2(m, a, b) callback2(&m, a, b) +#define STDBACK3(m, a, b, c) callback3(&m, a, b, c) +#define STDBACK4(m, a, b, c, d) callback4(&m, a, b, c, d) + template class CallbackArgTarget { diff --git a/uppsrc/Core/Callback0.h b/uppsrc/Core/Callback0.h new file mode 100644 index 000000000..49bd86300 --- /dev/null +++ b/uppsrc/Core/Callback0.h @@ -0,0 +1,808 @@ +//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; +} diff --git a/uppsrc/Core/Callback1.h b/uppsrc/Core/Callback1.h new file mode 100644 index 000000000..2f024478a --- /dev/null +++ b/uppsrc/Core/Callback1.h @@ -0,0 +1,518 @@ +//1 arg to Callback + +template +struct CallbackMethodActionArgPte : public CallbackAction { + Ptr object; + M method; + T arg; + + void Execute() { if(object) (object->*method)(arg); } + + CallbackMethodActionArgPte(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Callback pteback1(O *object, void (M::*method)(Q), T arg) { + return Callback(new CallbackMethodActionArgPte(object, method, arg)); +} + +template +struct CallbackMethodActionArg : public CallbackAction { + O *object; + M method; + T arg; + + void Execute() { (object->*method)(arg); } + + CallbackMethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Callback callback1(O *object, void (M::*method)(Q), T arg) { + return Callback(new CallbackMethodActionArg + (object, method, arg)); +} + +template +Callback callback1(const O *object, void (M::*method)(Q) const, T arg) { + return Callback(new CallbackMethodActionArg + (object, method, arg)); +} + +template +struct CallbackActionCallArg : public CallbackAction { + F fn; + T arg; + void Execute() { fn(arg); } + + CallbackActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Callback callback1(void (*fn)(Q), T arg) +{ + return Callback(new CallbackActionCallArg(fn, arg)); +} + +//reduct +template +Callback callback1(Callback1 cb, T arg) +{ + return Callback(new CallbackActionCallArg, T>(cb, arg)); +} + +//1 arg to Callback1 + +template +struct Callback1MethodActionArgPte : public Callback1Action { + Ptr object; + M method; + T arg; + void Execute(P1 p1) { if(object) (object->*method)(p1, arg); } + + Callback1MethodActionArgPte(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Callback1 pteback1(O *object, void (M::*method)(P1, Q), T arg) { + return Callback1(new Callback1MethodActionArgPte (object, method, arg)); +} + +template +struct Callback1MethodActionArg : public Callback1Action { + O *object; + M method; + T arg; + void Execute(P1 p1) { (object->*method)(p1, arg); } + + Callback1MethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Callback1 callback1(O *object, void (M::*method)(P1, Q), T arg) { + return Callback1(new Callback1MethodActionArg + (object, method, arg)); +} + +template +Callback1 callback1(const O *object, void (M::*method)(P1, Q) const, T arg) { + return Callback1(new Callback1MethodActionArg + (object, method, arg)); +} + +template +struct Callback1ActionCallArg : public Callback1Action { + F fn; + T arg; + void Execute(P1 p1) { fn(p1, arg); } + + Callback1ActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Callback1 callback1(void (*fn)(P1, Q), T arg) +{ + return Callback1(new Callback1ActionCallArg(fn, arg)); +} + +//reduct +template +Callback1 callback1(Callback2 cb, T arg) { + return Callback1(new Callback1ActionCallArg, P1, T>(cb, arg)); +} + +//1 arg to Callback2 + +template +struct Callback2MethodActionArg : public Callback2Action { + O *object; + M method; + T arg; + void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2, arg); } + + Callback2MethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Callback2 callback1(O *object, void (M::*method)(P1, P2, Q), T arg) { + return Callback2(new Callback2MethodActionArg + (object, method, arg)); +} + +template +Callback2 callback1(const O *object, void (M::*method)(P1, P2, Q) const, T arg) { + return Callback2(new Callback2MethodActionArg + (object, method, arg)); +} + +template +struct Callback2ActionCallArg : Callback2Action { + F fn; + T arg; + void Execute(P1 p1, P2 p2) { fn(p1, p2, arg); } + + Callback2ActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Callback2 callback1(void (*fn)(P1, P2, Q), T arg) +{ + return Callback2(new Callback2ActionCallArg(fn, arg)); +} + +//reduct +template +Callback2 callback1(Callback3 cb, T arg) { + return Callback2(new Callback2ActionCallArg, P1, P2, T>(cb, arg)); +} + +//1 arg to Callback3 + +template +struct Callback3MethodActionArg : public Callback3Action { + O *object; + M method; + T arg; + void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3, arg); } + + Callback3MethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Callback3 callback1(O *object, void (M::*method)(P1, P2, P3, Q), T arg) { + return Callback3(new Callback3MethodActionArg + (object, method, arg)); +} + +template +Callback3 callback1(const O *object, void (M::*method)(P1, P2, P3, Q) const, T arg) { + return Callback3(new Callback3MethodActionArg + (object, method, arg)); +} + +template +struct Callback3ActionCallArg : Callback3Action { + F fn; + T arg; + void Execute(P1 p1, P2 p2, P3 p3) { fn(p1, p2, p3, arg); } + + Callback3ActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Callback3 callback1(void (*fn)(P1, P2, P3, Q), T arg) +{ + return Callback3(new Callback3ActionCallArg(fn, arg)); +} + +//reduct +template +Callback3 callback1(Callback4 cb, T arg) { + return Callback3(new Callback3ActionCallArg, P1, P2, P3, T>(cb, arg)); +} + +//1 arg to Callback4 + +template +struct Callback4MethodActionArg : public Callback4Action { + O *object; + M method; + T arg; + void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (object->*method)(p1, p2, p3, p4, arg); } + + Callback4MethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Callback4 callback1(O *object, void (M::*method)(P1, P2, P3, P4, Q), T arg) { + return Callback4(new Callback4MethodActionArg + (object, method, arg)); +} + +template +Callback4 callback1(const O *object, void (M::*method)(P1, P2, P3, P4, Q) const, T arg) { + return Callback4(new Callback4MethodActionArg + (object, method, arg)); +} + +template +struct Callback4ActionCallArg : Callback4Action { + F fn; + T arg; + void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { fn(p1, p2, p3, p4, arg); } + + Callback4ActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Callback4 callback1(void (*fn)(P1, P2, P3, P4, Q), T arg) +{ + return Callback4(new Callback4ActionCallArg(fn, arg)); +} + +// ------------------------------------------------------- + +//1 arg to Gate + +template +struct GateMethodActionArgPte : public GateAction { + Ptr object; + M method; + T arg; + + bool Execute() { return object? (object->*method)(arg) : false; } + + GateMethodActionArgPte(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Gate pteback1(O *object, bool (M::*method)(Q), T arg) { + return Gate(new GateMethodActionArgPte(object, method, arg)); +} + +template +struct GateMethodActionArg : public GateAction { + O *object; + M method; + T arg; + bool Execute() { return object ? (object->*method)(arg) : false; } + + GateMethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Gate callback1(O *object, bool (M::*method)(Q), T arg) { + return Gate(new GateMethodActionArg + (object, method, arg)); +} + +template +Gate callback1(const O *object, bool (M::*method)(Q) const, T arg) { + return Gate(new GateMethodActionArg + (object, method, arg)); +} + +template +struct GateActionCallArg : public GateAction { + F fn; + T arg; + bool Execute() { return fn(arg); } + + GateActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Gate callback1(bool (*fn)(Q), T arg) +{ + return Gate(new GateActionCallArg(fn, arg)); +} + +//reduct +template +Gate callback1(Gate1 cb, T arg) +{ + return Gate(new GateActionCallArg, T>(cb, arg)); +} + +//1 arg to Gate1 + +template +struct Gate1MethodActionArgPte : public Gate1Action { + Ptr object; + M method; + T arg; + bool Execute(P1 p1) { return object ? (object->*method)(p1, arg) : false; } + + Gate1MethodActionArgPte(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Gate1 pteback1(O *object, bool (M::*method)(P1, Q), T arg) { + return Gate1(new Gate1MethodActionArgPte (object, method, arg)); +} + +template +struct Gate1MethodActionArg : public Gate1Action { + O *object; + M method; + T arg; + bool Execute(P1 p1) { return object ? (object->*method)(p1, arg) : false; } + + Gate1MethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Gate1 callback1(O *object, bool (M::*method)(P1, Q), T arg) { + return Gate1(new Gate1MethodActionArg + (object, method, arg)); +} + +template +Gate1 callback1(const O *object, bool (M::*method)(P1, Q) const, T arg) { + return Gate1(new Gate1MethodActionArg + (object, method, arg)); +} + +template +struct Gate1ActionCallArg : public Gate1Action { + F fn; + T arg; + bool Execute(P1 p1) { return fn(p1, arg); } + + Gate1ActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Gate1 callback1(bool (*fn)(P1, Q), T arg) +{ + return Gate1(new Gate1ActionCallArg(fn, arg)); +} + +//reduct +template +Gate1 callback1(Gate2 cb, T arg) { + return Gate1(new Gate1ActionCallArg, P1, T>(cb, arg)); +} + +//1 arg to Gate2 + +template +struct Gate2MethodActionArg : public Gate2Action { + O *object; + M method; + T arg; + bool Execute(P1 p1, P2 p2) { return object ? (object->*method)(p1, p2, arg) : false; } + + Gate2MethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Gate2 callback1(O *object, bool (M::*method)(P1, P2, Q), T arg) { + return Gate2(new Gate2MethodActionArg + (object, method, arg)); +} + +template +Gate2 callback1(const O *object, bool (M::*method)(P1, P2, Q) const, T arg) { + return Gate2(new Gate2MethodActionArg + (object, method, arg)); +} + +template +struct Gate2ActionCallArg : Gate2Action { + F fn; + T arg; + bool Execute(P1 p1, P2 p2) { return fn(p1, p2, arg); } + + Gate2ActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Gate2 callback1(bool (*fn)(P1, P2, Q), T arg) +{ + return Gate2(new Gate2ActionCallArg(fn, arg)); +} + +//reduct +template +Gate2 callback1(Gate3 cb, T arg) { + return Gate2(new Gate2ActionCallArg, P1, P2, T>(cb, arg)); +} + +//1 arg to Gate3 + +template +struct Gate3MethodActionArg : public Gate3Action { + O *object; + M method; + T arg; + bool Execute(P1 p1, P2 p2, P3 p3) { return object ? (object->*method)(p1, p2, p3, arg) : false; } + + Gate3MethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Gate3 callback1(O *object, bool (M::*method)(P1, P2, P3, Q), T arg) { + return Gate3(new Gate3MethodActionArg + (object, method, arg)); +} + +template +Gate3 callback1(const O *object, bool (M::*method)(P1, P2, P3, Q) const, T arg) { + return Gate3(new Gate3MethodActionArg + (object, method, arg)); +} + +template +struct Gate3ActionCallArg : Gate3Action { + F fn; + T arg; + bool Execute(P1 p1, P2 p2, P3 p3) { return fn(p1, p2, p3, arg); } + + Gate3ActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Gate3 callback1(bool (*fn)(P1, P2, P3, Q), T arg) +{ + return Gate3(new Gate3ActionCallArg(fn, arg)); +} + +//reduct +template +Gate3 callback1(Gate4 cb, T arg) { + return Gate3(new Gate3ActionCallArg, P1, P2, P3, T>(cb, arg)); +} + +//1 arg to Gate4 + +template +struct Gate4MethodActionArg : public Gate4Action { + O *object; + M method; + T arg; + bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return object ? (object->*method)(p1, p2, p3, p4, arg) : false; } + + Gate4MethodActionArg(O *object, M method, T arg) + : object(object), method(method), arg(arg) {} +}; + +template +Gate4 callback1(O *object, bool (M::*method)(P1, P2, P3, P4, Q), T arg) { + return Gate4(new Gate4MethodActionArg + (object, method, arg)); +} + +template +Gate4 callback1(const O *object, bool (M::*method)(P1, P2, P3, P4, Q) const, T arg) { + return Gate4(new Gate4MethodActionArg + (object, method, arg)); +} + +template +struct Gate4ActionCallArg : Gate4Action { + F fn; + T arg; + bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return fn(p1, p2, p3, p4, arg); } + + Gate4ActionCallArg(F fn, T arg) : fn(fn), arg(arg) {} +}; + +template +Gate4 callback1(bool (*fn)(P1, P2, P3, P4, Q), T arg) +{ + return Gate4(new Gate4ActionCallArg(fn, arg)); +} diff --git a/uppsrc/Core/Callback2.h b/uppsrc/Core/Callback2.h new file mode 100644 index 000000000..f27c9cdc3 --- /dev/null +++ b/uppsrc/Core/Callback2.h @@ -0,0 +1,598 @@ +// 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)); +} diff --git a/uppsrc/Core/Callback3.h b/uppsrc/Core/Callback3.h new file mode 100644 index 000000000..c71ba6ff9 --- /dev/null +++ b/uppsrc/Core/Callback3.h @@ -0,0 +1,428 @@ +//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)); +} diff --git a/uppsrc/Core/Callback4.h b/uppsrc/Core/Callback4.h new file mode 100644 index 000000000..40114ab72 --- /dev/null +++ b/uppsrc/Core/Callback4.h @@ -0,0 +1,442 @@ +//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)); +} diff --git a/uppsrc/Core/Cbgen.h b/uppsrc/Core/Cbgen.h index 36bae5476..e94fc9489 100644 --- a/uppsrc/Core/Cbgen.h +++ b/uppsrc/Core/Cbgen.h @@ -1,5 +1,3 @@ -#ifndef CPP_PART__ - // ----------------------------------------------------------- struct CallbackAction { @@ -12,35 +10,6 @@ struct CallbackAction { virtual ~CallbackAction() {} }; -template -struct CallbackMethodActionPte : public CallbackAction { - Ptr object; - METHOD method; - - void Execute() { if(object) (object->*method)(); } - bool IsValid() const { return object; } - - CallbackMethodActionPte(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct CallbackMethodAction : public CallbackAction { - OBJECT *object; - METHOD method; - - void Execute() { (object->*method)(); } - - CallbackMethodAction(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -struct CallbackFnAction : public CallbackAction { - void (*fn)(); - - void Execute() { (*fn)(); } - - CallbackFnAction(void (*fn)()) : fn(fn) {} -}; - class Callback : Moveable< Callback > { CallbackAction *action; @@ -71,81 +40,6 @@ public: }; -template -Callback pteback(OBJECT *object, void (METHOD::*method)()) { - return Callback(new CallbackMethodActionPte(object, method)); -} - -template -Callback callback(OBJECT *object, void (METHOD::*method)()) { - return Callback(new CallbackMethodAction(object, method)); -} - -template -Callback callback(const OBJECT *object, void (METHOD::*method)() const) { - return Callback(new CallbackMethodAction(object, method)); -} - -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); - -#endif -#ifdef CPP_PART__ - -Callback callback(Callback cb1, Callback cb2) -{ - return Callback(new CallbackForkAction (cb1, cb2)); -} - -Callback& operator<<(Callback& a, Callback b) -{ - if(a) - a = callback(a, b); - else - a = b; - return a; -} - -Callback& Callback::operator=(const Callback& c) -{ - c.Retain(); - Release(); - action = c.action; - return *this; -} - -Callback::Callback(const Callback& c) -{ - action = c.action; - Retain(); -} - -Callback::~Callback() -{ - Release(); -} - -#endif -#ifndef CPP_PART__ - // ----------------------------------------------------------- template @@ -159,36 +53,6 @@ struct Callback1Action { virtual ~Callback1Action() {} }; -template -struct Callback1MethodActionPte : public Callback1Action { - Ptr object; - METHOD method; - - void Execute(P1 p1) { if(object) (object->*method)(p1); } - bool IsValid() const { return object; } - - Callback1MethodActionPte(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Callback1MethodAction : public Callback1Action { - OBJECT *object; - METHOD method; - - void Execute(P1 p1) { (object->*method)(p1); } - - Callback1MethodAction(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Callback1FnAction : public Callback1Action { - void (*fn)(P1 p1); - - void Execute(P1 p1) { (*fn)(p1); } - - Callback1FnAction(void (*fn)(P1 p1)) : fn(fn) {} -}; - template class Callback1 : Moveable< Callback1 > { Callback1Action *action; @@ -220,58 +84,6 @@ public: }; -template -Callback1 pteback(OBJECT *object, void (METHOD::*method)(P1 p1)) { - return Callback1(new Callback1MethodActionPte(object, method)); -} - -template -Callback1 callback(OBJECT *object, void (METHOD::*method)(P1 p1)) { - return Callback1(new Callback1MethodAction(object, method)); -} - -template -Callback1 callback(const OBJECT *object, void (METHOD::*method)(P1 p1) const) { - return Callback1(new Callback1MethodAction(object, method)); -} - -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; -} - template Callback1& Callback1::operator=(const Callback1& c) { @@ -307,36 +119,6 @@ struct Callback2Action { virtual ~Callback2Action() {} }; -template -struct Callback2MethodActionPte : public Callback2Action { - Ptr object; - METHOD method; - - void Execute(P1 p1, P2 p2) { if(object) (object->*method)(p1, p2); } - bool IsValid() const { return object; } - - Callback2MethodActionPte(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Callback2MethodAction : public Callback2Action { - OBJECT *object; - METHOD method; - - void Execute(P1 p1, P2 p2) { (object->*method)(p1, p2); } - - Callback2MethodAction(OBJECT *object, METHOD method) : object(object), method(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 class Callback2 : Moveable< Callback2 > { Callback2Action *action; @@ -368,58 +150,6 @@ public: }; -template -Callback2 pteback(OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2)) { - return Callback2(new Callback2MethodActionPte(object, method)); -} - -template -Callback2 callback(OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2)) { - return Callback2(new Callback2MethodAction(object, method)); -} - -template -Callback2 callback(const OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2) const) { - return Callback2(new Callback2MethodAction(object, method)); -} - -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; -} - template Callback2& Callback2::operator=(const Callback2& c) { @@ -455,36 +185,6 @@ struct Callback3Action { virtual ~Callback3Action() {} }; -template -struct Callback3MethodActionPte : public Callback3Action { - Ptr object; - METHOD method; - - void Execute(P1 p1, P2 p2, P3 p3) { if(object) (object->*method)(p1, p2, p3); } - bool IsValid() const { return object; } - - Callback3MethodActionPte(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Callback3MethodAction : public Callback3Action { - OBJECT *object; - METHOD method; - - void Execute(P1 p1, P2 p2, P3 p3) { (object->*method)(p1, p2, p3); } - - Callback3MethodAction(OBJECT *object, METHOD method) : object(object), method(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 class Callback3 : Moveable< Callback3 > { Callback3Action *action; @@ -516,58 +216,6 @@ public: }; -template -Callback3 pteback(OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2, P3 p3)) { - return Callback3(new Callback3MethodActionPte(object, method)); -} - -template -Callback3 callback(OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2, P3 p3)) { - return Callback3(new Callback3MethodAction(object, method)); -} - -template -Callback3 callback(const OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2, P3 p3) const) { - return Callback3(new Callback3MethodAction(object, method)); -} - -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; -} - template Callback3& Callback3::operator=(const Callback3& c) { @@ -603,36 +251,6 @@ struct Callback4Action { virtual ~Callback4Action() {} }; -template -struct Callback4MethodActionPte : public Callback4Action { - Ptr object; - METHOD 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(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Callback4MethodAction : public Callback4Action { - OBJECT *object; - METHOD method; - - void Execute(P1 p1, P2 p2, P3 p3, P4 p4) { (object->*method)(p1, p2, p3, p4); } - - Callback4MethodAction(OBJECT *object, METHOD method) : object(object), method(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 class Callback4 : Moveable< Callback4 > { Callback4Action *action; @@ -664,58 +282,6 @@ public: }; -template -Callback4 pteback(OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2, P3 p3, P4 p4)) { - return Callback4(new Callback4MethodActionPte(object, method)); -} - -template -Callback4 callback(OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2, P3 p3, P4 p4)) { - return Callback4(new Callback4MethodAction(object, method)); -} - -template -Callback4 callback(const OBJECT *object, void (METHOD::*method)(P1 p1, P2 p2, P3 p3, P4 p4) const) { - return Callback4(new Callback4MethodAction(object, method)); -} - -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; -} - template Callback4& Callback4::operator=(const Callback4& c) { @@ -750,35 +316,6 @@ struct GateAction { virtual ~GateAction() {} }; -template -struct GateMethodActionPte : public GateAction { - Ptr object; - METHOD method; - - bool Execute() { return object ? (object->*method)() : false; } - bool IsValid() const { return object; } - - GateMethodActionPte(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct GateMethodAction : public GateAction { - OBJECT *object; - METHOD method; - - bool Execute() { return (object->*method)(); } - - GateMethodAction(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -struct GateFnAction : public GateAction { - bool (*fn)(); - - bool Execute() { return (*fn)(); } - - GateFnAction(bool (*fn)()) : fn(fn) {} -}; - class Gate : Moveable< Gate > { GateAction *action; @@ -813,81 +350,6 @@ public: }; -template -Gate pteback(OBJECT *object, bool (METHOD::*method)()) { - return Gate(new GateMethodActionPte(object, method)); -} - -template -Gate callback(OBJECT *object, bool (METHOD::*method)()) { - return Gate(new GateMethodAction(object, method)); -} - -template -Gate callback(const OBJECT *object, bool (METHOD::*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); - -#endif -#ifdef CPP_PART__ - -Gate callback(Gate cb1, Gate cb2) -{ - return Gate(new GateForkAction (cb1, cb2)); -} - -Gate& operator<<(Gate& a, Gate b) -{ - if(a) - a = callback(a, b); - else - a = b; - return a; -} - -Gate& Gate::operator=(const Gate& c) -{ - c.Retain(); - Release(); - action = c.action; - return *this; -} - -Gate::Gate(const Gate& c) -{ - action = c.action; - Retain(); -} - -Gate::~Gate() -{ - Release(); -} - -#endif -#ifndef CPP_PART__ - // ----------------------------------------------------------- template @@ -901,36 +363,6 @@ struct Gate1Action { virtual ~Gate1Action() {} }; -template -struct Gate1MethodActionPte : public Gate1Action { - Ptr object; - METHOD method; - - bool Execute(P1 p1) { return object ? (object->*method)(p1) : false; } - bool IsValid() const { return object; } - - Gate1MethodActionPte(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Gate1MethodAction : public Gate1Action { - OBJECT *object; - METHOD method; - - bool Execute(P1 p1) { return (object->*method)(p1); } - - Gate1MethodAction(OBJECT *object, METHOD method) : object(object), method(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 class Gate1 : Moveable< Gate1 > { Gate1Action *action; @@ -950,7 +382,8 @@ public: operator bool() const { return (void *)action != (void *)1 && action && action->IsValid(); } - bool Execute(P1 p1) const; + bool Execute(P1 p1) const { return (void *)action == (void *)1 ? true : action ? action->Execute(p1) : false; } + bool operator()(P1 p1) const { return Execute(p1); } void ClearTrue() { Clear(); action = (Gate1Action *)1; } void ClearFalse() { Clear(); } @@ -966,58 +399,6 @@ public: }; -template -Gate1 pteback(OBJECT *object, bool (METHOD::*method)(P1 p1)) { - return Gate1(new Gate1MethodActionPte(object, method)); -} - -template -Gate1 callback(OBJECT *object, bool (METHOD::*method)(P1 p1)) { - return Gate1(new Gate1MethodAction(object, method)); -} - -template -Gate1 callback(const OBJECT *object, bool (METHOD::*method)(P1 p1) const) { - return Gate1(new Gate1MethodAction(object, method)); -} - -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; -} - template Gate1& Gate1::operator=(const Gate1& c) { @@ -1053,36 +434,6 @@ struct Gate2Action { virtual ~Gate2Action() {} }; -template -struct Gate2MethodActionPte : public Gate2Action { - Ptr object; - METHOD method; - - bool Execute(P1 p1, P2 p2) { return object ? (object->*method)(p1, p2) : false; } - bool IsValid() const { return object; } - - Gate2MethodActionPte(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Gate2MethodAction : public Gate2Action { - OBJECT *object; - METHOD method; - - bool Execute(P1 p1, P2 p2) { return (object->*method)(p1, p2); } - - Gate2MethodAction(OBJECT *object, METHOD method) : object(object), method(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 class Gate2 : Moveable< Gate2 > { Gate2Action *action; @@ -1102,7 +453,7 @@ public: operator bool() const { return (void *)action != (void *)1 && action && action->IsValid(); } - bool Execute(P1 p1, P2 p2) const; + bool Execute(P1 p1, P2 p2) const { return (void *)action == (void *)1 ? true : action ? action->Execute(p1, p2) : false; } bool operator()(P1 p1, P2 p2) const { return Execute(p1, p2); } void ClearTrue() { Clear(); action = (Gate2Action *)1; } void ClearFalse() { Clear(); } @@ -1118,58 +469,6 @@ public: }; -template -Gate2 pteback(OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2)) { - return Gate2(new Gate2MethodActionPte(object, method)); -} - -template -Gate2 callback(OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2)) { - return Gate2(new Gate2MethodAction(object, method)); -} - -template -Gate2 callback(const OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2) const) { - return Gate2(new Gate2MethodAction(object, method)); -} - -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; -} - template Gate2& Gate2::operator=(const Gate2& c) { @@ -1205,36 +504,6 @@ struct Gate3Action { virtual ~Gate3Action() {} }; -template -struct Gate3MethodActionPte : public Gate3Action { - Ptr object; - METHOD method; - - bool Execute(P1 p1, P2 p2, P3 p3) { return object ? (object->*method)(p1, p2, p3) : false; } - bool IsValid() const { return object; } - - Gate3MethodActionPte(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Gate3MethodAction : public Gate3Action { - OBJECT *object; - METHOD method; - - bool Execute(P1 p1, P2 p2, P3 p3) { return (object->*method)(p1, p2, p3); } - - Gate3MethodAction(OBJECT *object, METHOD method) : object(object), method(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 class Gate3 : Moveable< Gate3 > { Gate3Action *action; @@ -1254,7 +523,7 @@ public: operator bool() const { return (void *)action != (void *)1 && action && action->IsValid(); } - bool Execute(P1 p1, P2 p2, P3 p3) const; + bool Execute(P1 p1, P2 p2, P3 p3) const { return (void *)action == (void *)1 ? true : action ? action->Execute(p1, p2, p3) : false; } bool operator()(P1 p1, P2 p2, P3 p3) const { return Execute(p1, p2, p3); } void ClearTrue() { Clear(); action = (Gate3Action *)1; } void ClearFalse() { Clear(); } @@ -1270,58 +539,6 @@ public: }; -template -Gate3 pteback(OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2, P3 p3)) { - return Gate3(new Gate3MethodActionPte(object, method)); -} - -template -Gate3 callback(OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2, P3 p3)) { - return Gate3(new Gate3MethodAction(object, method)); -} - -template -Gate3 callback(const OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2, P3 p3) const) { - return Gate3(new Gate3MethodAction(object, method)); -} - -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; -} - template Gate3& Gate3::operator=(const Gate3& c) { @@ -1357,36 +574,6 @@ struct Gate4Action { virtual ~Gate4Action() {} }; -template -struct Gate4MethodActionPte : public Gate4Action { - Ptr object; - METHOD 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(OBJECT *object, METHOD method) : object(object), method(method) {} -}; - -template -struct Gate4MethodAction : public Gate4Action { - OBJECT *object; - METHOD method; - - bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) { return (object->*method)(p1, p2, p3, p4); } - - Gate4MethodAction(OBJECT *object, METHOD method) : object(object), method(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 class Gate4 : Moveable< Gate4 > { Gate4Action *action; @@ -1406,7 +593,7 @@ public: operator bool() const { return (void *)action != (void *)1 && action && action->IsValid(); } - bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) const; + bool Execute(P1 p1, P2 p2, P3 p3, P4 p4) const { return (void *)action == (void *)1 ? true : action ? action->Execute(p1, p2, p3, p4) : false; } bool operator()(P1 p1, P2 p2, P3 p3, P4 p4) const { return Execute(p1, p2, p3, p4); } void ClearTrue() { Clear(); action = (Gate4Action *)1; } void ClearFalse() { Clear(); } @@ -1422,58 +609,6 @@ public: }; -template -Gate4 pteback(OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2, P3 p3, P4 p4)) { - return Gate4(new Gate4MethodActionPte(object, method)); -} - -template -Gate4 callback(OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2, P3 p3, P4 p4)) { - return Gate4(new Gate4MethodAction(object, method)); -} - -template -Gate4 callback(const OBJECT *object, bool (METHOD::*method)(P1 p1, P2 p2, P3 p3, P4 p4) const) { - return Gate4(new Gate4MethodAction(object, method)); -} - -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; -} - template Gate4& Gate4::operator=(const Gate4& c) { @@ -1495,6 +630,3 @@ Gate4::~Gate4() { Release(); } - - -#endif diff --git a/uppsrc/Core/Core.upp b/uppsrc/Core/Core.upp index 46657212f..b023f79f9 100644 --- a/uppsrc/Core/Core.upp +++ b/uppsrc/Core/Core.upp @@ -88,6 +88,11 @@ file Hash.cpp optimize_speed, Concretes readonly separator, Cbgen.h, + Callback0.h, + Callback1.h, + Callback2.h, + Callback3.h, + Callback4.h, Callback.h, Callback.cpp optimize_speed, TimeDate.h,