#ifndef EVENT_TYPED_CALLBACK_H #define EVENT_TYPED_CALLBACK_H #include template class TypedCallback : public CallbackBase { bool have_param_; T param_; protected: TypedCallback(CallbackScheduler *scheduler) : CallbackBase(scheduler), have_param_(false), param_() { } public: virtual ~TypedCallback() { } protected: virtual void operator() (T) = 0; public: void execute(void) { ASSERT("/typed/callback", have_param_); (*this)(param_); } void param(T p) { param_ = p; have_param_ = true; } }; template class ObjectTypedCallback : public TypedCallback { public: typedef void (C::*const method_t)(T); private: C *const obj_; method_t method_; public: template ObjectTypedCallback(CallbackScheduler *scheduler, C *obj, Tm method) : TypedCallback(scheduler), obj_(obj), method_(method) { } ~ObjectTypedCallback() { } private: void operator() (T p) { (obj_->*method_)(p); } }; template class ObjectTypedArgCallback : public TypedCallback { public: typedef void (C::*const method_t)(T, A); private: C *const obj_; method_t method_; A arg_; public: template ObjectTypedArgCallback(CallbackScheduler *scheduler, C *obj, Tm method, A arg) : TypedCallback(scheduler), obj_(obj), method_(method), arg_(arg) { } ~ObjectTypedArgCallback() { } private: void operator() (T p) { (obj_->*method_)(p, arg_); } }; template TypedCallback *callback(C *obj, void (C::*const method)(T)) { TypedCallback *cb = new ObjectTypedCallback(NULL, obj, method); return (cb); } template TypedCallback *callback(C *obj, void (C::*const method)(T, A), A arg) { TypedCallback *cb = new ObjectTypedArgCallback(NULL, obj, method, arg); return (cb); } template TypedCallback *callback(CallbackScheduler *scheduler, C *obj, void (C::*const method)(T)) { TypedCallback *cb = new ObjectTypedCallback(scheduler, obj, method); return (cb); } template TypedCallback *callback(CallbackScheduler *scheduler, C *obj, void (C::*const method)(T, A), A arg) { TypedCallback *cb = new ObjectTypedArgCallback(scheduler, obj, method, arg); return (cb); } #endif /* !EVENT_TYPED_CALLBACK_H */