EduArt Sensor Ring Library 4.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 sensorring {
23
24namespace subscription {
25
37template <typename... Args> class Publisher {
38public:
40 using Callback = std::function<void(Args...)>;
41
42 Publisher() = default;
43
50 if (!callback) {
51 return Subscription();
52 }
53 auto token = SubscriberToken::getNextToken();
54 {
55 std::lock_guard<std::mutex> lock(_mutex);
56 _subscribers.emplace(token, std::move(callback));
57 }
58 return Subscription(token, [this, token]() {
59 unsubscribe(token);
60 });
61 }
62
68 std::lock_guard<std::mutex> lock(_mutex);
69 _subscribers.erase(token);
70 }
71
80 void publish(Args... args) const {
81 auto callbacks = copySubscribers();
82 for (const auto& cb : callbacks) {
83 try {
84 cb(args...);
85 } catch (...) {
86 }
87 }
88 }
89
98 std::vector<Callback> copySubscribers() const {
99 std::vector<Callback> callbacks;
100 {
101 std::lock_guard<std::mutex> lock(_mutex);
102 callbacks.reserve(_subscribers.size());
103 for (const auto& [token, cb] : _subscribers) {
104 if (cb) {
105 callbacks.push_back(cb);
106 }
107 }
108 }
109 return callbacks;
110 }
111
112private:
113 mutable std::mutex _mutex;
114 std::unordered_map<SubscriberToken, Callback> _subscribers;
115};
116
117} // namespace subscription
118
119} // namespace sensorring
120
121} // namespace eduart
Opaque token identifying a subscription.
RAII wrapper pairing a SubscriberToken with its cancel function.
Subscription subscribe(Callback callback)
Register a callback.
Definition Publisher.hpp:49
void unsubscribe(SubscriberToken token)
Remove a previously registered callback.
Definition Publisher.hpp:67
std::function< void(Args...)> Callback
Callback type for subscribers.
Definition Publisher.hpp:40
std::vector< Callback > copySubscribers() const
Copy the current subscriber list under lock.
Definition Publisher.hpp:98
void publish(Args... args) const
Invoke all registered callbacks with the given arguments.
Definition Publisher.hpp:80
Move-only RAII wrapper that pairs a SubscriberToken with an unsubscribe callable. Destroying a Subscr...
Definition Subscription.hpp:32
Opaque token identifying a subscription (state or device group).
Definition SubscriberToken.hpp:25
static SubscriberToken getNextToken() noexcept
Get the next token.
Definition SubscriberToken.hpp:43