MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
EventManager.cpp
Go to the documentation of this file.
1#include "EventManager.hpp"
2
3namespace MayaFlux::Vruta {
4
5void EventManager::add_event(const std::shared_ptr<Event>& event, const std::string& name)
6{
7 if (!event)
8 return;
9
10 std::string event_name = name.empty() ? auto_generate_name(event) : name;
11
12 if (!name.empty() && m_named_events.count(event_name)) {
13 remove_event(event_name);
14 }
15
16 m_events.push_back(event);
17 if (!name.empty()) {
18 m_named_events[event_name] = event;
19 }
20
21 if (event->is_active()) {
22 auto handle = event->get_handle();
23 if (handle && !handle.done()) {
24 handle.resume();
25 }
26 }
27}
28
29bool EventManager::cancel_event(const std::string& name)
30{
31 auto it = m_named_events.find(name);
32 if (it == m_named_events.end())
33 return false;
34
35 auto event = it->second;
36 m_named_events.erase(it);
37 std::erase(m_events, event);
38
39 if (event && event->is_active()) {
40 event->set_should_terminate(true);
41 }
42
43 return true;
44}
45
46bool EventManager::cancel_event(const std::shared_ptr<Event>& event)
47{
48
49 auto it = std::ranges::find(m_events, event);
50 if (it != m_events.end()) {
51 auto owned = std::move(*it);
52 m_events.erase(it);
53 std::erase_if(m_named_events, [&owned](const auto& pair) {
54 return pair.second == owned;
55 });
56
57 if (owned && owned->is_active()) {
58 owned->set_should_terminate(true);
59 }
60 return true;
61 }
62
63 return false;
64}
65
66std::shared_ptr<Event> EventManager::get_event(const std::string& name) const
67{
69}
70
71bool EventManager::remove_event(const std::string& name)
72{
73 auto it = m_named_events.find(name);
74 if (it == m_named_events.end())
75 return false;
76
77 auto event = it->second;
78 m_named_events.erase(it);
79 std::erase(m_events, event);
80
81 if (event && event->is_active()) {
82 event->set_should_terminate(true);
83 }
84 return true;
85}
86
88{
89 return std::ranges::any_of(m_events,
90 [](const auto& event) {
91 return event && event->is_active();
92 });
93}
94
96{
97 return m_next_event_id.fetch_add(1);
98}
99
100std::string EventManager::auto_generate_name(const std::shared_ptr<Event>& /*event*/) const
101{
102 return "event_" + std::to_string(get_next_event_id());
103}
104
105std::shared_ptr<Event> EventManager::find_event_by_name(const std::string& name)
106{
107 auto it = m_named_events.find(name);
108 if (it != m_named_events.end()) {
109 return it->second;
110 }
111 return nullptr;
112}
113
114std::shared_ptr<Event> EventManager::find_event_by_name(const std::string& name) const
115{
116 auto it = m_named_events.find(name);
117 if (it != m_named_events.end()) {
118 return it->second;
119 }
120 return nullptr;
121}
122
123std::vector<std::string> EventManager::get_event_names() const
124{
125 std::vector<std::string> names;
126 names.reserve(m_named_events.size());
127 for (const auto& [name, _] : m_named_events)
128 names.push_back(name);
129 return names;
130}
131
133{
134 std::erase_if(m_events, [](const auto& e) {
135 return !e || e->done();
136 });
137
138 std::erase_if(m_named_events, [](const auto& pair) {
139 return !pair.second || pair.second->done();
140 });
141}
142
144{
145 auto doomed = std::move(m_events);
146 m_events.clear();
147 m_named_events.clear();
148
149 for (auto& event : doomed) {
150 if (event && event->is_active()) {
151 event->set_should_terminate(true);
152 }
153 }
154
155 std::this_thread::sleep_for(std::chrono::milliseconds(10));
156}
157
158}
std::string name
Definition VKDevice.cpp:123
std::unordered_map< std::string, std::shared_ptr< Event > > m_named_events
void terminate_all_events()
Terminate and clear all events.
bool remove_event(const std::string &name)
Remove an event by name.
std::vector< std::string > get_event_names() const
Get all event names for debugging/inspection.
std::string auto_generate_name(const std::shared_ptr< Event > &event) const
Generate automatic name for a event based on its type.
std::atomic< uint64_t > m_next_event_id
event ID counter for unique identification
void cleanup_completed_events()
Clean up completed events.
std::vector< std::shared_ptr< Event > > m_events
void add_event(const std::shared_ptr< Event > &event, const std::string &name="")
Add a event to the manager.
std::shared_ptr< Event > get_event(const std::string &name) const
Get a named event.
uint64_t get_next_event_id() const
Generates a unique event ID for new events.
std::shared_ptr< Event > find_event_by_name(const std::string &name)
Find event entry by name.
bool has_active_events() const
Check if the manager has any active events.
bool cancel_event(const std::shared_ptr< Event > &event)
Cancels and removes a event from the manager.