00001
00002 #ifndef header_slot_v3
00003 #define header_slot_v3
00004
00005 #include "slot_generic.h"
00006
00008
00009
00010 template <class PARAM1, class PARAM2, class PARAM3>
00011 class CL_Slot_v3 : public CL_Slot_Generic
00012 {
00013 public:
00014 virtual void call(PARAM1 param1, PARAM2 param2, PARAM3 param3)=0;
00015 };
00016
00018
00019
00020 template <class PARAM1, class PARAM2, class PARAM3>
00021 class CL_FunctionSlot_v3 : public CL_Slot_v3<PARAM1, PARAM2, PARAM3>
00022 {
00023 public:
00024 typedef void (*Callback)(PARAM1, PARAM2, PARAM3);
00025
00026 CL_FunctionSlot_v3(Callback callback) : callback(callback) { return; }
00027
00028 virtual void call(PARAM1 param1, PARAM2 param2, PARAM3 param3) { callback(param1, param2, param3); }
00029
00030 private:
00031 Callback callback;
00032 };
00033
00034 template <class PARAM1, class PARAM2, class PARAM3>
00035 CL_Slot_v3<PARAM1, PARAM2, PARAM3> *CL_CreateSlot(void (*callback)(PARAM1, PARAM2, PARAM3))
00036 {
00037 return new CL_FunctionSlot_v3<PARAM1,PARAM2,PARAM3>(callback);
00038 }
00039
00041
00042
00043 template <class CallbackClass, class PARAM1, class PARAM2, class PARAM3>
00044 class CL_MethodSlot_v3 : public CL_Slot_v3<PARAM1, PARAM2, PARAM3>
00045 {
00046 public:
00047 typedef void (CallbackClass::*Callback)(PARAM1, PARAM2, PARAM3);
00048
00049 CL_MethodSlot_v3(CallbackClass *cb_class, Callback callback)
00050 : cb_class(cb_class), callback(callback) { return; }
00051
00052 virtual void call(PARAM1 param1, PARAM2 param2, PARAM3 param3) { (cb_class->*callback)(param1, param2, param3); }
00053
00054 private:
00055 CallbackClass *cb_class;
00056 Callback callback;
00057 };
00058
00059 template <class CallbackClass, class PARAM1, class PARAM2, class PARAM3>
00060 CL_Slot_v3<PARAM1, PARAM2, PARAM3> *CL_CreateSlot(
00061 CallbackClass *cb_class,
00062 void (CallbackClass::*callback)(PARAM1, PARAM2, PARAM3))
00063 {
00064 return new CL_MethodSlot_v3<CallbackClass, PARAM1, PARAM2, PARAM3>(cb_class, callback);
00065 }
00066
00068
00069
00070 template <class CallbackClass, class UserData, class PARAM1, class PARAM2, class PARAM3>
00071 class CL_UserDataMethodSlot_v3 : public CL_Slot_v3<PARAM1, PARAM2, PARAM3>
00072 {
00073 public:
00074 typedef void (CallbackClass::*Callback)(UserData, PARAM1, PARAM2, PARAM3);
00075
00076 CL_UserDataMethodSlot_v3(CallbackClass *cb_class, Callback callback, UserData user_data)
00077 : cb_class(cb_class), callback(callback), user_data(user_data) { return; }
00078
00079 virtual void call(PARAM1 param1, PARAM2 param2, PARAM3 param3) { (cb_class->*callback)(user_data, param1, param2, param3); }
00080
00081 private:
00082 CallbackClass *cb_class;
00083 Callback callback;
00084 UserData user_data;
00085 };
00086
00087 template <class CallbackClass, class UserData, class PARAM1, class PARAM2, class PARAM3>
00088 CL_Slot_v3<PARAM1, PARAM2, PARAM3> *CL_CreateSlot(
00089 CallbackClass *cb_class,
00090 void (CallbackClass::*callback)(UserData, PARAM1, PARAM2, PARAM3),
00091 UserData user_data)
00092 {
00093 return new CL_UserDataMethodSlot_v3<CallbackClass, UserData, PARAM1, PARAM2, PARAM3>(cb_class, callback, user_data);
00094 }
00095
00096 #endif