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_METHODCALLBACK_H
00068 #define VRS_METHODCALLBACK_H
00069
00070 #include <vrs/callback.h>
00071
00072 namespace VRS {
00073
00078 template<class CLASS>
00079 class MethodCallback : public Callback {
00080
00081 public:
00082 typedef void (CLASS::*ConstMethod)() const;
00083
00084 MethodCallback(CLASS* obj, void (CLASS::*meth)())
00085 : obj_(obj), meth_((ConstMethod) meth) {
00086 VRS_Assertion(obj != NULL, "no object");
00087 VRS_Assertion(meth != NULL, "no method");
00088 }
00089 MethodCallback(const CLASS* obj, void (CLASS::*meth)() const)
00090 : obj_(obj), meth_(meth) {
00091 VRS_Assertion(obj != NULL, "no object");
00092 VRS_Assertion(meth != NULL, "no method");
00093 }
00100 virtual void callback() { (obj_->*meth_)(); }
00102
00103 VRS_TYPEINFO(MethodCallback, Callback);
00104
00105 private:
00106 const CLASS* obj_;
00107 void (CLASS::*meth_)() const;
00108 };
00109
00114 template<class CLASS, class RETURN>
00115 class MethodCallbackR : public CallbackR<RETURN> {
00116
00117 public:
00118 typedef RETURN (CLASS::*ConstMethod)() const;
00119
00120 MethodCallbackR(CLASS* obj, RETURN (CLASS::*meth)())
00121 : obj_(obj), meth_((ConstMethod) meth) {
00122 VRS_Assertion(obj != NULL, "no object");
00123 VRS_Assertion(meth != NULL, "no method");
00124 }
00125 MethodCallbackR(const CLASS* obj, RETURN (CLASS::*meth)() const)
00126 : obj_(obj), meth_(meth) {
00127 VRS_Assertion(obj != NULL, "no object");
00128 VRS_Assertion(meth != NULL, "no method");
00129 }
00136 virtual RETURN callback() { return (obj_->*meth_)(); }
00138
00139 VRS_TYPEINFO(MethodCallbackR, CallbackR<RETURN>);
00140
00141 private:
00142 const CLASS* obj_;
00143 RETURN (CLASS::*meth_)() const;
00144 };
00145
00150 template<class CLASS, class ARG1>
00151 class MethodCallback1 : public Callback1<ARG1> {
00152
00153 public:
00154 typedef void (CLASS::*ConstMethod)(ARG1) const;
00155
00156 MethodCallback1(CLASS* obj, void (CLASS::*meth)(ARG1))
00157 : obj_(obj), meth_((ConstMethod) meth) {
00158 VRS_Assertion(obj != NULL, "no object");
00159 VRS_Assertion(meth != NULL, "no method");
00160 }
00161 MethodCallback1(const CLASS* obj, void (CLASS::*meth)(ARG1) const)
00162 : obj_(obj), meth_(meth) {
00163 VRS_Assertion(obj != NULL, "no object");
00164 VRS_Assertion(meth != NULL, "no method");
00165 }
00172 virtual void callback(ARG1 arg1) { (obj_->*meth_)(arg1); }
00174
00175 VRS_TYPEINFO(MethodCallback1, Callback1<ARG1>);
00176
00177 private:
00178 const CLASS* obj_;
00179 void (CLASS::*meth_)(ARG1) const;
00180 };
00181
00187 template<class CLASS, class RETURN, class ARG1>
00188 class MethodCallbackR1 : public CallbackR1<RETURN, ARG1> {
00189
00190 public:
00191 typedef RETURN (CLASS::*ConstMethod)(ARG1) const;
00192
00193 MethodCallbackR1(CLASS* obj, RETURN (CLASS::*meth)(ARG1))
00194 : obj_(obj), meth_((ConstMethod) meth) {
00195 VRS_Assertion(obj != NULL, "no object");
00196 VRS_Assertion(meth != NULL, "no method");
00197 }
00198 MethodCallbackR1(const CLASS* obj, RETURN (CLASS::*meth)(ARG1) const)
00199 : obj_(obj), meth_(meth) {
00200 VRS_Assertion(obj != NULL, "no object");
00201 VRS_Assertion(meth != NULL, "no method");
00202 }
00209 virtual RETURN callback(ARG1 arg1) { return (obj_->*meth_)(arg1); }
00211
00212 VRS_TYPEINFO(MethodCallbackR1, VRS_TEMPLATE_ARGS_2(RETURN, ARG1, CallbackR1));
00213
00214 private:
00215 const CLASS* obj_;
00216 RETURN (CLASS::*meth_)(ARG1) const;
00217 };
00218
00223 template<class CLASS, class ARG1, class ARG2>
00224 class MethodCallback2 : public Callback2<ARG1, ARG2> {
00225
00226 public:
00227 typedef void (CLASS::*ConstMethod)(ARG1, ARG2) const;
00228
00229 MethodCallback2(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2))
00230 : obj_(obj), meth_((ConstMethod) meth) {
00231 VRS_Assertion(obj != NULL, "no object");
00232 VRS_Assertion(meth != NULL, "no method");
00233 }
00234 MethodCallback2(const CLASS* obj, void (CLASS::*meth)(ARG1, ARG2) const)
00235 : obj_(obj), meth_(meth) {
00236 VRS_Assertion(obj != NULL, "no object");
00237 VRS_Assertion(meth != NULL, "no method");
00238 }
00245 virtual void callback(ARG1 arg1, ARG2 arg2) { (obj_->*meth_)(arg1, arg2); }
00247
00248 VRS_TYPEINFO(MethodCallback2, VRS_TEMPLATE_ARGS_2(ARG1, ARG2, Callback2));
00249
00250 private:
00251 const CLASS* obj_;
00252 void (CLASS::*meth_)(ARG1, ARG2) const;
00253 };
00254
00260 template<class CLASS, class RETURN, class ARG1, class ARG2>
00261 class MethodCallbackR2 : public CallbackR2<RETURN, ARG1, ARG2> {
00262
00263 public:
00264 typedef RETURN (CLASS::*ConstMethod)(ARG1, ARG2) const;
00265
00266 MethodCallbackR2(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2))
00267 : obj_(obj), meth_((ConstMethod) meth) {
00268 VRS_Assertion(obj != NULL, "no object");
00269 VRS_Assertion(meth != NULL, "no method");
00270 }
00271 MethodCallbackR2(const CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2) const)
00272 : obj_(obj), meth_(meth) {
00273 VRS_Assertion(obj != NULL, "no object");
00274 VRS_Assertion(meth != NULL, "no method");
00275 }
00282 virtual RETURN callback(ARG1 arg1, ARG2 arg2) { return (obj_->*meth_)(arg1, arg2); }
00284
00285 VRS_TYPEINFO(MethodCallbackR2, VRS_TEMPLATE_ARGS_3(RETURN, ARG1, ARG2, CallbackR2));
00286
00287 private:
00288 const CLASS* obj_;
00289 RETURN (CLASS::*meth_)(ARG1, ARG2) const;
00290 };
00291
00296 template<class CLASS, class ARG1, class ARG2, class ARG3>
00297 class MethodCallback3 : public Callback3<ARG1, ARG2, ARG3> {
00298
00299 public:
00300 typedef void (CLASS::*ConstMethod)(ARG1, ARG2, ARG3) const;
00301
00302 MethodCallback3(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2, ARG3))
00303 : obj_(obj), meth_((ConstMethod) meth) {
00304 VRS_Assertion(obj != NULL, "no object");
00305 VRS_Assertion(meth != NULL, "no method");
00306 }
00307 MethodCallback3(const CLASS* obj, void (CLASS::*meth)(ARG1, ARG2, ARG3) const)
00308 : obj_(obj), meth_(meth) {
00309 VRS_Assertion(obj != NULL, "no object");
00310 VRS_Assertion(meth != NULL, "no method");
00311 }
00318 virtual void callback(ARG1 arg1, ARG2 arg2, ARG3 arg3) { (obj_->*meth_)(arg1, arg2, arg3); }
00320
00321 VRS_TYPEINFO(MethodCallback3, VRS_TEMPLATE_ARGS_3(ARG1, ARG2, ARG3, Callback3));
00322
00323 private:
00324 const CLASS* obj_;
00325 void (CLASS::*meth_)(ARG1, ARG2, ARG3) const;
00326 };
00327
00333 template<class CLASS, class RETURN, class ARG1, class ARG2, class ARG3>
00334 class MethodCallbackR3 : public CallbackR3<RETURN, ARG1, ARG2, ARG3> {
00335
00336 public:
00337 typedef RETURN (CLASS::*ConstMethod)(ARG1, ARG2, ARG3) const;
00338
00339 MethodCallbackR3(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2, ARG3))
00340 : obj_(obj), meth_((ConstMethod) meth) {
00341 VRS_Assertion(obj != NULL, "no object");
00342 VRS_Assertion(meth != NULL, "no method");
00343 }
00344 MethodCallbackR3(const CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2, ARG3) const)
00345 : obj_(obj), meth_(meth) {
00346 VRS_Assertion(obj != NULL, "no object");
00347 VRS_Assertion(meth != NULL, "no method");
00348 }
00355 virtual RETURN callback(ARG1 arg1, ARG2 arg2, ARG3 arg3) { return (obj_->*meth_)(arg1, arg2, arg3); }
00357
00358 VRS_TYPEINFO(MethodCallbackR3, VRS_TEMPLATE_ARGS_4(RETURN, ARG1, ARG2, ARG3, CallbackR3));
00359
00360 private:
00361 const CLASS* obj_;
00362 RETURN (CLASS::*meth_)(ARG1, ARG2, ARG3) const;
00363 };
00364
00369 template<class CLASS, class ARG1, class ARG2, class ARG3,class ARG4>
00370 class MethodCallback4 : public Callback4<ARG1, ARG2, ARG3,ARG4> {
00371
00372 public:
00373 typedef void (CLASS::*ConstMethod)(ARG1, ARG2, ARG3,ARG4) const;
00374
00375 MethodCallback4(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2, ARG3,ARG4))
00376 : obj_(obj), meth_((ConstMethod) meth) {
00377 VRS_Assertion(obj != NULL, "no object");
00378 VRS_Assertion(meth != NULL, "no method");
00379 }
00380 MethodCallback4(const CLASS* obj, void (CLASS::*meth)(ARG1, ARG2, ARG3,ARG4) const)
00381 : obj_(obj), meth_(meth) {
00382 VRS_Assertion(obj != NULL, "no object");
00383 VRS_Assertion(meth != NULL, "no method");
00384 }
00391 virtual void callback(ARG1 arg1, ARG2 arg2, ARG3 arg3,ARG4 arg4) { (obj_->*meth_)(arg1, arg2, arg3,arg4); }
00393
00394 VRS_TYPEINFO(MethodCallback4, VRS_TEMPLATE_ARGS_4(ARG1, ARG2, ARG3 ,ARG4, Callback4));
00395
00396 private:
00397 const CLASS* obj_;
00398 void (CLASS::*meth_)(ARG1, ARG2, ARG3,ARG4) const;
00399 };
00400
00401
00407 template<class CLASS, class RETURN, class ARG1, class ARG2, class ARG3,class ARG4>
00408 class MethodCallbackR4 : public CallbackR4<RETURN, ARG1, ARG2, ARG3,ARG4> {
00409
00410 public:
00411 typedef RETURN (CLASS::*ConstMethod)(ARG1, ARG2, ARG3,ARG4) const;
00412
00413 MethodCallbackR4(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2, ARG3,ARG4))
00414 : obj_(obj), meth_((ConstMethod) meth) {
00415 VRS_Assertion(obj != NULL, "no object");
00416 VRS_Assertion(meth != NULL, "no method");
00417 }
00418 MethodCallbackR4(const CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2, ARG3,ARG4) const)
00419 : obj_(obj), meth_(meth) {
00420 VRS_Assertion(obj != NULL, "no object");
00421 VRS_Assertion(meth != NULL, "no method");
00422 }
00429 virtual RETURN callback(ARG1 arg1, ARG2 arg2, ARG3 arg3,ARG4 arg4) { return (obj_->*meth_)(arg1, arg2, arg3,arg4); }
00431
00432 VRS_TYPEINFO(MethodCallbackR4, VRS_TEMPLATE_ARGS_5(RETURN, ARG1, ARG2, ARG3, ARG4, CallbackR4));
00433
00434 private:
00435 const CLASS* obj_;
00436 RETURN (CLASS::*meth_)(ARG1, ARG2, ARG3, ARG4) const;
00437 };
00438
00439
00440 template<class CLASS>
00441 inline Callback* makeCallback(CLASS* obj, void (CLASS::*meth)()) {
00442 return new MethodCallback<CLASS>(obj, meth);
00443 }
00444
00445 template<class CLASS>
00446 inline Callback* makeCallback(CLASS* obj, void (CLASS::*meth)() const) {
00447 return new MethodCallback<CLASS>(obj, meth);
00448 }
00449
00450 template<class CLASS, class RETURN>
00451 inline CallbackR<RETURN>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)()) {
00452 return new MethodCallbackR<CLASS, RETURN>(obj, meth);
00453 }
00454
00455 template<class CLASS, class RETURN>
00456 inline CallbackR<RETURN>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)() const) {
00457 return new MethodCallbackR<CLASS, RETURN>(obj, meth);
00458 }
00459
00460
00461 template<class CLASS, class ARG1>
00462 inline Callback1<ARG1>* makeCallback(CLASS* obj, void (CLASS::*meth)(ARG1)) {
00463 return new MethodCallback1<CLASS, ARG1>(obj, meth);
00464 }
00465
00466 template<class CLASS, class ARG1>
00467 inline Callback1<ARG1>* makeCallback(CLASS* obj, void (CLASS::*meth)(ARG1) const) {
00468 return new MethodCallback1<CLASS, ARG1>(obj, meth);
00469 }
00470
00471 template<class CLASS, class RETURN, class ARG1>
00472 inline CallbackR1<RETURN, ARG1>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)(ARG1)) {
00473 return new MethodCallbackR1<CLASS, RETURN, ARG1>(obj, meth);
00474 }
00475
00476 template<class CLASS, class RETURN, class ARG1>
00477 inline CallbackR1<RETURN, ARG1>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)(ARG1) const) {
00478 return new MethodCallbackR1<CLASS, RETURN, ARG1>(obj, meth);
00479 }
00480
00481
00482
00483 template<class CLASS, class ARG1, class ARG2>
00484 inline Callback2<ARG1, ARG2>* makeCallback(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2)) {
00485 return new MethodCallback2<CLASS, ARG1, ARG2>(obj, meth);
00486 }
00487
00488 template<class CLASS, class ARG1, class ARG2>
00489 inline Callback2<ARG1, ARG2>* makeCallback(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2) const) {
00490 return new MethodCallback2<CLASS, ARG1, ARG2>(obj, meth);
00491 }
00492
00493 template<class CLASS, class RETURN, class ARG1, class ARG2>
00494 inline CallbackR2<RETURN, ARG1, ARG2>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2)) {
00495 return new MethodCallbackR2<CLASS, RETURN, ARG1, ARG2>(obj, meth);
00496 }
00497
00498 template<class CLASS, class RETURN, class ARG1, class ARG2>
00499 inline CallbackR2<RETURN, ARG1, ARG2>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2) const) {
00500 return new MethodCallbackR2<CLASS, RETURN, ARG1, ARG2>(obj, meth);
00501 }
00502
00503
00504 template<class CLASS, class ARG1, class ARG2, class ARG3>
00505 inline Callback3<ARG1, ARG2, ARG3>* makeCallback(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2, ARG3)) {
00506 return new MethodCallback3<CLASS, ARG1, ARG2, ARG3>(obj, meth);
00507 }
00508
00509 template<class CLASS, class ARG1, class ARG2, class ARG3>
00510 inline Callback3<ARG1, ARG2, ARG3>* makeCallback(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2, ARG3) const) {
00511 return new MethodCallback3<CLASS, ARG1, ARG2, ARG3>(obj, meth);
00512 }
00513
00514 template<class CLASS, class RETURN, class ARG1, class ARG2, class ARG3>
00515 inline CallbackR3<RETURN, ARG1, ARG2, ARG3>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2, ARG3)) {
00516 return new MethodCallbackR3<CLASS, RETURN, ARG1, ARG2, ARG3>(obj, meth);
00517 }
00518
00519 template<class CLASS, class RETURN, class ARG1, class ARG2, class ARG3>
00520 inline CallbackR3<RETURN, ARG1, ARG2, ARG3>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2, ARG3) const) {
00521 return new MethodCallbackR3<CLASS, RETURN, ARG1, ARG2, ARG3>(obj, meth);
00522 }
00523
00524
00525 template<class CLASS, class ARG1, class ARG2, class ARG3,class ARG4>
00526 inline Callback4<ARG1, ARG2, ARG3, ARG4>* makeCallback(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2, ARG3, ARG4)) {
00527 return new MethodCallback4<CLASS, ARG1, ARG2, ARG3,ARG4>(obj, meth);
00528 }
00529
00530 template<class CLASS, class ARG1, class ARG2, class ARG3,class ARG4>
00531 inline Callback4<ARG1, ARG2, ARG3, ARG4>* makeCallback(CLASS* obj, void (CLASS::*meth)(ARG1, ARG2, ARG3, ARG4) const) {
00532 return new MethodCallback4<CLASS, ARG1, ARG2, ARG3, ARG4>(obj, meth);
00533 }
00534
00535 template<class CLASS, class RETURN, class ARG1, class ARG2, class ARG3, class ARG4>
00536 inline CallbackR4<RETURN, ARG1, ARG2, ARG3, ARG4>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2, ARG3, ARG4)) {
00537 return new MethodCallbackR4<CLASS, RETURN, ARG1, ARG2, ARG3, ARG4>(obj, meth);
00538 }
00539
00540 template<class CLASS, class RETURN, class ARG1, class ARG2, class ARG3, class ARG4>
00541 inline CallbackR4<RETURN, ARG1, ARG2, ARG3, ARG4>* makeCallbackWithReturn(CLASS* obj, RETURN (CLASS::*meth)(ARG1, ARG2, ARG3, ARG4) const) {
00542 return new MethodCallbackR4<CLASS, RETURN, ARG1, ARG2, ARG3, ARG4>(obj, meth);
00543 }
00544
00545
00546 }
00547
00548 #endif // VRS_METHODCALLBACK_H