00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _SG_CALLBACK_HXX
00023 #define _SG_CALLBACK_HXX
00024
00028 class SGCallback
00029 {
00030 public:
00031
00035 virtual ~SGCallback() {}
00036
00040 virtual SGCallback* clone() const = 0;
00041
00045 virtual void operator()() = 0;
00046
00047 protected:
00051 SGCallback() {}
00052
00053 private:
00054
00055 void operator=( const SGCallback& );
00056 };
00057
00061 template< typename Fun >
00062 class SGFunctionCallback : public SGCallback
00063 {
00064 public:
00068 SGFunctionCallback( const Fun& fun )
00069 : SGCallback(), f_(fun) {}
00070
00071 SGCallback* clone() const
00072 {
00073 return new SGFunctionCallback( *this );
00074 }
00075
00076 void operator()() { f_(); }
00077
00078 private:
00079
00080 SGFunctionCallback();
00081
00082 private:
00083 Fun f_;
00084 };
00085
00089 template< class ObjPtr, typename MemFn >
00090 class SGMethodCallback : public SGCallback
00091 {
00092 public:
00093
00097 SGMethodCallback( const ObjPtr& pObj, MemFn pMemFn )
00098 : SGCallback(),
00099 pObj_(pObj),
00100 pMemFn_(pMemFn)
00101 {
00102 }
00103
00107 SGCallback* clone() const
00108 {
00109 return new SGMethodCallback( *this );
00110 }
00111
00115 void operator()()
00116 {
00117 ((*pObj_).*pMemFn_)();
00118 }
00119
00120 private:
00121
00122 SGMethodCallback();
00123
00124 private:
00125 ObjPtr pObj_;
00126 MemFn pMemFn_;
00127 };
00128
00133 template< typename Fun >
00134 SGCallback*
00135 make_callback( const Fun& fun )
00136 {
00137 return new SGFunctionCallback<Fun>(fun);
00138 }
00139
00140 template< class ObjPtr, typename MemFn >
00141 SGCallback*
00142 make_callback( const ObjPtr& pObj, MemFn pMemFn )
00143 {
00144 return new SGMethodCallback<ObjPtr,MemFn>(pObj, pMemFn );
00145 }
00146
00147 #endif // _SG_CALLBACK_HXX
00148