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 #ifndef _KOKO_CALLBACK_H_
00037 #define _KOKO_CALLBACK_H_
00038
00039 class KokoBuffer;
00040
00041 class Callback
00042 {
00043 public:
00044 inline Callback(void) {};
00045 inline Callback(const Callback &cb) {};
00046 inline ~Callback(void) {};
00047
00048
00049
00050
00051 virtual Callback *clone(void) = 0;
00052
00053
00054
00055 virtual void operator()(KokoBuffer &databuf) const = 0;
00056 };
00057
00058
00059 class Function : public Callback
00060 {
00061 public:
00062
00063 inline Function(const Function &fobj)
00064 {
00065 fp = fobj.fp;
00066 };
00067
00068 inline Function(void (*funcp)(KokoBuffer &databuf))
00069 {
00070 fp = funcp;
00071 };
00072
00073 inline ~Function(void)
00074 {
00075 fp = 0;
00076 };
00077
00078
00079 inline virtual Callback *clone(void)
00080 { return new Function(*this); };
00081
00082
00083 void operator()(KokoBuffer &databuf) const
00084 {
00085 if (fp) {
00086 (*fp)(databuf);
00087 }
00088 };
00089
00090 protected:
00091 void (*fp)(KokoBuffer
00092 &databuf);
00093 };
00094
00095
00096 template <class ObjType>
00097 class Method : public Callback
00098 {
00099 public:
00100
00101 inline Method(const Method &meth)
00102 {
00103 obj = meth.obj;
00104 mfp = meth.mfp;
00105 };
00106
00107 inline Method(ObjType &inobj, void (ObjType::* meth)(KokoBuffer &databuf))
00108 {
00109 obj = &inobj;
00110 mfp = meth;
00111 };
00112
00113 inline Method(ObjType *inobj, void (ObjType::* meth)(KokoBuffer &databuf))
00114 {
00115 obj = inobj;
00116 mfp = meth;
00117 };
00118
00119 inline ~Method(void)
00120 {
00121 obj = 0;
00122 mfp = 0;
00123 };
00124
00125 inline virtual Callback *clone(void)
00126 { return new Method(*this); };
00127
00128
00129 void operator()(KokoBuffer &databuf) const
00130 {
00131 if (obj && mfp) {
00132 (obj->*mfp)(databuf);
00133 }
00134 };
00135
00136 private:
00137 ObjType *obj;
00138 void (ObjType::* mfp)(KokoBuffer &databuf);
00139 };
00140
00141 #endif