#ifndef EVENT_TYPED_PAIR_CALLBACK_H #define EVENT_TYPED_PAIR_CALLBACK_H #include /* * XXX * Feels like I can get std::pair and some sort * of application template to do the heavy lifting * here to avoid duplication of TypedCallback. */ template class TypedPairCallback : public CallbackBase { bool have_param_; std::pair param_; protected: TypedPairCallback(CallbackScheduler *scheduler) : CallbackBase(scheduler), have_param_(false), param_() { } public: virtual ~TypedPairCallback() { } protected: virtual void operator() (Ta, Tb) = 0; public: void execute(void) { ASSERT("/typed/pair/callback", have_param_); (*this)(param_.first, param_.second); } void param(Ta a, Tb b) { param_ = typename std::pair(a, b); have_param_ = true; } }; template class ObjectTypedPairCallback : public TypedPairCallback { public: typedef void (C::*const method_t)(Ta, Tb); private: C *const obj_; method_t method_; public: template ObjectTypedPairCallback(CallbackScheduler *scheduler, C *obj, Tm method) : TypedPairCallback(scheduler), obj_(obj), method_(method) { } ~ObjectTypedPairCallback() { } private: void operator() (Ta a, Tb b) { (obj_->*method_)(a, b); } }; template class ObjectTypedPairArgCallback : public TypedPairCallback { public: typedef void (C::*const method_t)(Ta, Tb, A); private: C *const obj_; method_t method_; A arg_; public: template ObjectTypedPairArgCallback(CallbackScheduler *scheduler, C *obj, Tm method, A arg) : TypedPairCallback(scheduler), obj_(obj), method_(method), arg_(arg) { } ~ObjectTypedPairArgCallback() { } private: void operator() (Ta a, Tb b) { (obj_->*method_)(a, b, arg_); } }; template TypedPairCallback *callback(C *obj, void (C::*const method)(Ta, Tb)) { TypedPairCallback *cb = new ObjectTypedPairCallback(NULL, obj, method); return (cb); } template TypedPairCallback *callback(C *obj, void (C::*const method)(Ta, Tb, A), A arg) { TypedPairCallback *cb = new ObjectTypedPairArgCallback(NULL, obj, method, arg); return (cb); } template TypedPairCallback *callback(CallbackScheduler *scheduler, C *obj, void (C::*const method)(Ta, Tb)) { TypedPairCallback *cb = new ObjectTypedPairCallback(scheduler, obj, method); return (cb); } template TypedPairCallback *callback(CallbackScheduler *scheduler, C *obj, void (C::*const method)(Ta, Tb, A), A arg) { TypedPairCallback *cb = new ObjectTypedPairArgCallback(scheduler, obj, method, arg); return (cb); } #endif /* !EVENT_TYPED_PAIR_CALLBACK_H */