enum _CNULL { CNULL }; 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 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 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 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 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 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)); } #define THISBACK(x) callback(this, &CLASSNAME::x) #define THISBACK1(x, arg) callback1(this, &CLASSNAME::x, arg) #define THISBACK2(m, a, b) callback2(this, &CLASSNAME::m, a, b) #define THISBACK3(m, a, b, c) callback3(this, &CLASSNAME::m, a, b, c) #define THISBACK4(m, a, b, c, d) callback4(this, &CLASSNAME::m, a, b, c, d) #define PTEBACK(x) pteback(this, &CLASSNAME::x) #define PTEBACK1(x, arg) pteback1(this, &CLASSNAME::x, arg) #define PTEBACK2(m, a, b) pteback2(this, &CLASSNAME::m, a, b) #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) template class CallbackArgTarget { T result; void SetResult(const T& value) { result = value; } public: typedef CallbackArgTarget CLASSNAME; operator const T&() { return result; } bool IsNullInstance() const { return IsNull(result); } Callback operator[](const T& value) { return THISBACK1(SetResult, value); } CallbackArgTarget() { result = Null; } };