X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FDispatch.hh;h=e357f0263e65d33aac5ec81972f9437e22abf0a5;hp=fd328fe37d733a49dba95f84176a68f279923e99;hb=c78934a448d0126709fccec3d5a636b3baa87da4;hpb=837bae9f2bf7b25e1d3d2625eeaf39c1d2f48827 diff --git a/src/Moof/Dispatch.hh b/src/Moof/Dispatch.hh index fd328fe..e357f02 100644 --- a/src/Moof/Dispatch.hh +++ b/src/Moof/Dispatch.hh @@ -17,6 +17,7 @@ #include #include #include +#include namespace Mf { @@ -31,47 +32,40 @@ class Dispatch class Impl; boost::shared_ptr mImpl; - void removeHandler(unsigned id); + void removeTarget(unsigned id); -public: - - /** - * Interface for a notification class. - */ - - class Message - { - public: - virtual ~Message() {}; - }; +public: - class Handler + class Handle { public: - Handler() : - mDispatch(0), + Handle() : mId(0) {} - Handler(Impl* dispatch, unsigned id) : + Handle(boost::weak_ptr dispatch, unsigned id) : mDispatch(dispatch), mId(id) {} - Handler(const Handler& handler) : - mDispatch(handler.mDispatch), - mId(handler.mId) + Handle(const Handle& handle) : + mDispatch(handle.mDispatch), + mId(handle.mId) { - handler.mId = 0; + handle.mId = 0; } - ~Handler(); + ~Handle() + { + clear(); + } - Handler& operator = (const Handler& handler) + Handle& operator = (const Handle& handle) { - mDispatch = handler.mDispatch; - mId = handler.mId; - handler.mId = 0; + clear(); + mDispatch = handle.mDispatch; + mId = handle.mId; + handle.mId = 0; return *this; } @@ -79,24 +73,27 @@ public: { return mId; } + + void clear(); private: - Impl* mDispatch; - mutable unsigned mId; - + boost::weak_ptr mDispatch; + mutable unsigned mId; }; - typedef boost::function Function; + typedef boost::function Function; Dispatch(); - Handler addHandler(const std::string& event, const Function& callback); - Handler addHandler(const std::string& event, const Function& callback, - Handler handler); + Handle addTarget(const std::string& event, const Function& callback); + Handle addTarget(const std::string& event, const Function& callback, + Handle handle); + + void dispatch(const std::string& event); - void dispatch(const std::string& event, const Message* message = 0); + static Dispatch& global(); };