#pragma once #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) { m_funcs.erase(key); } void emit(event e) { hack::log()("emit", m_funcs.size()); try { for(auto [key, f] : m_funcs) m_funcs[key](e); } catch(const std::exception& ex) { hack::error()(ex.what()); hack::log()("size funcs", m_funcs.size()); } catch(...) { hack::error()("ooops..."); } hack::log()("emit end", m_funcs.size()); } }; }