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 template <typename RetVal>
00040 class CL_Callback_Impl_0
00041 {
00042 public:
00043 virtual ~CL_Callback_Impl_0()
00044 {
00045 }
00046
00047 virtual RetVal invoke() = 0;
00048 };
00049
00052 template <typename RetVal>
00053 class CL_Callback_Impl_0_static : public CL_Callback_Impl_0<RetVal>
00054 {
00055 public:
00056 CL_Callback_Impl_0_static(RetVal (*static_func)())
00057 : static_func(static_func)
00058 {
00059 }
00060
00061 RetVal invoke()
00062 {
00063 return static_func();
00064 }
00065
00066 RetVal (*static_func)();
00067 };
00068
00071 template <typename RetVal, typename UserData>
00072 class CL_Callback_Impl_0_static_user : public CL_Callback_Impl_0<RetVal>
00073 {
00074 public:
00075 CL_Callback_Impl_0_static_user(
00076 RetVal (*static_func)(UserData), const UserData &user_data)
00077 : static_func(static_func), user_data(user_data)
00078 {
00079 }
00080
00081 RetVal invoke()
00082 {
00083 return static_func(user_data);
00084 }
00085
00086 RetVal (*static_func)(UserData);
00087
00088 UserData user_data;
00089 };
00090
00093 template <typename RetVal, typename InstanceClass>
00094 class CL_Callback_Impl_0_member : public CL_Callback_Impl_0<RetVal>
00095 {
00096 public:
00097 CL_Callback_Impl_0_member(InstanceClass *instance,
00098 RetVal (InstanceClass::*member_func)())
00099 : instance(instance), member_func(member_func)
00100 {
00101 }
00102
00103 RetVal invoke()
00104 {
00105 return (instance->*member_func)();
00106 }
00107
00108 InstanceClass *instance;
00109
00110 RetVal (InstanceClass::*member_func)();
00111 };
00112
00115 template <typename RetVal, typename InstanceClass, typename UserData>
00116 class CL_Callback_Impl_0_member_user : public CL_Callback_Impl_0<RetVal>
00117 {
00118 public:
00119 CL_Callback_Impl_0_member_user(InstanceClass *instance,
00120 RetVal (InstanceClass::*member_func)(UserData), const UserData &user_data)
00121 : instance(instance), member_func(member_func), user_data(user_data)
00122 {
00123 }
00124
00125 RetVal invoke()
00126 {
00127 return (instance->*member_func)(user_data);
00128 }
00129
00130 InstanceClass *instance;
00131
00132 RetVal (InstanceClass::*member_func)(UserData);
00133
00134 UserData user_data;
00135 };
00136
00139 template <typename RetVal, class Functor>
00140 class CL_Callback_Impl_0_functor : public CL_Callback_Impl_0<RetVal>
00141 {
00142 public:
00143 CL_Callback_Impl_0_functor(Functor functor)
00144 : functor(functor)
00145 {
00146 }
00147
00148 RetVal invoke()
00149 {
00150 return functor();
00151 }
00152
00153 Functor functor;
00154 };
00155
00159 template <typename RetVal>
00160 class CL_Callback_0
00161 {
00162 public:
00163 CL_Callback_0()
00164 {
00165 }
00166
00167 CL_Callback_0(const CL_Callback_0 ©)
00168 : impl(copy.impl)
00169 {
00170 }
00171
00172 CL_Callback_0(CL_Callback_Impl_0<RetVal> *impl)
00173 : impl(impl)
00174 {
00175 }
00176
00177 CL_Callback_0(RetVal (*function)())
00178 : impl(new CL_Callback_Impl_0_static<RetVal>(function))
00179 {
00180 }
00181
00182 template<typename UserData>
00183 CL_Callback_0(RetVal (*function)(UserData), const UserData &user_data)
00184 : impl(new CL_Callback_Impl_0_static_user<RetVal, UserData>(function, user_data))
00185 {
00186 }
00187
00188 template<class InstanceClass>
00189 CL_Callback_0(InstanceClass *instance, RetVal (InstanceClass::*function)())
00190 : impl(new CL_Callback_Impl_0_member<RetVal, InstanceClass>(instance, function))
00191 {
00192 }
00193
00194 template<class InstanceClass, typename UserData>
00195 CL_Callback_0(InstanceClass *instance, RetVal (InstanceClass::*function)(UserData), const UserData &user_data)
00196 : impl(new CL_Callback_Impl_0_member_user<RetVal, InstanceClass, UserData>(instance, function, user_data))
00197 {
00198 }
00199
00200 void set(RetVal (*function)())
00201 {
00202 impl = CL_SharedPtr< CL_Callback_Impl_0<RetVal> >(new CL_Callback_Impl_0_static<RetVal>(function));
00203 }
00204
00205 template<typename UserData>
00206 void set(RetVal (*function)(UserData), const UserData &user_data)
00207 {
00208 impl = CL_SharedPtr< CL_Callback_Impl_0<RetVal> >(new CL_Callback_Impl_0_static_user<RetVal, UserData>(function, user_data));
00209 }
00210
00211 template<class InstanceClass>
00212 void set(InstanceClass *instance, RetVal (InstanceClass::*function)())
00213 {
00214 impl = CL_SharedPtr< CL_Callback_Impl_0<RetVal> >(new CL_Callback_Impl_0_member<RetVal, InstanceClass>(instance, function));
00215 }
00216
00217 template<class InstanceClass, typename UserData>
00218 void set(InstanceClass *instance, RetVal (InstanceClass::*function)(UserData), const UserData &user_data)
00219 {
00220 impl = CL_SharedPtr< CL_Callback_Impl_0<RetVal> >(new CL_Callback_Impl_0_member_user<RetVal, InstanceClass, UserData>(instance, function, user_data));
00221 }
00222
00223 void clear()
00224 {
00225 impl = CL_SharedPtr< CL_Callback_Impl_0<RetVal> >();
00226 }
00227
00228 RetVal invoke()
00229 {
00230 return impl->invoke();
00231 }
00232
00233 bool is_null() const
00234 {
00235 return impl.is_null();
00236 }
00237
00238 private:
00239 CL_SharedPtr< CL_Callback_Impl_0<RetVal> > impl;
00240 };
00241
00245 template <typename RetVal>
00246 class CL_Callback_0_functor : public CL_Callback_0<RetVal>
00247 {
00248 public:
00249 CL_Callback_0_functor()
00250 {
00251 }
00252
00253 CL_Callback_0_functor(const CL_Callback_0_functor ©)
00254 : CL_Callback_0<RetVal>(copy)
00255 {
00256 }
00257
00258 template<class Functor>
00259 CL_Callback_0_functor(Functor functor)
00260 : CL_Callback_0<RetVal>(new CL_Callback_Impl_0_functor<RetVal, Functor>(functor))
00261 {
00262 }
00263
00264 };
00265
00266