7#include <unordered_map>
12#define BIND_LAMBDA(fn) [this](auto&&... args) -> decltype(auto) { return this->fn(std::forward<decltype(args)>(args)...); }
13#define BIND_FUNC_0(Function, class_name) std::bind(&class_name::Function, this)
14#define BIND_FUNC_1(Function, class_name) std::bind(&class_name::Function, this, std::placeholders::_1)
15#define BIND_FUNC_2(Function, class_name) std::bind(&class_name::Function, this, std::placeholders::_2)
16#define BIND_FUNC_3(Function, class_name) std::bind(&class_name::Function, this, std::placeholders::_3)
18#define GET_DISPATCHER Sleak::EventDispatcher::GetInstance()
42 #define EVENT_CLASS_TYPE(type) \
43 static EventType GetStaticType() \
45 return EventType::type;\
47 virtual EventType GetEventType() const override \
49 return GetStaticType();\
51 virtual const char* GetName() const override \
56 #define EVENT_CLASS_CATEGORY(category)\
57 virtual int GetCategoryFlags() const override \
58 { return static_cast<int>(category); }
136 template<
typename EventT>
138 EventType type = EventT::GetStaticType();
140 auto delegate = std::make_shared<EventDelegate<EventT>>(callback);
141 eventHandlers[type].push_back(delegate);
143 return delegate->GetUUID();
148 template<
typename T,
typename EventT>
150 EventType type = EventT::GetStaticType();
152 auto callback = [instance, memberFunction](
const EventT& event) {
153 (instance->*memberFunction)(event);
156 auto delegate = std::make_shared<EventDelegate<EventT>>(callback);
157 eventHandlers[type].push_back(delegate);
159 return delegate->GetID();
164 for(
auto it = eventHandlers[type].begin(); it != eventHandlers[type].end(); ++it) {
165 if((*it)->GetID() ==
id) {
166 eventHandlers[type].erase(it);
174 eventHandlers[type].clear();
179 eventHandlers.clear();
184 template<
typename EventT>
188 if (eventHandlers.find(type) == eventHandlers.end())
193 auto handlers = eventHandlers[type];
194 for (
auto& handler : handlers) {
196 auto typedDelegate = std::dynamic_pointer_cast<EventDelegate<EventT>>(handler);
198 typedDelegate->SetEvent(event);
199 typedDelegate->Execute();
206 eventHandlers.clear();
210 static inline std::unordered_map<EventType, std::vector<std::shared_ptr<IDelegate>>> eventHandlers;
216 template<
typename T,
typename... Args>
218 T event(std::forward<Args>(args)...);
static std::string RegisterEventCallback(std::function< void(const EventT &)> callback)
Registers a free-function/lambda callback for EventT, returning an ID for later unregistration.
static void ClearEventHandlers()
Drops every handler for every event type; equivalent to UnregisterAllEvents().
static void DispatchEvent(const EventT &event)
Invokes every handler registered for event's type, in registration order.
static void UnregisterAllEvents()
Drops every handler for every event type.
static void UnregisterEvent(EventType type, std::string id)
Removes the single handler with matching id from type's handler list.
static std::string RegisterEventHandler(T *instance, void(T::*memberFunction)(const EventT &))
Registers a member-function handler bound to instance, returning an ID for later unregistration.
static void UnregisterEvents(EventType type)
Drops every handler registered for type.
bool IsInCategory(EventCategory category)
virtual std::string ToString() const
virtual int GetCategoryFlags() const =0
virtual const char * GetName() const =0
virtual EventType GetEventType() const =0
Root namespace for everything the engine exposes.
void DispatchEvent(Args &&... args)
Constructs a T from args and dispatches it through EventDispatcher.
std::ostream & operator<<(std::ostream &os, const Event &e)