X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FDispatch.cc;h=83fecae279fac9b336928531fa0b4c67a885d326;hp=52f28f88327e2591378819308cb3a832c44e1512;hb=e0c0a3b5e7337cde55e520801d2e59e03dc97d9c;hpb=ed5fcf5f1357fc42749408f705e9ec55531ff006 diff --git a/src/Moof/Dispatch.cc b/src/Moof/Dispatch.cc index 52f28f8..83fecae 100644 --- a/src/Moof/Dispatch.cc +++ b/src/Moof/Dispatch.cc @@ -21,46 +21,45 @@ class Dispatch::Impl { public: - Impl() : + Impl(Dispatch* dispatch) : + mDispatch(dispatch), mId(0) {} - Dispatch::Handler getNewHandler() + Dispatch::Handle getNewHandle() { ++mId; - //return Dispatch::Handler(this, mId); - Dispatch::Handler handler(this, mId); - return handler; + Dispatch::Handle handle(mDispatch->mImpl, mId); + return handle; } typedef std::pair Callback; typedef std::multimap CallbackLookup; - typedef CallbackLookup::iterator CallbackIter; + typedef CallbackLookup::iterator CallbackIt; - typedef std::multimap HandlerLookup; - typedef HandlerLookup::iterator HandlerIter; + typedef std::multimap HandleLookup; + typedef HandleLookup::iterator HandleIt; - inline Handler addHandler(const std::string& event, - const Function& callback, Handler handler) + inline Handle addTarget(const std::string& event, + const Function& callback, Handle handle) { mCallbacks.insert(std::make_pair(event, - std::make_pair(handler.getId(), callback))); - mHandlers.insert(std::make_pair(handler.getId(), event)); + std::make_pair(handle.getId(), callback))); + mHandles.insert(std::make_pair(handle.getId(), event)); - return handler; + return handle; } - inline void removeHandler(unsigned id) + inline void removeTarget(unsigned id) { - std::pair - matching(mHandlers.equal_range(id)); + std::pair matching(mHandles.equal_range(id)); - for (HandlerIter it = matching.first; it != matching.second; ++it) + for (HandleIt it = matching.first; it != matching.second; ++it) { - CallbackIter first = mCallbacks.find((*it).second); - CallbackIter last = mCallbacks.end(); + CallbackIt first = mCallbacks.find((*it).second); + CallbackIt last = mCallbacks.end(); - for (CallbackIter jt = first; jt != last; ++jt) + for (CallbackIt jt = first; jt != last; ++jt) { if ((*jt).second.first == id) { @@ -70,16 +69,15 @@ public: } } - mHandlers.erase(id); + mHandles.erase(id); } void dispatch(const std::string& event, const Message* message) { - std::pair + std::pair callbacks(mCallbacks.equal_range(event)); - for (CallbackIter it = callbacks.first; it != callbacks.second; - ++it) + for (CallbackIt it = callbacks.first; it != callbacks.second; ++it) { Function callback = (*it).second.second; callback(message); @@ -87,45 +85,49 @@ public: } + Dispatch* mDispatch; + unsigned mId; CallbackLookup mCallbacks; - HandlerLookup mHandlers; + HandleLookup mHandles; }; -Dispatch::Handler::~Handler() +void Dispatch::Handle::clear() { - if (mId) + boost::shared_ptr dispatch; + if (mId && (dispatch = mDispatch.lock())) { - mDispatch->removeHandler(mId); + dispatch->removeTarget(mId); + mId = 0; } } Dispatch::Dispatch() : - mImpl(new Dispatch::Impl) {} + mImpl(new Dispatch::Impl(this)) {} -Dispatch::Handler Dispatch::addHandler(const std::string& event, - const Function& callback) +Dispatch::Handle Dispatch::addTarget(const std::string& event, + const Function& callback) { - return addHandler(event, callback, mImpl->getNewHandler()); + return addTarget(event, callback, mImpl->getNewHandle()); } -Dispatch::Handler Dispatch::addHandler(const std::string& event, - const Function& callback, - Handler handler) +Dispatch::Handle Dispatch::addTarget(const std::string& event, + const Function& callback, + Handle handle) { // pass through - return mImpl->addHandler(event, callback, handler); + return mImpl->addTarget(event, callback, handle); } -void Dispatch::removeHandler(unsigned id) +void Dispatch::removeTarget(unsigned id) { // pass through - return mImpl->removeHandler(id); + return mImpl->removeTarget(id); } @@ -136,5 +138,12 @@ void Dispatch::dispatch(const std::string& event, const Message* message) } +Dispatch& Dispatch::global() +{ + static Dispatch dispatch; + return dispatch; +} + + } // namespace Mf