Sen API
Sen Libraries
Loading...
Searching...
No Matches
object_provider.h
Go to the documentation of this file.
1// === object_provider.h ===============================================================================================
2// Sen Infrastructure
3// Released under the Apache License v2.0 (SPDX-License-Identifier Apache-2.0).
4// See the LICENSE.txt file for more information.
5// © Airbus SAS, Airbus Helicopters, and Airbus Defence and Space SAU/GmbH/SAS.
6// =====================================================================================================================
7
8#ifndef SEN_CORE_OBJ_OBJECT_PROVIDER_H
9#define SEN_CORE_OBJ_OBJECT_PROVIDER_H
10
11// sen
12#include "sen/core/meta/type.h"
16#include "sen/core/obj/object.h"
17
18// std
19#include <variant>
20
21namespace sen
22{
23
26
27// Forward declarations
28class ObjectProvider;
29
31SEN_STRONG_TYPE(ObjectOwnerId, uint32_t)
32
33template <>
34struct ShouldBePassedByValue<ObjectOwnerId>: std::true_type
35{
36};
37
40{
41 std::shared_ptr<Object> instance;
42 ObjectId id;
43 InterestId interestId;
44 ObjectOwnerId ownerId;
45};
46
49{
50 ObjectId id;
51 std::string name;
53 std::function<std::shared_ptr<impl::ProxyObject>(impl::WorkQueue*, const std::string&, ObjectOwnerId)> proxyMaker;
54 InterestId interestId;
55 ObjectOwnerId ownerId;
56};
57
60using ObjectAddition = std::variant<ObjectInstanceDiscovery, RemoteObjectDiscovery>;
61
64{
65 InterestId interestId;
66 ObjectId objectid;
67 ObjectOwnerId ownerId;
68};
69
71using ObjectAdditionList = std::vector<ObjectAddition>;
72
74using ObjectRemovalList = std::vector<ObjectRemoval>;
75
76// Helpers to extract information out of the previous containers
77[[nodiscard]] inline ObjectId getObjectId(const ObjectAddition& discovery)
78{
79 return std::holds_alternative<ObjectInstanceDiscovery>(discovery) ? std::get<ObjectInstanceDiscovery>(discovery).id
80 : std::get<RemoteObjectDiscovery>(discovery).id;
81}
82
83[[nodiscard]] inline ObjectOwnerId getObjectOwnerId(const ObjectAddition& discovery)
84{
85 return std::holds_alternative<ObjectInstanceDiscovery>(discovery)
86 ? std::get<ObjectInstanceDiscovery>(discovery).ownerId
87 : std::get<RemoteObjectDiscovery>(discovery).ownerId;
88}
89
90[[nodiscard]] inline InterestId getInterestId(const ObjectAddition& discovery)
91{
92 return std::holds_alternative<ObjectInstanceDiscovery>(discovery)
93 ? std::get<ObjectInstanceDiscovery>(discovery).interestId
94 : std::get<RemoteObjectDiscovery>(discovery).interestId;
95}
96
97[[nodiscard]] inline Object* getObjectInstance(const ObjectAddition& discovery)
98{
99 return std::holds_alternative<ObjectInstanceDiscovery>(discovery)
100 ? std::get<ObjectInstanceDiscovery>(discovery).instance.get()
101 : nullptr;
102}
103
104[[nodiscard]] ObjectRemoval makeRemoval(const ObjectAddition& discovery);
105
109{
110 SEN_MOVE_ONLY(ObjectProviderListener)
111
112public:
115
116public: // implementation & optimization-related (they return nullptr by default)
117 [[nodiscard]] virtual kernel::impl::RemoteParticipant* isRemoteParticipant() noexcept;
118 [[nodiscard]] virtual kernel::impl::LocalParticipant* isLocalParticipant() noexcept;
119
120protected:
122 virtual void onObjectsAdded(const ObjectAdditionList& additions) = 0;
123
125 virtual void onObjectsRemoved(const ObjectRemovalList& removals) = 0;
126
127private:
128 friend class ObjectProvider;
129 void addProvider(ObjectProvider* provider);
130 void removeProvider(ObjectProvider* provider);
131
132private:
133 std::vector<ObjectProvider*> providers_;
134};
135
137class ObjectProvider: public std::enable_shared_from_this<ObjectProvider>
138{
139 SEN_NOCOPY_NOMOVE(ObjectProvider)
140
141public:
142 ObjectProvider() = default;
144
145public:
162 virtual void addListener(ObjectProviderListener* listener, bool notifyAboutExistingObjects);
163
171 virtual void removeListener(ObjectProviderListener* listener, bool notifyAboutExistingObjects);
172
174 [[nodiscard]] virtual bool hasListener(ObjectProviderListener* listener) const noexcept;
175
177 [[nodiscard]] virtual bool hasListeners() const noexcept;
178
179protected:
180 friend class ObjectFilter;
181
183 virtual void notifyObjectsAdded(const ObjectAdditionList& additions);
184
186 virtual void notifyObjectsRemoved(const ObjectRemovalList& removals);
187
189 virtual void listenerAdded(ObjectProviderListener* listener, bool notifyAboutExistingObjects);
190
192 virtual void listenerRemoved(ObjectProviderListener* listener, bool notifyAboutExistingObjects);
193
194protected:
196 virtual void notifyAddedOnExistingObjects(ObjectProviderListener* listener) = 0;
197
199 virtual void notifyRemovedOnExistingObjects(ObjectProviderListener* listener) = 0;
200
203
204protected: // helpers for subclasses
205 void callOnObjectsAdded(ObjectProviderListener* listener, const ObjectAdditionList& additions) const;
206 void callOnObjectsRemoved(ObjectProviderListener* listener, const ObjectRemovalList& removals) const;
207 [[nodiscard]] const std::vector<ObjectProviderListener*>& getListeners() const noexcept;
208
209private:
210 friend ObjectProviderListener;
211 void listenerDeleted(ObjectProviderListener* listener);
212
213private:
214 std::vector<ObjectProviderListener*> listeners_;
215};
216
218
219//----------------------------------------------------------------------------------------------------------------------
220// Inline implementation
221//----------------------------------------------------------------------------------------------------------------------
222
224{
225 if (std::holds_alternative<ObjectInstanceDiscovery>(discovery))
226 {
227 const auto& instanceDiscovery = std::get<ObjectInstanceDiscovery>(discovery);
228 return {instanceDiscovery.interestId, instanceDiscovery.id, instanceDiscovery.ownerId};
229 }
230
231 const auto& remoteObjectDiscovery = std::get<RemoteObjectDiscovery>(discovery);
232 return {remoteObjectDiscovery.interestId, remoteObjectDiscovery.id, remoteObjectDiscovery.ownerId};
233}
234
235} // namespace sen
236
237SEN_STRONG_TYPE_HASHABLE(::sen::ObjectOwnerId)
238
239#endif // SEN_CORE_OBJ_OBJECT_PROVIDER_H
A sen object.
Definition object.h:76
Base class for an entity that is able to produce objects.
Definition object_provider.h:138
virtual void addListener(ObjectProviderListener *listener, bool notifyAboutExistingObjects)
Registers an event listener.
virtual void notifyObjectsAdded(const ObjectAdditionList &additions)
Calls onObjectAdded on all the registered listeners.
virtual void notifyAddedOnExistingObjects(ObjectProviderListener *listener)=0
Subclasses must call onObjectAdded on the listener for all the existing objects.
void notifyRemovedOnExistingObjectsForAllListeners()
Same as notifyRemovedOnExistingObjects but for all registered listeners.
void callOnObjectsAdded(ObjectProviderListener *listener, const ObjectAdditionList &additions) const
virtual ~ObjectProvider()
virtual void listenerRemoved(ObjectProviderListener *listener, bool notifyAboutExistingObjects)
Does nothing by default.
virtual bool hasListener(ObjectProviderListener *listener) const noexcept
Returns true if the listener has been added.
void callOnObjectsRemoved(ObjectProviderListener *listener, const ObjectRemovalList &removals) const
virtual void removeListener(ObjectProviderListener *listener, bool notifyAboutExistingObjects)
Un-registers an event listener.
ObjectProvider()=default
virtual void listenerAdded(ObjectProviderListener *listener, bool notifyAboutExistingObjects)
Does nothing by default.
virtual void notifyRemovedOnExistingObjects(ObjectProviderListener *listener)=0
Subclasses must call onObjectRemoved on the listener for all the existing objects.
friend class ObjectFilter
Definition object_provider.h:180
virtual bool hasListeners() const noexcept
Returns true if there are registered listeners.
virtual void notifyObjectsRemoved(const ObjectRemovalList &removals)
Calls onObjectRemoved on all the registered listeners.
const std::vector< ObjectProviderListener * > & getListeners() const noexcept
virtual void onObjectsAdded(const ObjectAdditionList &additions)=0
Called when objects are been added to a source.
virtual kernel::impl::RemoteParticipant * isRemoteParticipant() noexcept
friend class ObjectProvider
Definition object_provider.h:128
virtual void onObjectsRemoved(const ObjectRemovalList &removals)=0
Called when objects will be removed from a source.
virtual kernel::impl::LocalParticipant * isLocalParticipant() noexcept
std::shared_ptr< Object > instance
Definition object_provider.h:41
ObjectId objectid
Definition object_provider.h:66
ObjectOwnerId ownerId
Definition object_provider.h:67
ObjectId id
Definition object_provider.h:42
ObjectOwnerId ownerId
Definition object_provider.h:44
InterestId interestId
Definition object_provider.h:65
InterestId interestId
Definition object_provider.h:43
Object * getObjectInstance(const ObjectAddition &discovery)
Definition object_provider.h:97
std::variant< ObjectInstanceDiscovery, RemoteObjectDiscovery > ObjectAddition
Holds information about an object that is already present and we explicitly asked for.
Definition object_provider.h:60
ObjectId getObjectId(const ObjectAddition &discovery)
Definition object_provider.h:77
std::vector< ObjectAddition > ObjectAdditionList
Sequence of object additions.
Definition object_provider.h:71
InterestId getInterestId(const ObjectAddition &discovery)
Definition object_provider.h:90
ObjectOwnerId getObjectOwnerId(const ObjectAddition &discovery)
Definition object_provider.h:83
ObjectRemoval makeRemoval(const ObjectAddition &discovery)
Definition object_provider.h:223
std::vector< ObjectRemoval > ObjectRemovalList
Sequence of object removals.
Definition object_provider.h:74
Holds information about an object that has been discovered.
Definition object_provider.h:40
Holds information about an object that has been removed.
Definition object_provider.h:64
TypeHandle< const T > ConstTypeHandle
Definition type.h:319
Strong type for the unique identifier for a transport timer.
Definition native_object_impl.h:39
Definition assert.h:17
STL namespace.
#define SEN_STRONG_TYPE_HASHABLE(name)
Makes your strong type std::hashable. NOLINTNEXTLINE.
Definition strong_type.h:188
#define SEN_STRONG_TYPE(name, native_type)
Helper macro to define strong types. NOLINTNEXTLINE.
Definition strong_type.h:179
Holds information about a remote object that has been discovered.
Definition object_provider.h:49
std::function< std::shared_ptr< impl::ProxyObject >(impl::WorkQueue *, const std::string &, ObjectOwnerId)> proxyMaker
Definition object_provider.h:53
ConstTypeHandle< ClassType > type
Definition object_provider.h:52
std::string name
Definition object_provider.h:51
ObjectOwnerId ownerId
Definition object_provider.h:55
ObjectId id
Definition object_provider.h:50
InterestId interestId
Definition object_provider.h:54
Utility to indicate that your class wants to be passed by value in some of the library calls.
Definition class_helpers.h:34