MayaFlux 0.3.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 if (event && event->is_active()) {
37 event->set_should_terminate(true);
38 }
39
40 m_named_events.erase(it);
41
42 std::erase(m_events, event);
43
44 return true;
45}
46
47bool EventManager::cancel_event(const std::shared_ptr<Event>& event)
48{
49
50 auto it = std::ranges::find(m_events, event);
51 if (it != m_events.end()) {
52 if (event && event->is_active()) {
53 event->set_should_terminate(true);
54 }
55 m_events.erase(it);
56 return true;
57 }
58
59 return false;
60}
61
62std::shared_ptr<Event> EventManager::get_event(const std::string& name) const
63{
64 return find_event_by_name(name);
65}
66
67bool EventManager::remove_event(const std::string& name)
68{
69 auto it = m_named_events.find(name);
70 if (it == m_named_events.end())
71 return false;
72
73 auto event = it->second;
74 m_named_events.erase(it);
75
76 std::erase(m_events, event);
77 return true;
78}
79
81{
82 return std::ranges::any_of(m_events,
83 [](const auto& event) {
84 return event && event->is_active();
85 });
86}
87
89{
90 return m_next_event_id.fetch_add(1);
91}
92
93std::string EventManager::auto_generate_name(const std::shared_ptr<Event>& /*event*/) const
94{
95 return "event_" + std::to_string(get_next_event_id());
96}
97
98std::shared_ptr<Event> EventManager::find_event_by_name(const std::string& name)
99{
100 auto it = m_named_events.find(name);
101 if (it != m_named_events.end()) {
102 return it->second;
103 }
104 return nullptr;
105}
106
107std::shared_ptr<Event> EventManager::find_event_by_name(const std::string& name) const
108{
109 auto it = m_named_events.find(name);
110 if (it != m_named_events.end()) {
111 return it->second;
112 }
113 return nullptr;
114}
115
117{
118 std::erase_if(m_events, [](const auto& e) {
119 return !e || e->done();
120 });
121
122 std::erase_if(m_named_events, [](const auto& pair) {
123 return !pair.second || pair.second->done();
124 });
125}
126
128{
129 for (auto& event : m_events) {
130 if (event && event->is_active()) {
131 event->set_should_terminate(true);
132 }
133 }
134
135 std::this_thread::sleep_for(std::chrono::milliseconds(10));
136
137 m_events.clear();
138}
139
140}
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::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.