diff --git a/src/event/api.hpp b/src/event/api.hpp index 4ff0e2f..7354f95 100755 --- a/src/event/api.hpp +++ b/src/event/api.hpp @@ -10,6 +10,12 @@ namespace VE event_manager::instance().connect(obj, &T::on_event); } + template + void DISCONNECT(T* obj) + { + event_manager::instance().disconnect(obj, &T::on_event); + } + template void EMIT(TYPE t, DATA d, int id = -1) { diff --git a/src/event/event_manager.hpp b/src/event/event_manager.hpp index f701b98..028f980 100755 --- a/src/event/event_manager.hpp +++ b/src/event/event_manager.hpp @@ -1,21 +1,45 @@ #pragma once +#include +#include #include #include #include "event.hpp" -#include "utils/using.hpp" namespace VE { struct event_manager : public hack::patterns::singleton { - std::vector> m_funcs; + struct event_handler + { + std::function m_func; + void* m_obj; + void* m_func_ptr; + }; + + std::vector m_funcs; template void connect(T* obj, void (T::*method)(event)) { - m_funcs.push_back(std::bind(method, obj, std::placeholders::_1)); + event_handler handler; + handler.m_func = std::bind(method, obj, std::placeholders::_1); + handler.m_obj = obj; + handler.m_func_ptr = reinterpret_cast(&method); + m_funcs.push_back(handler); + } + + template + void disconnect(T* obj, void (T::*method)(event)) + { + auto func_ptr = reinterpret_cast(&method); + m_funcs.erase(std::remove_if(m_funcs.begin(), m_funcs.end(), + [obj, func_ptr](const event_handler& handler) { + return handler.m_obj == obj && handler.m_func_ptr == func_ptr; + }), + m_funcs.end() + ); } void emit(event e) @@ -24,7 +48,7 @@ namespace VE { for (std::size_t i = 0; i < m_funcs.size(); ++i) { - m_funcs[i](e); + m_funcs[i].m_func(e); } } catch(const std::exception& ex) diff --git a/src/utils/define.hpp b/src/utils/define.hpp index 00caebf..2d07d7b 100755 --- a/src/utils/define.hpp +++ b/src/utils/define.hpp @@ -16,3 +16,7 @@ #define VE_NAME(n) VE::func::name(n).data() #define VE_COLOR(c, t) VE::func::color(c, t) + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif