From 834ba5b13707feb0551d1fa9bd459340ada65e09 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Tue, 25 Nov 2025 20:47:57 +0100 Subject: [PATCH] dedup --- interfaces/Crafter.Event.cppm | 98 +++++++++++++++-------------------- 1 file changed, 42 insertions(+), 56 deletions(-) diff --git a/interfaces/Crafter.Event.cppm b/interfaces/Crafter.Event.cppm index c09911e..58a0d68 100644 --- a/interfaces/Crafter.Event.cppm +++ b/interfaces/Crafter.Event.cppm @@ -55,21 +55,24 @@ namespace Crafter { std::function function; }; - export template - class Event { - public: + // Base implementation for Event - common functionality + template + class EventBase { + protected: std::map*>> listeners; - Event() = default; - Event(Event&& other) : listeners(std::move(other.listeners)) { + + public: + EventBase() = default; + EventBase(EventBase&& other) : listeners(std::move(other.listeners)) { for (const auto& listenerSlice : listeners) { for (const auto& listener : listenerSlice.second) { listener->eventToListenTo = this; } } } - Event(Event&) = delete; - Event& operator=(Event&) = delete; - ~Event() { + EventBase(EventBase&) = delete; + EventBase& operator=(EventBase&) = delete; + virtual ~EventBase() { for (const auto& listenerSlice : listeners) { for (const auto& listener : listenerSlice.second) { listener->eventToListenTo = nullptr; @@ -87,11 +90,38 @@ namespace Crafter { } void RemoveListener(EventListener* listener) { - listeners[listener->priority].erase(std::remove(listeners[listener->priority].begin(), listeners[listener->priority].end(), listener), listeners[listener->priority].end()); + listeners[listener->priority].erase( + std::remove(listeners[listener->priority].begin(), + listeners[listener->priority].end(), + listener), + listeners[listener->priority].end() + ); } + }; + // Specialized Event with different Invoke signature + export template<> + class Event : public EventBase { + public: + using EventBase::EventBase; + + void Invoke() { + for (const auto& listenerSlice : this->listeners) { + for (const auto& listener : listenerSlice.second) { + listener->function(); + } + } + } + }; + + // Generic Event with Invoke signature + export template + class Event : public EventBase { + public: + using EventBase::EventBase; + void Invoke(T data) { - for (const auto& listenerSlice : listeners) { + for (const auto& listenerSlice : this->listeners) { for (const auto& listener : listenerSlice.second) { listener->function(data); } @@ -99,6 +129,7 @@ namespace Crafter { } }; + // Common implementations for EventListener template void EventListener::SetEvent(Event* eventToListenTo, std::function listener, int priority) { this->priority = priority; @@ -124,52 +155,7 @@ namespace Crafter { eventToListenTo = nullptr; } - export template<> - class Event { - public: - std::map*>> listeners; - Event() = default; - Event(Event&& other) : listeners(std::move(other.listeners)) { - for (const auto& listenerSlice : listeners) { - for (const auto& listener : listenerSlice.second) { - listener->eventToListenTo = this; - } - } - } - Event(Event&) = delete; - Event& operator=(Event&) = delete; - ~Event() { - for (const auto& listenerSlice : listeners) { - const std::vector*> slice = listenerSlice.second; - for (const auto& listener : slice) { - listener->eventToListenTo = nullptr; - } - } - } - - void AddListener(EventListener* listener, int priority = 0) { - if (listeners.contains(priority)) { - listeners[priority].push_back(listener); - } - else { - listeners[priority] = std::vector*>{ listener }; - } - } - - void RemoveListener(EventListener* listener) { - listeners[listener->priority].erase(std::remove(listeners[listener->priority].begin(), listeners[listener->priority].end(), listener), listeners[listener->priority].end()); - } - - void Invoke() { - for (const auto& listenerSlice : listeners) { - const std::vector*> slice = listenerSlice.second; - for (const auto& listener : slice) { - listener->function(); - } - } - } - }; - + // Specific implementations for EventListener void EventListener::SetEvent(Event* eventToListenTo, std::function listener, int priority) { this->priority = priority;