00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_FUNCTION_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_FUNCTION_H_
00021
00022 #include "net/instaweb/util/public/atomic_bool.h"
00023 #include "net/instaweb/util/public/basictypes.h"
00024
00025 namespace net_instaweb {
00026
00047 class Function {
00048 public:
00049 Function();
00050 virtual ~Function();
00051
00060 void set_quit_requested_pointer(AtomicBool* x) { quit_requested_ = x; }
00061
00066 bool quit_requested() const {
00067 return (quit_requested_ != NULL) && quit_requested_->value();
00068 }
00069
00073 void CallRun();
00074 void CallCancel();
00075
00080 void set_delete_after_callback(bool x) { delete_after_callback_ = x; }
00081
00085 void Reset();
00086
00087 protected:
00092 virtual void Run() = 0;
00093
00100 virtual void Cancel() {}
00101
00102 private:
00103 AtomicBool* quit_requested_;
00104 bool run_called_;
00105 bool cancel_called_;
00106 bool delete_after_callback_;
00107
00108 DISALLOW_COPY_AND_ASSIGN(Function);
00109 };
00110
00114 #define CALL_MEMBER_FN(object, ptrToMember) ((this->object)->*(ptrToMember))
00115
00118 template<class C>
00119 class MemberFunctionBase : public Function {
00120 public:
00121 typedef void (C::*CancelFunc)();
00122
00124 explicit MemberFunctionBase(C* c) : c_(c), has_cancel_(false) {}
00125
00127 MemberFunctionBase(C* c, CancelFunc cancel)
00128 : c_(c), cancel_(cancel), has_cancel_(true) {}
00129
00130 virtual void Cancel() {
00131 if (has_cancel_) {
00132 CALL_MEMBER_FN(c_, cancel_)();
00133 }
00134 }
00135
00136 protected:
00137 C* c_;
00138
00139 private:
00140 CancelFunc cancel_;
00141 bool has_cancel_;
00142 };
00143
00145 template<class C>
00146 class MemberFunction0 : public MemberFunctionBase<C> {
00147 public:
00148 typedef void (C::*Func)();
00149
00151 MemberFunction0(Func f, C* c) : MemberFunctionBase<C>(c), f_(f) {}
00152
00154 MemberFunction0(Func f,
00155 typename MemberFunctionBase<C>::CancelFunc cancel,
00156 C* c)
00157 : MemberFunctionBase<C>(c, cancel), f_(f) {}
00158
00159 protected:
00160 virtual void Run() { CALL_MEMBER_FN(c_, f_)(); }
00161
00162 private:
00163 Func f_;
00164 };
00165
00167 template<class C, typename T1>
00168 class MemberFunction1 : public MemberFunctionBase<C> {
00169 public:
00170 typedef void (C::*Func)(T1);
00171
00173 MemberFunction1(Func f, C* c, T1 v1)
00174 : MemberFunctionBase<C>(c), f_(f), v1_(v1) {}
00175
00177 MemberFunction1(Func f,
00178 typename MemberFunctionBase<C>::CancelFunc cancel,
00179 C* c, T1 v1)
00180 : MemberFunctionBase<C>(c, cancel), f_(f), v1_(v1) {}
00181
00182 protected:
00183 virtual void Run() { CALL_MEMBER_FN(c_, f_)(v1_); }
00184
00185 private:
00186 Func f_;
00187 T1 v1_;
00188 };
00189
00191 template<class C, typename T1, typename T2>
00192 class MemberFunction2 : public MemberFunctionBase<C> {
00193 public:
00194 typedef void (C::*Func)(T1, T2);
00195
00197 MemberFunction2(Func f, C* c, T1 v1, T2 v2)
00198 : MemberFunctionBase<C>(c), f_(f), v1_(v1), v2_(v2) {}
00199
00201 MemberFunction2(Func f,
00202 typename MemberFunctionBase<C>::CancelFunc cancel,
00203 C* c, T1 v1, T2 v2)
00204 : MemberFunctionBase<C>(c, cancel), f_(f), v1_(v1), v2_(v2) {}
00205
00206 protected:
00207 virtual void Run() { CALL_MEMBER_FN(c_, f_)(v1_, v2_); }
00208
00209 private:
00210 Func f_;
00211 T1 v1_;
00212 T2 v2_;
00213 };
00214
00216 template<class C, typename T1, typename T2, typename T3>
00217 class MemberFunction3 : public MemberFunctionBase<C> {
00218 public:
00219 typedef void (C::*Func)(T1, T2, T3);
00220
00222 MemberFunction3(Func f, C* c, T1 v1, T2 v2, T3 v3)
00223 : MemberFunctionBase<C>(c), f_(f), v1_(v1), v2_(v2), v3_(v3) {}
00224
00226 MemberFunction3(Func f,
00227 typename MemberFunctionBase<C>::CancelFunc cancel,
00228 C* c, T1 v1, T2 v2, T3 v3)
00229 : MemberFunctionBase<C>(c, cancel), f_(f), v1_(v1), v2_(v2), v3_(v3) {}
00230
00231 protected:
00232 virtual void Run() { CALL_MEMBER_FN(c_, f_)(v1_, v2_, v3_); }
00233
00234 private:
00235 Func f_;
00236 T1 v1_;
00237 T2 v2_;
00238 T3 v3_;
00239 };
00240
00241 #undef CALL_MEMBER_FN
00242
00244 template<class C>
00245 Function* MakeFunction(C* object, void (C::*run)()) {
00246 return new MemberFunction0<C>(run, object);
00247 }
00248
00251 template<class C>
00252 Function* MakeFunction(C* object, void (C::*run)(), void (C::*cancel)()) {
00253 return new MemberFunction0<C>(run, cancel, object);
00254 }
00255
00257 template<class C, class T>
00258 Function* MakeFunction(C* object, void (C::*run)(T), T t) {
00259 return new MemberFunction1<C, T>(run, object, t);
00260 }
00261
00264 template<class C, class T>
00265 Function* MakeFunction(C* object, void (C::*run)(T), void (C::*cancel)(), T t) {
00266 return new MemberFunction1<C, T>(run, cancel, object, t);
00267 }
00268
00270 template<class C, class T, class U>
00271 Function* MakeFunction(C* object, void (C::*run)(T, U), T t, U u) {
00272 return new MemberFunction2<C, T, U>(run, object, t, u);
00273 }
00274
00277 template<class C, class T, class U>
00278 Function* MakeFunction(C* object, void (C::*run)(T, U), void (C::*cancel)(),
00279 T t, U u) {
00280 return new MemberFunction2<C, T, U>(run, cancel, object, t, u);
00281 }
00282
00284 template<class C, class T, class U, class V>
00285 Function* MakeFunction(C* object, void (C::*run)(T, U, V),
00286 T t, U u, V v) {
00287 return new MemberFunction3<C, T, U, V>(run, object, t, u, v);
00288 }
00289
00292 template<class C, class T, class U, class V>
00293 Function* MakeFunction(C* object, void (C::*run)(T, U, V), void (C::*cancel)(),
00294 T t, U u, V v) {
00295 return new MemberFunction3<C, T, U, V>(run, cancel, object, t, u, v);
00296 }
00297
00298 }
00299
00300 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_FUNCTION_H_