conduit 0.6.0
Modern C++23 header-only event-dispatching / event-transport library
Loading...
Searching...
No Matches
listener.hpp
Go to the documentation of this file.
1#pragma once
2
5
7#include <conduit/event.hpp>
8
9#include <commons/prioritized.hpp>
10
11#include <concepts>
12#include <cstdint>
13#include <memory>
14#include <string_view>
15#include <utility>
16#include <vector>
17
18#include <parcel/parcel.h>
19
20namespace conduit {
21
22class Bus;
23
24namespace detail {
25
27using SubscriptionId = std::uint64_t;
28
42
43} // namespace detail
44
48public:
50
51 Subscription(std::shared_ptr<detail::SubscriptionBackref> backref,
52 const detail::SubscriptionId id) noexcept
53 : backref_(std::move(backref)), id_(id), active_(true) {}
54
55 Subscription(const Subscription&) = delete;
57
59 : backref_(std::move(other.backref_)), id_(other.id_), active_(other.active_) {
60 other.active_ = false;
61 }
63 if (this != &other) {
64 release();
65 backref_ = std::move(other.backref_);
66 id_ = other.id_;
67 active_ = other.active_;
68 other.active_ = false;
69 }
70 return *this;
71 }
72
74 release();
75 }
76
78 if (active_ && backref_) {
79 backref_->release(id_);
80 }
81 active_ = false;
82 backref_.reset();
83 }
84
86 active_ = false;
87 backref_.reset();
88 }
89
91 return active_;
92 }
93
94private:
95 std::shared_ptr<detail::SubscriptionBackref> backref_;
97 bool active_ = false;
98};
99
103template <typename T>
104class EventListener : public comms::Prioritized {
105public:
106 static_assert(std::derived_from<T, parcel::ICell>,
107 "EventListener<T>: T must derive from conduit::Event<T, Name>");
108
109 EventListener() = default;
110 EventListener(const EventListener&) = default;
111 EventListener(EventListener&&) noexcept = default;
112 EventListener& operator=(const EventListener&) = default;
113 EventListener& operator=(EventListener&&) noexcept = default;
114 ~EventListener() override = default;
115
116 virtual void on_event(const T&) = 0;
117};
118
125class EventSubscriber : public comms::Prioritized {
126public:
127 EventSubscriber() = default;
129 EventSubscriber(EventSubscriber&&) noexcept = default;
130 EventSubscriber& operator=(const EventSubscriber&) = delete;
131 EventSubscriber& operator=(EventSubscriber&&) noexcept = default;
132 ~EventSubscriber() override = default;
133
134 virtual void register_to(Bus& bus) = 0;
135
136 [[nodiscard]] std::vector<Subscription>& subscriptions() noexcept {
137 return subscriptions_;
138 }
139
140protected:
141 template <typename T, typename F>
142 void on(Bus& bus, F&& handler);
143
144 template <typename F>
145 void on(Bus& bus, std::string_view pattern, F&& handler);
146
147private:
148 std::vector<Subscription> subscriptions_;
149};
150
151} // namespace conduit
Definition bus.hpp:58
Class-based listener — derive and override on_event.
Definition listener.hpp:104
EventListener(EventListener &&) noexcept=default
EventListener(const EventListener &)=default
Multi-event subscriber base.
Definition listener.hpp:125
EventSubscriber(const EventSubscriber &)=delete
EventSubscriber(EventSubscriber &&) noexcept=default
RAII handle returned by Bus::listen(...).
Definition listener.hpp:47
Subscription & operator=(const Subscription &)=delete
void detach() noexcept
Definition listener.hpp:85
bool active() const noexcept
Definition listener.hpp:90
Subscription & operator=(Subscription &&other) noexcept
Definition listener.hpp:62
Subscription() noexcept=default
~Subscription()
Definition listener.hpp:73
void release() noexcept
Definition listener.hpp:77
Subscription(Subscription &&other) noexcept
Definition listener.hpp:58
Subscription(const Subscription &)=delete
Erased back-reference the Subscription holds.
Definition listener.hpp:32
virtual void release(SubscriptionId id) noexcept=0
SubscriptionBackref(const SubscriptionBackref &)=default
SubscriptionBackref(SubscriptionBackref &&) noexcept=default
EventEnvelope — a parcel cell carrying conduit's envelope metadata plus a polymorphic payload cell.
Event<Self, Name> library base built on parcel::SelfStructCell.
flags::FlagSet collect_default_flags()
Definition event.hpp:86
std::uint64_t SubscriptionId
Token used by the bus to unregister a listener.
Definition listener.hpp:27
Definition builder.hpp:22