From e48df894cf15373ee57bd9f48f1d021b5ac2e96a Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 23 May 2014 23:31:24 +0200 Subject: [PATCH] Better events --- src/EventBroker.cpp | 46 ++++++++++++++++++++++----------------------- src/EventBroker.h | 31 ++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/src/EventBroker.cpp b/src/EventBroker.cpp index 29ce53c..118eddf 100644 --- a/src/EventBroker.cpp +++ b/src/EventBroker.cpp @@ -12,50 +12,50 @@ BaseEventRelay::~BaseEventRelay() void EventBroker::Unsubscribe(BaseEventRelay &relay) // ? { - /*auto itpair = m_Subscribers.equal_range(relay.m_EventTypeName); + auto contextIt = m_ContextRelays.find(relay.m_ContextTypeName); + if (contextIt == m_ContextRelays.end()) + return; + + auto eventRelays = contextIt->second; + + auto itpair = eventRelays.equal_range(relay.m_EventTypeName); for (auto it = itpair.first; it != itpair.second; ++it) { - if (it->second == &relay) - { - m_Subscribers.erase(it); - break; + if (it->second == &relay) + { + eventRelays.erase(it); + break; + } } - }*/ } void EventBroker::Subscribe(BaseEventRelay &relay) { relay.m_Broker = this; - m_ContextSubscribers[relay.m_ContextTypeName][relay.m_EventTypeName] = &relay; + m_ContextRelays[relay.m_ContextTypeName].insert(std::make_pair(relay.m_EventTypeName, &relay)); } int EventBroker::Process(std::string contextTypeName) { - auto it = m_ContextSubscribers.find(contextTypeName); - if (it == m_ContextSubscribers.end()) + auto it = m_ContextRelays.find(contextTypeName); + if (it == m_ContextRelays.end()) return 0; - int eventsProcessed = 0; - EventRelays_t &relays = it->second; + + int eventsProcessed = 0; for (auto &pair : *m_EventQueueRead) { std::string &eventTypeName = pair.first; std::shared_ptr event = pair.second; - /*if (eventTypeName == "struct Events::BindKey") + auto itpair = relays.equal_range(eventTypeName); + for (auto it2 = itpair.first; it2 != itpair.second; ++it2) { - auto bindKey = static_cast(event.get()); - LOG_DEBUG("HsssEJ"); - }*/ - - auto it2 = relays.find(eventTypeName); - if (it2 == relays.end()) - continue; - - auto relay = it2->second; - relay->Receive(event); - eventsProcessed++; + auto relay = it2->second; + relay->Receive(event); + eventsProcessed++; + } } return eventsProcessed; diff --git a/src/EventBroker.h b/src/EventBroker.h index cfd430c..e29437a 100644 --- a/src/EventBroker.h +++ b/src/EventBroker.h @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -30,7 +31,7 @@ protected: ~BaseEventRelay(); public: - virtual bool Receive(std::shared_ptr event) = 0; + virtual bool Receive(const std::shared_ptr event) = 0; protected: std::string m_ContextTypeName; @@ -52,18 +53,18 @@ public: , BaseEventRelay(typeid(ContextType).name(), typeid(EventType).name()) { } protected: - bool Receive(std::shared_ptr event) override; + bool Receive(const std::shared_ptr event) override; private: CallbackType m_Callback; }; template -bool EventRelay::Receive(std::shared_ptr event) +bool EventRelay::Receive(const std::shared_ptr event) { if (m_Callback != nullptr) { - return m_Callback(static_cast(*event.get())); + return m_Callback(*static_cast(event.get())); } else { @@ -99,21 +100,22 @@ public: int Process(std::string contextTypeName); void Clear(); void Unsubscribe(BaseEventRelay &relay); + template + void UnsubscribeAll(); private: typedef std::string ContextTypeName_t; // typeid(ContextType).name() typedef std::string EventTypeName_t; // typeid(EventType).name() - typedef std::unordered_map EventRelays_t; - typedef std::unordered_map ContextSubscribers_t; - ContextSubscribers_t m_ContextSubscribers; + typedef std::unordered_multimap EventRelays_t; + typedef std::unordered_map ContextRelays_t; + ContextRelays_t m_ContextRelays; typedef std::list>> EventQueue_t; std::shared_ptr m_EventQueueRead; std::shared_ptr m_EventQueueWrite; }; - template void EventBroker::Publish(const EventType &event) { @@ -123,7 +125,7 @@ void EventBroker::Publish(const EventType &event) it->second->Receive(event); }*/ - m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); + m_EventQueueWrite->push_back(std::make_pair(typeid(EventType).name(), std::shared_ptr(new EventType(event)))); } template @@ -133,6 +135,15 @@ int EventBroker::Process() return Process(contextTypeName); } - +template +void EventBroker::UnsubscribeAll() +{ + const std::string contextTypeName = typeid(ContextType).name(); + auto contextIt = m_ContextRelays.find(contextTypeName); + if (contextIt != m_ContextRelays.end()) + { + m_ContextRelays.erase(contextIt); + } +} #endif // MessageRelay_h__