add new strucn event

This commit is contained in:
2025-04-17 17:20:25 +03:00
parent e5d4f80f41
commit b2f72b5a60
6 changed files with 21 additions and 37 deletions

View File

@@ -1,53 +1,36 @@
#pragma once
#include <functional>
#include <algorithm>
#include <hack/patterns/singleton.hpp>
#include <hack/logger/logger.hpp>
#include <hack/security/uuid.hpp>
#include "event.hpp"
#include "utils/using.hpp"
namespace VE
{
struct event_manager : public hack::patterns::singleton<event_manager>
{
struct event_handler
{
std::function<void(event)> m_func;
void* m_obj;
void* m_func_ptr;
};
std::vector<event_handler> m_funcs;
std::map<std::string, event_fn<event>> m_funcs;
template<typename T>
void connect(T* obj, void (T::*method)(event))
std::string connect(T* obj, void (T::*method)(event))
{
event_handler handler;
handler.m_func = std::bind(method, obj, std::placeholders::_1);
handler.m_obj = obj;
m_funcs.push_back(handler);
std::string key = hack::security::generate_uuid();
m_funcs[key] = std::bind(method, obj, std::placeholders::_1);
return key;
}
template<typename T>
void disconnect(T* obj, void (T::*method)(event))
void disconnect(std::string key)
{
m_funcs.erase(std::remove_if(m_funcs.begin(), m_funcs.end(),
[obj](const event_handler& handler) {
return handler.m_obj == obj;
}),
m_funcs.end()
);
m_funcs.erase(key);
}
void emit(event e)
{
try
{
for (std::size_t i = 0; i < m_funcs.size(); ++i)
{
m_funcs[i].m_func(e);
}
for(auto [key, f] : m_funcs) m_funcs[key](e);
}
catch(const std::exception& ex)
{