00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00031
00032 #pragma once
00033
00034 #include "../System/exception.h"
00035 #include "../System/sharedptr.h"
00036
00039 class CL_Callback_Impl_v0
00040 {
00041 public:
00042 virtual ~CL_Callback_Impl_v0()
00043 {
00044 }
00045
00046 virtual void invoke() = 0;
00047 };
00048
00051 class CL_Callback_Impl_v0_static : public CL_Callback_Impl_v0
00052 {
00053 public:
00054 CL_Callback_Impl_v0_static(void (*static_func)())
00055 : static_func(static_func)
00056 {
00057 }
00058
00059 void invoke()
00060 {
00061 static_func();
00062 }
00063
00064 void (*static_func)();
00065 };
00066
00069 template <typename UserData>
00070 class CL_Callback_Impl_v0_static_user : public CL_Callback_Impl_v0
00071 {
00072 public:
00073 CL_Callback_Impl_v0_static_user(
00074 void (*static_func)(UserData), const UserData &user_data)
00075 : static_func(static_func), user_data(user_data)
00076 {
00077 }
00078
00079 void invoke()
00080 {
00081 static_func(user_data);
00082 }
00083
00084 void (*static_func)(UserData);
00085
00086 UserData user_data;
00087 };
00088
00091 template <typename InstanceClass>
00092 class CL_Callback_Impl_v0_member : public CL_Callback_Impl_v0
00093 {
00094 public:
00095 CL_Callback_Impl_v0_member(InstanceClass *instance,
00096 void (InstanceClass::*member_func)())
00097 : instance(instance), member_func(member_func)
00098 {
00099 }
00100
00101 void invoke()
00102 {
00103 (instance->*member_func)();
00104 }
00105
00106 InstanceClass *instance;
00107
00108 void (InstanceClass::*member_func)();
00109 };
00110
00113 template <typename InstanceClass, typename UserData>
00114 class CL_Callback_Impl_v0_member_user : public CL_Callback_Impl_v0
00115 {
00116 public:
00117 CL_Callback_Impl_v0_member_user(InstanceClass *instance,
00118 void (InstanceClass::*member_func)(UserData), const UserData &user_data)
00119 : instance(instance), member_func(member_func), user_data(user_data)
00120 {
00121 }
00122
00123 void invoke()
00124 {
00125 (instance->*member_func)(user_data);
00126 }
00127
00128 InstanceClass *instance;
00129
00130 void (InstanceClass::*member_func)(UserData);
00131
00132 UserData user_data;
00133 };
00134
00137 template <class Functor>
00138 class CL_Callback_Impl_v0_functor : public CL_Callback_Impl_v0
00139 {
00140 public:
00141 CL_Callback_Impl_v0_functor(Functor functor)
00142 : functor(functor)
00143 {
00144 }
00145
00146 void invoke()
00147 {
00148 functor();
00149 }
00150
00151 Functor functor;
00152 };
00153
00157 class CL_Callback_v0
00158 {
00159 public:
00160 CL_Callback_v0()
00161 {
00162 }
00163
00164 CL_Callback_v0(const CL_Callback_v0 ©)
00165 : impl(copy.impl)
00166 {
00167 }
00168
00169 CL_Callback_v0(CL_Callback_Impl_v0 *impl)
00170 : impl(impl)
00171 {
00172 }
00173
00174 CL_Callback_v0(void (*function)())
00175 : impl(new CL_Callback_Impl_v0_static(function))
00176 {
00177 }
00178
00179 template<typename UserData>
00180 CL_Callback_v0(void (*function)(UserData), const UserData &user_data)
00181 : impl(new CL_Callback_Impl_v0_static_user<UserData>(function, user_data))
00182 {
00183 }
00184
00185 template<class InstanceClass>
00186 CL_Callback_v0(InstanceClass *instance, void (InstanceClass::*function)())
00187 : impl(new CL_Callback_Impl_v0_member<InstanceClass>(instance, function))
00188 {
00189 }
00190
00191 template<class InstanceClass, typename UserData>
00192 CL_Callback_v0(InstanceClass *instance, void (InstanceClass::*function)(UserData), const UserData &user_data)
00193 : impl(new CL_Callback_Impl_v0_member_user<InstanceClass, UserData>(instance, function, user_data))
00194 {
00195 }
00196
00197 void set(void (*function)())
00198 {
00199 impl = CL_SharedPtr< CL_Callback_Impl_v0 >(new CL_Callback_Impl_v0_static(function));
00200 }
00201
00202 template<typename UserData>
00203 void set(void (*function)(UserData), const UserData &user_data)
00204 {
00205 impl = CL_SharedPtr< CL_Callback_Impl_v0 >(new CL_Callback_Impl_v0_static_user<UserData>(function, user_data));
00206 }
00207
00208 template<class InstanceClass>
00209 void set(InstanceClass *instance, void (InstanceClass::*function)())
00210 {
00211 impl = CL_SharedPtr< CL_Callback_Impl_v0 >(new CL_Callback_Impl_v0_member<InstanceClass>(instance, function));
00212 }
00213
00214 template<class InstanceClass, typename UserData>
00215 void set(InstanceClass *instance, void (InstanceClass::*function)(UserData), const UserData &user_data)
00216 {
00217 impl = CL_SharedPtr< CL_Callback_Impl_v0 >(new CL_Callback_Impl_v0_member_user<InstanceClass, UserData>(instance, function, user_data));
00218 }
00219
00220 void clear()
00221 {
00222 impl = CL_SharedPtr< CL_Callback_Impl_v0 >();
00223 }
00224
00225 void invoke()
00226 {
00227 impl->invoke();
00228 }
00229
00230 bool is_null() const
00231 {
00232 return impl.is_null();
00233 }
00234
00235 private:
00236 CL_SharedPtr< CL_Callback_Impl_v0 > impl;
00237 };
00238
00242 class CL_Callback_v0_functor : public CL_Callback_v0
00243 {
00244 public:
00245 CL_Callback_v0_functor()
00246 {
00247 }
00248
00249 CL_Callback_v0_functor(const CL_Callback_v0_functor ©)
00250 : CL_Callback_v0(copy)
00251 {
00252 }
00253
00254 template<class Functor>
00255 CL_Callback_v0_functor(Functor functor)
00256 : CL_Callback_v0(new CL_Callback_Impl_v0_functor<Functor>(functor))
00257 {
00258 }
00259
00260 };
00261
00262