MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
EventManager.cpp
Go to the documentation of this file.
1#include "EventManager.hpp"
2
3#include <algorithm>
4
5namespace MayaFlux::Vruta {
6
7void EventManager::add_event(const std::shared_ptr<Event>& event, const std::string& name)
8{
9 if (!event)
10 return;
11
12 std::string event_name = name.empty() ? auto_generate_name(event) : name;
13
14 if (!name.empty() && m_named_events.count(event_name)) {
15 remove_event(event_name);
16 }
17
18 m_events.push_back(event);
19 if (!name.empty()) {
20 m_named_events[event_name] = event;
21 }
22}
23
24bool EventManager::cancel_event(const std::string& name)
25{
26 auto it = m_named_events.find(name);
27 if (it == m_named_events.end())
28 return false;
29
30 auto event = it->second;
31 if (event && event->is_active()) {
32 event->set_should_terminate(true);
33 }
34
35 m_named_events.erase(it);
36
37 std::erase(m_events, event);
38
39 return true;
40}
41
42bool EventManager::cancel_event(const std::shared_ptr<Event>& event)
43{
44
45 auto it = std::ranges::find(m_events, event);
46 if (it != m_events.end()) {
47 if (event && event->is_active()) {
48 event->set_should_terminate(true);
49 }
50 m_events.erase(it);
51 return true;
52 }
53
54 return false;
55}
56
57std::shared_ptr<Event> EventManager::get_event(const std::string& name) const
58{
59 return find_event_by_name(name);
60}
61
62bool EventManager::remove_event(const std::string& name)
63{
64 auto it = m_named_events.find(name);
65 if (it == m_named_events.end())
66 return false;
67
68 auto event = it->second;
69 m_named_events.erase(it);
70
71 std::erase(m_events, event);
72 return true;
73}
74
76{
77 return std::ranges::any_of(m_events,
78 [](const auto& event) {
79 return event && event->is_active();
80 });
81}
82
84{
85 return m_next_event_id.fetch_add(1);
86}
87
88std::string EventManager::auto_generate_name(const std::shared_ptr<Event>& /*event*/) const
89{
90 return "event_" + std::to_string(get_next_event_id());
91}
92
93std::shared_ptr<Event> EventManager::find_event_by_name(const std::string& name)
94{
95 auto it = m_named_events.find(name);
96 if (it != m_named_events.end()) {
97 return it->second;
98 }
99 return nullptr;
100}
101
102std::shared_ptr<Event> EventManager::find_event_by_name(const std::string& name) const
103{
104 auto it = m_named_events.find(name);
105 if (it != m_named_events.end()) {
106 return it->second;
107 }
108 return nullptr;
109}
110
112{
113 std::erase_if(m_events, [](const auto& e) {
114 return !e || e->done();
115 });
116
117 std::erase_if(m_named_events, [](const auto& pair) {
118 return !pair.second || pair.second->done();
119 });
120}
121
123{
124 for (auto& event : m_events) {
125 if (event && event->is_active()) {
126 event->set_should_terminate(true);
127 }
128 }
129
130 std::this_thread::sleep_for(std::chrono::milliseconds(10));
131
132 m_events.clear();
133}
134
135}
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.