SDEngine
Game Engine
Loading...
Searching...
No Matches
EventManager.hpp
Go to the documentation of this file.
1// TODO(docs): Add file-level Doxygen header
2// - @file EventManager.hpp
3// - @brief Event queue and dispatcher
4// - Event queuing vs immediate dispatch patterns
5#pragma once
6
7#include <algorithm>
8#include <memory>
9#include <vector>
10
11#include "Event.hpp"
12#include "SD/export.hpp"
13
14namespace sd {
15// TODO(docs): Document EventManager class
16// - Purpose: Queued event storage and type queries
17// - Event lifetime (pushed, queried, cleared)
18// - Integration with LayerList event handling
19// - Example: Checking for specific events
21public:
22 EventManager() { m_events.reserve(64); }
23
24 EventManager(const EventManager&) = delete;
28
29 [[nodiscard]] bool has_resize_event() const {
30 return std::ranges::any_of(m_events, [](const auto& e) {
31 return e->get_event_type() == EventType::WINDOW_RESIZE ||
32 e->get_event_type() == EventType::SWAPCHAIN_OUT_OF_DATE;
33 });
34 }
35
36 template<typename T>
37 requires std::derived_from<T, Event>
38 [[nodiscard]] bool has_event() const {
39 return std::ranges::any_of(
40 m_events, [](const auto& e) { return e->get_event_type() == T::get_static_type(); });
41 }
42
43
44 void clear() { m_events.clear(); }
45
46
47 template<typename T, typename... Args>
48 requires std::derived_from<T, Event>
49 void push_event(Args&&... args) {
50 m_events.emplace_back(std::make_unique<T>(std::forward<Args>(args)...));
51 }
52
53 template<typename T>
54 requires std::derived_from<T, Event>
55 void clear_type() {
56 auto ret = std::ranges::remove_if(
57 m_events, [](const auto& e) { return e->get_event_type() == T::GetStaticType(); });
58
59 m_events.erase(ret.begin(), m_events.end());
60 }
61
62
63 auto begin() { return m_events.begin(); }
64 auto end() { return m_events.end(); }
65 [[nodiscard]] auto begin() const { return m_events.begin(); }
66 [[nodiscard]] auto end() const { return m_events.end(); }
67
68private:
69 std::vector<std::unique_ptr<Event>> m_events;
70};
71
73public:
75
76 template<typename T, typename F>
77 bool dispatch(const F& func) {
78 if (m_event.get_event_type() == T::get_static_type()) {
79 if (func(static_cast<T&>(m_event))) {
80 m_event.m_handled = true;
81 }
82 return true;
83 }
84 return false;
85 }
86
87private:
89};
90} // namespace sd
Definition EventManager.hpp:72
Event & m_event
Definition EventManager.hpp:88
bool dispatch(const F &func)
Definition EventManager.hpp:77
EventDispatcher(Event &event)
Definition EventManager.hpp:74
Definition EventManager.hpp:20
auto end() const
Definition EventManager.hpp:66
EventManager & operator=(const EventManager &)=delete
auto end()
Definition EventManager.hpp:64
std::vector< std::unique_ptr< Event > > m_events
Definition EventManager.hpp:69
void clear()
Definition EventManager.hpp:44
EventManager(EventManager &&)=default
EventManager()
Definition EventManager.hpp:22
EventManager(const EventManager &)=delete
bool has_event() const
Definition EventManager.hpp:38
EventManager & operator=(EventManager &&)=default
void clear_type()
Definition EventManager.hpp:55
void push_event(Args &&... args)
Definition EventManager.hpp:49
bool has_resize_event() const
Definition EventManager.hpp:29
auto begin()
Definition EventManager.hpp:63
auto begin() const
Definition EventManager.hpp:65
Definition Event.hpp:56
bool m_handled
Definition Event.hpp:68
virtual EventType get_event_type() const =0
Definition Application.hpp:28
constexpr T g_type_max
Definition types.hpp:21