From a42ce1a9e02b72a1bfa2e2658cb4d4235b497a18 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Thu, 24 Oct 2024 00:40:18 +0200 Subject: [PATCH] add subscription reference "counting" RAII wrapper --- solanaceae/util/event_provider.hpp | 35 ++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/solanaceae/util/event_provider.hpp b/solanaceae/util/event_provider.hpp index fa869f7..cc68c12 100644 --- a/solanaceae/util/event_provider.hpp +++ b/solanaceae/util/event_provider.hpp @@ -8,6 +8,37 @@ template struct EventProviderI { using enumType = typename EventI::enumType; + // keeps track of subscriptions for you + // and destorys them on destruction + struct SubscriptionReference { + EventProviderI& _ep; + EventI* _object {nullptr}; + std::vector _subs; + + SubscriptionReference(EventProviderI& ep, EventI* object) : + _ep(ep), _object(object) + { + } + + ~SubscriptionReference(void) { + for (const enumType et : _subs) { + auto& o_vec = _ep._subscribers.at(static_cast(et)); + for (auto o_it = o_vec.cbegin(); o_it != o_vec.cend(); o_it++) { + if (*o_it == _object) { + o_vec.erase(o_it); + break; + } + } + } + } + + SubscriptionReference& subscribe(const enumType event_type) { + _ep._subscribers.at(static_cast(event_type)).push_back(_object); + _subs.push_back(event_type); + return *this; + } + }; + virtual ~EventProviderI(void) {}; // TODO: unsub @@ -15,6 +46,10 @@ struct EventProviderI { _subscribers.at(static_cast(event_type)).push_back(object); } + SubscriptionReference newSubRef(EventI* object) { + return SubscriptionReference{*this, object}; + } + protected: template bool dispatch(enumType event_type, const T& event) {