6#include <brenta/signal.hpp>
7#include <brenta/logger.hpp>
15tenno::vector<SignalManager::Event> SignalManager::pending_events;
16std::unordered_map<SignalManager::SignalId,
17 tenno::vector<std::pair<SignalManager::ConnectionId,
18 SignalManager::Callback>>>
19SignalManager::registry;
27 SignalManager::pending_events.push_back(event);
29 EVENT(Logger::Event::Signal,
"SignalManager: emitted signal {}", event.id);
33SignalManager::subscribe(
const SignalManager::SignalId &
id,
34 SignalManager::Callback callback)
36 static ConnectionId connection_id = 0;
39 SignalManager::registry[id].push_back(std::make_tuple(connection_id, callback));
41 EVENT(Logger::Event::Signal,
42 "SignalManager: subscribed connection {} to signal {}",
44 return Subscription(
id, connection_id);
49 if (sub.connection_id <= 0 || sub.signal_id ==
"")
52 auto& entries = SignalManager::registry[sub.signal_id];
53 for (
auto it = entries.begin(); it != entries.end(); ++it)
55 if (std::get<0>(*it) == sub.connection_id)
59 EVENT(Logger::Event::Signal,
60 "SignalManager: unsibscribed connection {} from signal {}",
61 sub.connection_id, sub.signal_id);
67void SignalManager::update()
71 if (!SignalManager::registry.contains(event.id))
continue;
75 callback(event.message);
79 SignalManager::pending_events.clear();
82void SignalManager::clear()
84 SignalManager::pending_events.clear();
85 SignalManager::registry.clear();
88SignalManager::Subscription::~Subscription()
90 if (this->connection_id == 0)
return;
91 SignalManager::unsubscribe(*
this);