version 0.4.4
listener.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 <cassert>
13#include <functional>
14#include <iostream>
15#include <memory>
16#include <vector>
17
18namespace Ikarus {
19
28{
29public:
30 using Token = std::shared_ptr<void>;
31
40 template <typename Broadcaster>
41 auto subscribe(Broadcaster& broadcaster,
42 std::function<void(typename Broadcaster::MessageType, const typename Broadcaster::State&)> callback) {
43 auto token = broadcaster.registerListener(std::move(callback));
44 tokens.push_back(token);
45 return token;
46 }
47
52 for (auto& token : tokens) {
53 if (token) {
54 token.reset();
55 }
56 }
57 tokens.clear();
58 }
59
64 if (!tokens.empty()) {
65 tokens.back().reset();
66 tokens.pop_back();
67 }
68 }
69
73 void unSubscribe(const Token& token) {
74 auto it = std::ranges::find(tokens, token);
75 if (it != tokens.end()) {
76 (*it).reset();
77 tokens.erase(it);
78 }
79 }
80
81private:
82 std::vector<Token> tokens;
83};
84
85} // namespace Ikarus
Definition: assemblermanipulatorbuildingblocks.hh:22
Implements a Broadcaster for a given MessageType and BroadcasterState.
Definition: broadcaster.hh:26
Token registerListener(Callback callback)
This method is used to register a Listener function.
Definition: broadcaster.hh:43
MT MessageType
Definition: broadcaster.hh:28
S State
Definition: broadcaster.hh:29
Implements a listener.
Definition: listener.hh:28
auto subscribe(Broadcaster &broadcaster, std::function< void(typename Broadcaster::MessageType, const typename Broadcaster::State &)> callback)
Function to subscribe to a broadcaster with a given function (either a lambda, std::function or funct...
Definition: listener.hh:41
void unSubscribe(const Token &token)
Unsubscribe from a specific token.
Definition: listener.hh:73
void unSubscribeAll()
Unsubscribe from all listeners. At the moment unsubscribing can't be done more granularly.
Definition: listener.hh:51
void unSubscribeLast()
Unsubscribe from the last subscribed listener.
Definition: listener.hh:63
std::shared_ptr< void > Token
Definition: listener.hh:30