From 63c3e911f819c9c7b4ae736a229c89df52ceb81f Mon Sep 17 00:00:00 2001 From: chatlanin Date: Thu, 17 Apr 2025 18:46:20 +0300 Subject: [PATCH] fix event --- example/layers/ui_layer/ui_layer.cpp | 4 +- .../ui_layer_double/ui_layer_double.cpp | 4 +- src/event/api.hpp | 9 +-- src/event/event_manager.hpp | 66 +++++++++++++------ src/layer/layer.hpp | 2 - 5 files changed, 55 insertions(+), 30 deletions(-) diff --git a/example/layers/ui_layer/ui_layer.cpp b/example/layers/ui_layer/ui_layer.cpp index 4f8e135..c09fae5 100755 --- a/example/layers/ui_layer/ui_layer.cpp +++ b/example/layers/ui_layer/ui_layer.cpp @@ -6,14 +6,14 @@ namespace example { void ui_layer::on_attach() { - m_key = VE::CONNECT(this); + VE::CONNECT(this); hack::log()("on_attach"); } void ui_layer::on_detach() { - VE::DISCONNECT(m_key); + VE::DISCONNECT(this); hack::log()("on_detach"); } diff --git a/example/layers/ui_layer_double/ui_layer_double.cpp b/example/layers/ui_layer_double/ui_layer_double.cpp index b06d2cd..653bf4f 100755 --- a/example/layers/ui_layer_double/ui_layer_double.cpp +++ b/example/layers/ui_layer_double/ui_layer_double.cpp @@ -6,14 +6,14 @@ namespace example { void ui_layer_double::on_attach() { - m_key = VE::CONNECT(this); + VE::CONNECT(this); hack::log()("on_attach"); } void ui_layer_double::on_detach() { - VE::DISCONNECT(m_key); + VE::DISCONNECT(this); hack::log()("on_detach"); } diff --git a/src/event/api.hpp b/src/event/api.hpp index d492094..7354f95 100755 --- a/src/event/api.hpp +++ b/src/event/api.hpp @@ -5,14 +5,15 @@ namespace VE { template - std::string CONNECT(T* obj) + void CONNECT(T* obj) { - return event_manager::instance().connect(obj, &T::on_event); + event_manager::instance().connect(obj, &T::on_event); } - inline void DISCONNECT(std::string key) + template + void DISCONNECT(T* obj) { - event_manager::instance().disconnect(key); + event_manager::instance().disconnect(obj, &T::on_event); } template diff --git a/src/event/event_manager.hpp b/src/event/event_manager.hpp index 29e88f2..5c3f00f 100755 --- a/src/event/event_manager.hpp +++ b/src/event/event_manager.hpp @@ -1,39 +1,37 @@ #pragma once +#include #include #include #include #include "event.hpp" -#include "utils/using.hpp" namespace VE { struct event_manager : public hack::patterns::singleton { - std::map> m_funcs; - - template - std::string connect(T* obj, void (T::*method)(event)) - { - std::string key = hack::security::generate_uuid(); - m_funcs[key] = std::bind(method, obj, std::placeholders::_1); - return key; - } - - void disconnect(std::string key) - { - auto it = m_funcs.find(key); - m_funcs.erase(it); - hack::log()("delete", m_funcs.size()); - } + // std::map> m_funcs; + // + // template + // std::string connect(T* obj, void (T::*method)(event)) + // { + // std::string key = hack::security::generate_uuid(); + // m_funcs[key] = std::bind(method, obj, std::placeholders::_1); + // return key; + // } + // + // void disconnect(std::string key) + // { + // auto it = m_funcs.find(key); + // m_funcs.erase(it); + // } void emit(event e) { - hack::log()("emit", m_funcs.size(), e.m_id); try { - for(auto [key, f] : m_funcs) m_funcs[key](e); + for(auto& f : m_funcs) f.m_func(e); } catch(const std::exception& ex) { @@ -44,8 +42,36 @@ namespace VE { hack::error()("ooops..."); } + } - hack::log()("emit end", m_funcs.size(), e.m_id); + struct EventHandler + { + std::function m_func; + void* m_obj; + }; + + std::vector m_funcs; + + template + void connect(T* obj, void (T::*method)(event)) + { + m_funcs.push_back({ + std::bind(method, obj, std::placeholders::_1), + static_cast(obj), + reinterpret_cast(&method) + }); + } + + template + void disconnect(T* obj, void (T::*method)(event)) + { + m_funcs.erase( + std::remove_if(m_funcs.begin(), m_funcs.end(), + [obj](const auto& handler) { + return handler.m_obj == obj; + }), + m_funcs.end() + ); } }; } diff --git a/src/layer/layer.hpp b/src/layer/layer.hpp index 07de696..91a49b9 100755 --- a/src/layer/layer.hpp +++ b/src/layer/layer.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include "event/event.hpp" #include "utils/using.hpp" @@ -24,7 +23,6 @@ namespace VE protected: event_fn execute; - std::string m_key; }; }