EduArt Sensor Ring Library 3.0.0
Loading...
Searching...
No Matches
Publisher.hpp
Go to the documentation of this file.
1// Copyright (c) 2026 EduArt Robotik GmbH
2
9
10#pragma once
11
12#include <functional>
13#include <mutex>
14#include <unordered_map>
15#include <vector>
16
19
20namespace eduart {
21
22namespace subscription {
23
35template <typename... Args> class Publisher {
36public:
38 using Callback = std::function<void(Args...)>;
39
40 Publisher() = default;
41
48 if (!callback) {
49 return Subscription();
50 }
51 auto token = SubscriberToken::getNextToken();
52 {
53 std::lock_guard<std::mutex> lock(_mutex);
54 _subscribers.emplace(token, std::move(callback));
55 }
56 return Subscription(token, [this, token]() {
57 unsubscribe(token);
58 });
59 }
60
66 std::lock_guard<std::mutex> lock(_mutex);
67 _subscribers.erase(token);
68 }
69
78 void publish(Args... args) const {
79 auto callbacks = copySubscribers();
80 for (const auto& cb : callbacks) {
81 try {
82 cb(args...);
83 } catch (...) {
84 }
85 }
86 }
87
96 std::vector<Callback> copySubscribers() const {
97 std::vector<Callback> callbacks;
98 {
99 std::lock_guard<std::mutex> lock(_mutex);
100 callbacks.reserve(_subscribers.size());
101 for (const auto& [token, cb] : _subscribers) {
102 if (cb) {
103 callbacks.push_back(cb);
104 }
105 }
106 }
107 return callbacks;
108 }
109
110private:
111 mutable std::mutex _mutex;
112 std::unordered_map<SubscriberToken, Callback> _subscribers;
113};
114
115} // namespace subscription
116
117} // namespace eduart
Opaque token identifying a subscription.
RAII wrapper pairing a SubscriberToken with its cancel function.
std::function< void(Args...)> Callback
Callback type for subscribers.
Definition Publisher.hpp:38
void unsubscribe(SubscriberToken token)
Remove a previously registered callback.
Definition Publisher.hpp:65
std::vector< Callback > copySubscribers() const
Copy the current subscriber list under lock.
Definition Publisher.hpp:96
void publish(Args... args) const
Invoke all registered callbacks with the given arguments.
Definition Publisher.hpp:78
Subscription subscribe(Callback callback)
Register a callback.
Definition Publisher.hpp:47
Move-only RAII wrapper that pairs a SubscriberToken with an unsubscribe callable. Destroying a Subscr...
Definition Subscription.hpp:30
Opaque token identifying a subscription (state or device group).
Definition SubscriberToken.hpp:22
static SubscriberToken getNextToken() noexcept
Get the next token.
Definition SubscriberToken.hpp:40