version 0.4.4
broadcaster.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2025 The Ikarus Developers ikarus@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
10#pragma once
11#include <algorithm>
12#include <functional>
13#include <memory>
14#include <vector>
15
16namespace Ikarus {
17
24template <typename MT, typename S>
26{
27public:
28 using MessageType = MT;
29 using State = S;
30
31 using Callback = std::function<void(MT, const State&)>;
32 using Token = std::shared_ptr<Callback>;
33
44 auto sp = std::make_shared<Callback>(std::move(callback));
45 listeners.push_back(sp);
46 return sp;
47 }
48
53 if (token) {
54 token.reset();
55 }
56 }
57
61 void notify(MT message, const State& data) {
62 trim();
63 for (auto& weakCb : listeners) {
64 if (auto callback = weakCb.lock()) {
65 (*callback)(message, data);
66 }
67 }
68 }
69
70private:
71 std::vector<std::weak_ptr<Callback>> listeners;
72
73 void trim() {
74 listeners.erase(
75 std::remove_if(listeners.begin(), listeners.end(), [](const auto& weakCb) { return weakCb.expired(); }),
76 listeners.end());
77 }
78};
79
80} // namespace Ikarus
Definition: assemblermanipulatorbuildingblocks.hh:22
Implements a Broadcaster for a given MessageType and BroadcasterState.
Definition: broadcaster.hh:26
void notify(MT message, const State &data)
This calls all the registered functions.
Definition: broadcaster.hh:61
std::function< void(MT, const State &)> Callback
Definition: broadcaster.hh:31
Token registerListener(Callback callback)
This method is used to register a Listener function.
Definition: broadcaster.hh:43
std::shared_ptr< Callback > Token
Definition: broadcaster.hh:32
MT MessageType
Definition: broadcaster.hh:28
S State
Definition: broadcaster.hh:29
void unregisterListener(Token token)
deregisters a specific function
Definition: broadcaster.hh:52