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
13#include "sen/core/meta/type.h"
17#include "sen/core/obj/object.h"
18
19// std
20#include <functional>
21#include <memory>
22#include <variant>
23
24namespace sen
25{
26
29
30// Forward declarations
31class ObjectProvider;
32
34SEN_STRONG_TYPE(ObjectOwnerId, uint32_t)
35
36template <>
37struct ShouldBePassedByValue<ObjectOwnerId>: std::true_type
38{
39};
40
43{
44 std::shared_ptr<Object> instance;
45 ObjectId id;
46 InterestId interestId;
47 ObjectOwnerId ownerId;
48};
49
52{
53 ObjectId id;
54 std::string name;
56 std::function<std::shared_ptr<impl::ProxyObject>(impl::WorkQueue*, const std::string&, ObjectOwnerId)> proxyMaker;
57 InterestId interestId;
58 ObjectOwnerId ownerId;
59};
60
63using ObjectAddition = std::variant<ObjectInstanceDiscovery, RemoteObjectDiscovery>;
64
67{
68 InterestId interestId;
69 ObjectId objectid;
70 ObjectOwnerId ownerId;
71};
72
74using ObjectAdditionList = std::vector<ObjectAddition>;
75
77using ObjectRemovalList = std::vector<ObjectRemoval>;
78
79// Helpers to extract information out of the previous containers
80[[nodiscard]] inline ObjectId getObjectId(const ObjectAddition& discovery)
81{
82 return std::holds_alternative<ObjectInstanceDiscovery>(discovery) ? std::get<ObjectInstanceDiscovery>(discovery).id
83 : std::get<RemoteObjectDiscovery>(discovery).id;
84}
85
86[[nodiscard]] inline ObjectOwnerId getObjectOwnerId(const ObjectAddition& discovery)
87{
88 return std::holds_alternative<ObjectInstanceDiscovery>(discovery)
89 ? std::get<ObjectInstanceDiscovery>(discovery).ownerId
90 : std::get<RemoteObjectDiscovery>(discovery).ownerId;
91}
92
93[[nodiscard]] inline InterestId getInterestId(const ObjectAddition& discovery)
94{
95 return std::holds_alternative<ObjectInstanceDiscovery>(discovery)
96 ? std::get<ObjectInstanceDiscovery>(discovery).interestId
97 : std::get<RemoteObjectDiscovery>(discovery).interestId;
98}
99
100[[nodiscard]] inline Object* getObjectInstance(const ObjectAddition& discovery)
101{
102 return std::holds_alternative<ObjectInstanceDiscovery>(discovery)
103 ? std::get<ObjectInstanceDiscovery>(discovery).instance.get()
104 : nullptr;
105}
106
107[[nodiscard]] ObjectRemoval makeRemoval(const ObjectAddition& discovery);
108
112{
113public:
116
117 // Force Move-Only behavior here (macro does not work because of the pimpl of the ConcurrentProviderList)
122
123public: // implementation & optimization-related (they return nullptr by default)
124 [[nodiscard]] virtual kernel::impl::RemoteParticipant* isRemoteParticipant() noexcept;
125 [[nodiscard]] virtual kernel::impl::LocalParticipant* isLocalParticipant() noexcept;
126
127protected:
129 virtual void onObjectsAdded(const ObjectAdditionList& additions) = 0;
130
132 virtual void onObjectsRemoved(const ObjectRemovalList& removals) = 0;
133
134private:
135 friend class ObjectProvider;
136 void addProvider(ObjectProvider* provider);
137 void removeProvider(ObjectProvider* provider);
138
139private:
142 struct ConcurrentProviderList;
143 std::unique_ptr<ConcurrentProviderList> providers_;
144};
145
147class ObjectProvider: public std::enable_shared_from_this<ObjectProvider>
148{
149 SEN_NOCOPY_NOMOVE(ObjectProvider)
150
151public:
154
155public:
172 virtual void addListener(ObjectProviderListener* listener, bool notifyAboutExistingObjects);
173
181 virtual void removeListener(ObjectProviderListener* listener, bool notifyAboutExistingObjects);
182
190 virtual void replaceListener(ObjectProviderListener* oldListener, ObjectProviderListener* newListener);
191
193 [[nodiscard]] virtual bool hasListener(ObjectProviderListener* listener) const noexcept;
194
196 [[nodiscard]] virtual bool hasListeners() const noexcept;
197
198protected:
199 friend class ObjectFilter;
200
202 virtual void notifyObjectsAdded(const ObjectAdditionList& additions);
203
205 virtual void notifyObjectsRemoved(const ObjectRemovalList& removals);
206
208 virtual void listenerAdded(ObjectProviderListener* listener, bool notifyAboutExistingObjects);
209
211 virtual void listenerRemoved(ObjectProviderListener* listener, bool notifyAboutExistingObjects);
212
213protected:
215 virtual void notifyAddedOnExistingObjects(ObjectProviderListener* listener) = 0;
216
218 virtual void notifyRemovedOnExistingObjects(ObjectProviderListener* listener) = 0;
219
222
223protected: // helpers for subclasses
229 void forEachListener(const std::function<void(ObjectProviderListener*)>& callback) const;
230
231 void callOnObjectsAdded(ObjectProviderListener* listener, const ObjectAdditionList& additions) const;
232 void callOnObjectsRemoved(ObjectProviderListener* listener, const ObjectRemovalList& removals) const;
233
234private:
235 friend ObjectProviderListener;
236 void listenerDeleted(ObjectProviderListener* listener);
237
238private:
239 struct ConcurrentListenerList;
240 std::unique_ptr<ConcurrentListenerList> listeners_;
241};
242
244
245//----------------------------------------------------------------------------------------------------------------------
246// Inline implementation
247//----------------------------------------------------------------------------------------------------------------------
248
250{
251 if (std::holds_alternative<ObjectInstanceDiscovery>(discovery))
252 {
253 const auto& instanceDiscovery = std::get<ObjectInstanceDiscovery>(discovery);
254 return {instanceDiscovery.interestId, instanceDiscovery.id, instanceDiscovery.ownerId};
255 }
256
257 const auto& remoteObjectDiscovery = std::get<RemoteObjectDiscovery>(discovery);
258 return {remoteObjectDiscovery.interestId, remoteObjectDiscovery.id, remoteObjectDiscovery.ownerId};
259}
260
261} // namespace sen
262
263SEN_STRONG_TYPE_HASHABLE(::sen::ObjectOwnerId)
264
265#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:148
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.
virtual void replaceListener(ObjectProviderListener *oldListener, ObjectProviderListener *newListener)
Replaces an existing listener with a new one without triggering notifications. Keep in mind that the ...
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.
virtual void listenerAdded(ObjectProviderListener *listener, bool notifyAboutExistingObjects)
Does nothing by default.
void forEachListener(const std::function< void(ObjectProviderListener *)> &callback) const
Calls callback once for each registered listener.
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:199
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.
virtual void onObjectsAdded(const ObjectAdditionList &additions)=0
Called when objects are been added to a source.
ObjectProviderListener(const ObjectProviderListener &)=delete
ObjectProviderListener & operator=(const ObjectProviderListener &)=delete
virtual kernel::impl::RemoteParticipant * isRemoteParticipant() noexcept
ObjectProviderListener & operator=(ObjectProviderListener &&other) noexcept
friend class ObjectProvider
Definition object_provider.h:135
virtual void onObjectsRemoved(const ObjectRemovalList &removals)=0
Called when objects will be removed from a source.
virtual kernel::impl::LocalParticipant * isLocalParticipant() noexcept
ObjectProviderListener(ObjectProviderListener &&other) noexcept
std::shared_ptr< Object > instance
Definition object_provider.h:44
ObjectId objectid
Definition object_provider.h:69
ObjectOwnerId ownerId
Definition object_provider.h:70
ObjectId id
Definition object_provider.h:45
ObjectOwnerId ownerId
Definition object_provider.h:47
InterestId interestId
Definition object_provider.h:68
InterestId interestId
Definition object_provider.h:46
Object * getObjectInstance(const ObjectAddition &discovery)
Definition object_provider.h:100
std::variant< ObjectInstanceDiscovery, RemoteObjectDiscovery > ObjectAddition
Holds information about an object that is already present and we explicitly asked for.
Definition object_provider.h:63
ObjectId getObjectId(const ObjectAddition &discovery)
Definition object_provider.h:80
std::vector< ObjectAddition > ObjectAdditionList
Sequence of object additions.
Definition object_provider.h:74
InterestId getInterestId(const ObjectAddition &discovery)
Definition object_provider.h:93
ObjectOwnerId getObjectOwnerId(const ObjectAddition &discovery)
Definition object_provider.h:86
ObjectRemoval makeRemoval(const ObjectAddition &discovery)
Definition object_provider.h:249
std::vector< ObjectRemoval > ObjectRemovalList
Sequence of object removals.
Definition object_provider.h:77
Holds information about an object that has been discovered.
Definition object_provider.h:43
Holds information about an object that has been removed.
Definition object_provider.h:67
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:52
std::function< std::shared_ptr< impl::ProxyObject >(impl::WorkQueue *, const std::string &, ObjectOwnerId)> proxyMaker
Definition object_provider.h:56
ConstTypeHandle< ClassType > type
Definition object_provider.h:55
std::string name
Definition object_provider.h:54
ObjectOwnerId ownerId
Definition object_provider.h:58
ObjectId id
Definition object_provider.h:53
InterestId interestId
Definition object_provider.h:57
Utility to indicate that your class wants to be passed by value in some of the library calls.
Definition class_helpers.h:34