Brenta Engine 1.2
Loading...
Searching...
No Matches
signal.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/signal.hpp>
7#include <brenta/logger.hpp>
8
9using namespace brenta;
10
11//
12// Static storage
13//
14
15tenno::vector<SignalManager::Event> SignalManager::pending_events;
16std::unordered_map<SignalManager::SignalId,
17 tenno::vector<std::pair<SignalManager::ConnectionId,
18 SignalManager::Callback>>>
19SignalManager::registry;
20
21//
22// Member functions
23//
24
25void SignalManager::emit(const SignalManager::Event &event)
26{
27 SignalManager::pending_events.push_back(event);
28
29 EVENT(Logger::Event::Signal, "SignalManager: emitted signal {}", event.id);
30}
31
33SignalManager::subscribe(const SignalManager::SignalId &id,
34 SignalManager::Callback callback)
35{
36 static ConnectionId connection_id = 0;
37 connection_id++; // 0 is considered invalid
38
39 SignalManager::registry[id].push_back(std::make_tuple(connection_id, callback));
40
41 EVENT(Logger::Event::Signal,
42 "SignalManager: subscribed connection {} to signal {}",
43 connection_id, id);
44 return Subscription(id, connection_id);
45}
46
47void SignalManager::unsubscribe(const SignalManager::Subscription &sub)
48{
49 if (sub.connection_id <= 0 || sub.signal_id == "")
50 return;
51
52 auto& entries = SignalManager::registry[sub.signal_id];
53 for (auto it = entries.begin(); it != entries.end(); ++it)
54 {
55 if (std::get<0>(*it) == sub.connection_id)
56 {
57 entries.erase(it);
58
59 EVENT(Logger::Event::Signal,
60 "SignalManager: unsibscribed connection {} from signal {}",
61 sub.connection_id, sub.signal_id);
62 break;
63 }
64 }
65}
66
67void SignalManager::update()
68{
69 for (auto& event : SignalManager::pending_events)
70 {
71 if (!SignalManager::registry.contains(event.id)) continue;
72
73 for (auto& [_, callback] : SignalManager::registry[event.id])
74 {
75 callback(event.message);
76 }
77 }
78
79 SignalManager::pending_events.clear();
80}
81
82void SignalManager::clear()
83{
84 SignalManager::pending_events.clear();
85 SignalManager::registry.clear();
86}
87
88SignalManager::Subscription::~Subscription()
89{
90 if (this->connection_id == 0) return;
91 SignalManager::unsubscribe(*this);
92}