#pragma once #include #include #include #include "subscriber.hpp" template class Subscribable { using TSubscriber = Subscriber; private: std::unordered_map>> subscribersMap_; public: void subscribe(const TEventId& eventId, std::shared_ptr subscriber) { subscribersMap_[eventId].push_back(subscriber); } void unsubscribe(const TEventId& eventId, std::shared_ptr subscriber) { auto entry = subscribersMap_.find(eventId); if (entry == subscribersMap_.end()) { return; } std::erase(entry->second, subscriber); if (entry->second.empty()) { subscribersMap_.erase(entry); } } void notify(const TEventId& eventId, const TEventInfo& eventInfo) const { auto entry = subscribersMap_.find(eventId); if (entry == subscribersMap_.end()) { return; } for (auto& subscriber : entry->second) { subscriber->onNotification(eventId, eventInfo); } } };