FastEngine 0.9.5
A multiplayer oriented 2D engine made with Vulkan.
Loading...
Searching...
No Matches
C_subscription.hpp
1/*
2 * Copyright 2026 Guillaume Guillet
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _FGE_C_SUBSCRIPTION_HPP_INCLUDED
18#define _FGE_C_SUBSCRIPTION_HPP_INCLUDED
19
20#include "FastEngine/fge_extern.hpp"
21#include <cstdint>
22#include <unordered_map>
23#include <unordered_set>
24
25namespace fge
26{
27
28class Subscriber;
29
30class BaseSubscription
31{
32public:
33 using SubscriberCount = unsigned int;
34
35 BaseSubscription() = default;
36 virtual ~BaseSubscription() = default;
37
38protected:
46 virtual void onDetach(fge::Subscriber* subscriber) = 0;
47
51 virtual void detachAll() = 0;
52
61 virtual bool detach(fge::Subscriber* subscriber) = 0;
72 virtual SubscriberCount detachOnce(fge::Subscriber* subscriber) = 0;
73
83 virtual SubscriberCount attach(fge::Subscriber* subscriber) = 0;
84
91 [[nodiscard]] virtual SubscriberCount getCount(fge::Subscriber* subscriber) const = 0;
92
93private:
102 virtual void detachSilent(fge::Subscriber* subscriber) = 0;
103
104 friend class fge::Subscriber;
105};
106
124class FGE_API Subscription : public BaseSubscription
125{
126public:
127 Subscription() = default;
128
130 Subscription([[maybe_unused]] fge::Subscription const& r) {}
131 Subscription(fge::Subscription&& r) noexcept;
132
136 inline ~Subscription() override { this->Subscription::detachAll(); }
137
139 fge::Subscription& operator=([[maybe_unused]] fge::Subscription const& r) { return *this; }
140 fge::Subscription& operator=(fge::Subscription&& r) noexcept;
141
142protected:
143 void detachAll() override;
144 bool detach(fge::Subscriber* subscriber) override;
145 SubscriberCount detachOnce(fge::Subscriber* subscriber) override;
146
147 SubscriberCount attach(fge::Subscriber* subscriber) override;
148
149 SubscriberCount getCount(fge::Subscriber* subscriber) const override;
150
151private:
152 using SubscriptionDataType = std::unordered_map<fge::Subscriber*, SubscriberCount>;
153
154 void detachSilent(fge::Subscriber* subscriber) override;
155
156 SubscriptionDataType g_subData;
157};
158
166class FGE_API UniqueSubscription : public BaseSubscription
167{
168public:
169 UniqueSubscription() = default;
170
172 UniqueSubscription([[maybe_unused]] fge::UniqueSubscription const& r) {}
174
178 virtual inline ~UniqueSubscription() override { this->UniqueSubscription::detachAll(); }
179
181 fge::UniqueSubscription& operator=([[maybe_unused]] fge::UniqueSubscription const& r) { return *this; };
182 fge::UniqueSubscription& operator=(fge::UniqueSubscription&& r) noexcept;
183
184protected:
185 void detachAll() override;
186 bool detach(fge::Subscriber* subscriber) override;
187 SubscriberCount detachOnce(fge::Subscriber* subscriber) override;
188
189 SubscriberCount attach(fge::Subscriber* subscriber) override;
190
191 SubscriberCount getCount(fge::Subscriber* subscriber) const override;
192
193private:
194 void detachSilent(fge::Subscriber* subscriber) override;
195
196 fge::Subscriber* g_subscriber = nullptr;
197};
198
209class FGE_API Subscriber
210{
211public:
212 Subscriber() = default;
213
215 Subscriber([[maybe_unused]] fge::Subscriber const& n) {};
217 Subscriber(fge::Subscriber&& n) noexcept = delete;
218
222 virtual inline ~Subscriber() { this->detachAll(); };
223
225 fge::Subscriber& operator=([[maybe_unused]] fge::Subscriber const& n) { return *this; };
228
232 void detachAll();
238 void detach(fge::BaseSubscription* subscription);
239
240protected:
246 virtual void onDetach([[maybe_unused]] fge::BaseSubscription* subscription) {}
247
248private:
249 using SubscriberDataType = std::unordered_set<fge::BaseSubscription*>;
250
259 void detachSilent(fge::BaseSubscription* subscription);
265 void attachSilent(fge::BaseSubscription* subscription);
266
267 SubscriberDataType g_subData;
268 friend class fge::Subscription;
269 friend class fge::UniqueSubscription;
270};
271
272} // namespace fge
273
274#endif // _FGE_C_SUBSCRIPTION_HPP_INCLUDED
Definition C_subscription.hpp:31
virtual void detachAll()=0
Detach all subscribers.
virtual SubscriberCount detachOnce(fge::Subscriber *subscriber)=0
Detach only once a specific subscriber.
virtual bool detach(fge::Subscriber *subscriber)=0
Detach a specific subscriber.
virtual SubscriberCount attach(fge::Subscriber *subscriber)=0
Attach a specific subscriber.
virtual void onDetach(fge::Subscriber *subscriber)=0
Callback called when a subscriber is detached.
virtual SubscriberCount getCount(fge::Subscriber *subscriber) const =0
Get the SubscriberCount of a specific subscriber.
This class is a useful utility to "link" multiple objects around.
Definition C_subscription.hpp:210
fge::Subscriber & operator=(fge::Subscriber &&n) noexcept=delete
void detach(fge::BaseSubscription *subscription)
Detach from a specific subscription.
Subscriber(fge::Subscriber const &n)
Definition C_subscription.hpp:215
fge::Subscriber & operator=(fge::Subscriber const &n)
Definition C_subscription.hpp:225
void detachAll()
Detach from all subscriptions.
Subscriber(fge::Subscriber &&n) noexcept=delete
virtual void onDetach(fge::BaseSubscription *subscription)
Callback called when a subscription is detached.
Definition C_subscription.hpp:246
virtual ~Subscriber()
When the object is destroyed, it will detach from all subscriptions.
Definition C_subscription.hpp:222
This class is a useful utility to "link" multiple objects around a specific use with automatic lifeti...
Definition C_subscription.hpp:125
Subscription(fge::Subscription const &r)
Definition C_subscription.hpp:130
SubscriberCount attach(fge::Subscriber *subscriber) override
Attach a specific subscriber.
void detachAll() override
Detach all subscribers.
SubscriberCount detachOnce(fge::Subscriber *subscriber) override
Detach only once a specific subscriber.
~Subscription() override
When the object is destroyed, it will detach all subscribers.
Definition C_subscription.hpp:136
SubscriberCount getCount(fge::Subscriber *subscriber) const override
Get the SubscriberCount of a specific subscriber.
bool detach(fge::Subscriber *subscriber) override
Detach a specific subscriber.
fge::Subscription & operator=(fge::Subscription const &r)
Definition C_subscription.hpp:139
This class allow same functionality as Subscription but only allow one subscriber at a time.
Definition C_subscription.hpp:167
SubscriberCount getCount(fge::Subscriber *subscriber) const override
Get the SubscriberCount of a specific subscriber.
bool detach(fge::Subscriber *subscriber) override
Detach a specific subscriber.
void detachAll() override
Detach all subscribers.
virtual ~UniqueSubscription() override
When the object is destroyed, it will detach all subscribers.
Definition C_subscription.hpp:178
SubscriberCount attach(fge::Subscriber *subscriber) override
Attach a specific subscriber.
SubscriberCount detachOnce(fge::Subscriber *subscriber) override
Detach only once a specific subscriber.
fge::UniqueSubscription & operator=(fge::UniqueSubscription const &r)
Definition C_subscription.hpp:181
UniqueSubscription(fge::UniqueSubscription const &r)
Definition C_subscription.hpp:172