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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 #ifndef VRS_FUNCTIONCALLBACK_H
00068 #define VRS_FUNCTIONCALLBACK_H
00069
00070 #include <vrs/callback.h>
00071
00072 namespace VRS {
00073
00077 class VRS_CORE_API FunctionCallback : public Callback {
00078
00079 public:
00080
00081 FunctionCallback(void (*func)())
00082 : func_(func) { VRS_Assertion(func, "no function"); }
00086 virtual void callback() { (*func_)(); }
00088
00089 VRS_TYPEINFO(FunctionCallback, Callback);
00090
00091 private:
00092 void (*func_)();
00093 };
00094
00098 template<class RETURN>
00099 class FunctionCallbackR : public CallbackR<RETURN> {
00100
00101 public:
00102
00103 FunctionCallbackR(RETURN (*func)())
00104 : func_(func) { VRS_Assertion(func, "no function"); }
00108 virtual RETURN callback() { return (*func_)(); }
00110
00111 VRS_TYPEINFO(FunctionCallbackR, CallbackR<RETURN>);
00112
00113 private:
00114 RETURN (*func_)();
00115 };
00116
00120 template<class ARG1>
00121 class FunctionCallback1 : public Callback1<ARG1> {
00122
00123 public:
00124
00125 FunctionCallback1(void (*func)(ARG1))
00126 : func_(func) { VRS_Assertion(func, "no function"); }
00130 virtual void callback(ARG1 arg1) { (*func_)(arg1); }
00132
00133 VRS_TYPEINFO(FunctionCallback1, Callback1<ARG1>);
00134
00135 private:
00136 void (*func_)(ARG1);
00137 };
00138
00142 template<class RETURN, class ARG1>
00143 class FunctionCallbackR1 : public CallbackR1<RETURN, ARG1> {
00144
00145 public:
00146
00147 FunctionCallbackR1(RETURN (*func)(ARG1))
00148 : func_(func) { VRS_Assertion(func, "no function"); }
00152 virtual RETURN callback(ARG1 arg1) { return (*func_)(arg1); }
00154
00155 VRS_TYPEINFO(FunctionCallbackR1, VRS_TEMPLATE_ARGS_2(RETURN, ARG1, CallbackR1));
00156
00157 private:
00158 RETURN (*func_)(ARG1);
00159 };
00160
00164 template<class ARG1, class ARG2>
00165 class FunctionCallback2 : public Callback2<ARG1, ARG2> {
00166
00167 public:
00168
00169 FunctionCallback2(void (*func)(ARG1, ARG2))
00170 : func_(func) { VRS_Assertion(func, "no function"); }
00174 virtual void callback(ARG1 arg1, ARG2 arg2) { (*func_)(arg1, arg2); }
00176
00177 VRS_TYPEINFO(FunctionCallback2, VRS_TEMPLATE_ARGS_2(ARG1, ARG2, Callback2));
00178
00179 private:
00180 void (*func_)(ARG1, ARG2);
00181 };
00182
00186 template<class RETURN, class ARG1, class ARG2>
00187 class FunctionCallbackR2 : public CallbackR2<RETURN, ARG1, ARG2> {
00188
00189 public:
00190
00191 FunctionCallbackR2(RETURN (*func)(ARG1, ARG2))
00192 : func_(func) { VRS_Assertion(func, "no function"); }
00196 virtual RETURN callback(ARG1 arg1, ARG2 arg2) { return (*func_)(arg1, arg2); }
00198
00199 VRS_TYPEINFO(FunctionCallbackR2, VRS_TEMPLATE_ARGS_3(RETURN, ARG1, ARG2, CallbackR2));
00200
00201 private:
00202 RETURN (*func_)(ARG1, ARG2);
00203 };
00204
00208 template<class ARG1, class ARG2, class ARG3>
00209 class FunctionCallback3 : public Callback3<ARG1, ARG2, ARG3> {
00210
00211 public:
00212
00213 FunctionCallback3(void (*func)(ARG1, ARG2, ARG3))
00214 : func_(func) { VRS_Assertion(func, "no function"); }
00218 virtual void callback(ARG1 arg1, ARG2 arg2, ARG3 arg3) { (*func_)(arg1, arg2, arg3); }
00220
00221 VRS_TYPEINFO(FunctionCallback3, VRS_TEMPLATE_ARGS_3(ARG1, ARG2, ARG3, Callback3));
00222
00223 private:
00224 void (*func_)(ARG1, ARG2, ARG3);
00225 };
00226
00230 template<class RETURN, class ARG1, class ARG2, class ARG3>
00231 class FunctionCallbackR3 : public CallbackR3<RETURN, ARG1, ARG2, ARG3> {
00232
00233 public:
00234
00235 FunctionCallbackR3(RETURN (*func)(ARG1, ARG2, ARG3))
00236 : func_(func) { VRS_Assertion(func, "no function"); }
00240 virtual RETURN callback(ARG1 arg1, ARG2 arg2, ARG3 arg3) { return (*func_)(arg1, arg2, arg3); }
00242
00243 VRS_TYPEINFO(FunctionCallbackR3, VRS_TEMPLATE_ARGS_4(RETURN, ARG1, ARG2, ARG3, CallbackR3));
00244
00245 private:
00246 RETURN (*func_)(ARG1, ARG2, ARG3);
00247 };
00248
00249
00253 template<class ARG1, class ARG2, class ARG3, class ARG4>
00254 class FunctionCallback4 : public Callback4<ARG1, ARG2, ARG3, ARG4> {
00255
00256 public:
00257
00258 FunctionCallback4(void (*func)(ARG1, ARG2, ARG3, ARG4))
00259 : func_(func) { VRS_Assertion(func, "no function"); }
00263 virtual void callback(ARG1 arg1, ARG2 arg2, ARG3 arg3, ARG4 arg4) { (*func_)(arg1, arg2, arg3, arg4); }
00265
00266 VRS_TYPEINFO(FunctionCallback4, VRS_TEMPLATE_ARGS_4(ARG1, ARG2, ARG3, ARG4, Callback4));
00267
00268 private:
00269 void (*func_)(ARG1, ARG2, ARG3, ARG4);
00270 };
00271
00275 template<class RETURN, class ARG1, class ARG2, class ARG3, class ARG4>
00276 class FunctionCallbackR4 : public CallbackR4<RETURN, ARG1, ARG2, ARG3,ARG4> {
00277
00278 public:
00279
00280 FunctionCallbackR4(RETURN (*func)(ARG1, ARG2, ARG3, ARG4))
00281 : func_(func) { VRS_Assertion(func, "no function"); }
00285 virtual RETURN callback(ARG1 arg1, ARG2 arg2, ARG3 arg3, ARG4 arg4) { return (*func_)(arg1, arg2, arg3, arg4); }
00287
00288 VRS_TYPEINFO(FunctionCallbackR4, VRS_TEMPLATE_ARGS_5(RETURN, ARG1, ARG2, ARG3, ARG4, CallbackR4));
00289
00290 private:
00291 RETURN (*func_)(ARG1, ARG2, ARG3,ARG4);
00292 };
00293
00294 inline Callback* makeCallback(void (*func)()) {
00295 return new FunctionCallback(func);
00296 }
00297
00298 template<class RETURN>
00299 inline CallbackR<RETURN>* makeCallbackWithReturn(RETURN (*func)()) {
00300 return new FunctionCallbackR<RETURN>(func);
00301 }
00302
00303 template<class ARG1>
00304 inline Callback1<ARG1>* makeCallback(void (*func)(ARG1)) {
00305 return new FunctionCallback1<ARG1>(func);
00306 }
00307
00308 template<class RETURN, class ARG1>
00309 inline CallbackR1<RETURN, ARG1>* makeCallbackWithReturn(RETURN (*func)(ARG1)) {
00310 return new FunctionCallbackR1<RETURN, ARG1>(func);
00311 }
00312
00313 template<class ARG1, class ARG2>
00314 inline Callback2<ARG1, ARG2>* makeCallback(void (*func)(ARG1, ARG2)) {
00315 return new FunctionCallback2<ARG1, ARG2>(func);
00316 }
00317
00318 template<class RETURN, class ARG1, class ARG2>
00319 inline CallbackR2<RETURN, ARG1, ARG2>* makeCallbackWithReturn(RETURN (*func)(ARG1, ARG2)) {
00320 return new FunctionCallbackR2<RETURN, ARG1, ARG2>(func);
00321 }
00322
00323 template<class ARG1, class ARG2, class ARG3>
00324 inline Callback3<ARG1, ARG2, ARG3>* makeCallback(void (*func)(ARG1, ARG2, ARG3)) {
00325 return new FunctionCallback3<ARG1, ARG2, ARG3>(func);
00326 }
00327
00328 template<class RETURN, class ARG1, class ARG2, class ARG3>
00329 inline CallbackR3<RETURN, ARG1, ARG2, ARG3>* makeCallbackWithReturn(RETURN (*func)(ARG1, ARG2, ARG3)) {
00330 return new FunctionCallbackR3<RETURN, ARG1, ARG2, ARG3>(func);
00331 }
00332
00333 template<class ARG1, class ARG2, class ARG3, class ARG4>
00334 inline Callback4<ARG1, ARG2, ARG3, ARG4>* makeCallback(void (*func)(ARG1, ARG2, ARG3, ARG4)) {
00335 return new FunctionCallback4<ARG1, ARG2, ARG3,ARG4>(func);
00336 }
00337
00338 template<class RETURN, class ARG1, class ARG2, class ARG3, class ARG4>
00339 inline CallbackR4<RETURN, ARG1, ARG2, ARG3, ARG4>* makeCallbackWithReturn(RETURN (*func)(ARG1, ARG2, ARG3, ARG4)) {
00340 return new FunctionCallbackR4<RETURN, ARG1, ARG2, ARG3, ARG4>(func);
00341 }
00342
00343
00344 }
00345
00346 #endif // VRS_FUNCTIONCALLBACK_H