53 : owner_(
std::move(owner)) {}
59 requires std::invocable<std::decay_t<Fn>&>
61 if constexpr (std::is_pointer_v<std::decay_t<Fn>>) {
62 if (!on_disconnect)
return;
64 owner_ = std::make_shared<CallbackDeleter<std::decay_t<Fn>>>(
65 std::forward<Fn>(on_disconnect));
70 owner_ = std::make_shared<CallbackDeleter<std::function<void()>>>(
71 std::move(on_disconnect));
83 void release() noexcept { owner_.reset(); }
85 [[nodiscard]]
bool active() const noexcept {
return static_cast<bool>(owner_); }
86 explicit operator bool() const noexcept {
return active(); }
90 struct CallbackDeleter {
94 explicit CallbackDeleter(F&& callback) : fn(
std::forward<F>(callback)) {}
96 CallbackDeleter(CallbackDeleter&&) =
delete;
97 CallbackDeleter& operator=(CallbackDeleter&&) =
delete;
98 CallbackDeleter(
const CallbackDeleter&) =
delete;
99 CallbackDeleter& operator=(
const CallbackDeleter&) =
delete;
101 ~CallbackDeleter() noexcept {
110 std::shared_ptr<void> owner_;
124 if (
this != &other) {
125 auto previous = std::move(subs_);
126 subs_ = std::move(other.subs_);
127 release_reverse_(previous);
138 if (!destroying_) subs_.push_back(std::move(s));
149 std::vector<Subscription> previous;
150 previous.swap(subs_);
151 release_reverse_(previous);
154 [[nodiscard]] std::size_t
size() const noexcept {
return subs_.size(); }
155 [[nodiscard]]
bool empty() const noexcept {
return subs_.empty(); }
158 static void release_reverse_(std::vector<Subscription>& subscriptions)
noexcept {
159 while (!subscriptions.empty()) {
160 auto last = std::move(subscriptions.back());
161 subscriptions.pop_back();
166 std::vector<Subscription> subs_;
167 bool destroying_ =
false;
SubscriptionBag & operator+=(Subscription s)
Definition subscription.hpp:141
SubscriptionBag(const SubscriptionBag &)=delete
void add(Subscription s)
Definition subscription.hpp:137
SubscriptionBag()=default
~SubscriptionBag() noexcept
Definition subscription.hpp:132
SubscriptionBag(SubscriptionBag &&other) noexcept
Definition subscription.hpp:122
bool empty() const noexcept
Definition subscription.hpp:155
SubscriptionBag & operator=(const SubscriptionBag &)=delete
std::size_t size() const noexcept
Definition subscription.hpp:154
SubscriptionBag & operator=(SubscriptionBag &&other) noexcept
Definition subscription.hpp:123
void clear() noexcept
Disconnect the current contents in reverse insertion order.
Definition subscription.hpp:148
RAII handle to a single subscription.
Definition subscription.hpp:44
Subscription(const Subscription &)=delete
Subscription(Fn &&on_disconnect)
Invoke a disconnect callback exactly once when this handle is released.
Definition subscription.hpp:60
Subscription(std::function< void()> on_disconnect)
Definition subscription.hpp:68
bool active() const noexcept
Definition subscription.hpp:85
Subscription(Subscription &&) noexcept=default
Subscription & operator=(const Subscription &)=delete
void release() noexcept
Explicitly disconnect now (instead of at destruction).
Definition subscription.hpp:83
Subscription() noexcept=default
void report_callback_failure(std::string_view category, std::exception_ptr exception, std::string_view message={}) noexcept
Report a callback failure.
Definition validation_key.hpp:110