Sen API
Sen Libraries
Loading...
Searching...
No Matches
object_mux.h
Go to the documentation of this file.
1// === object_mux.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_MUX_H
9#define SEN_CORE_OBJ_OBJECT_MUX_H
10
11// sen
13
14// std
15#include <memory>
16#include <mutex>
17
18namespace sen
19{
20
23
24// forward declaration
25class ObjectMux;
26
30{
31 SEN_NOCOPY_NOMOVE(MuxedProviderListener)
32
33public:
36
37public:
39 virtual void onExistingObjectsReadded(const ObjectAdditionList& additions) = 0;
40
42 virtual void onObjectsRefCountReduced(const ObjectRemovalList& removals) = 0;
43
44private:
45 friend class ObjectMux;
46 void addMuxedProvider(ObjectMux* provider);
47 void removeMuxedProvider(ObjectMux* provider);
48
49private:
50 struct ConcurrentMuxedProviderList;
51 std::unique_ptr<ConcurrentMuxedProviderList> muxedProviders_;
52};
53
58class ObjectMux final: public ObjectProviderListener, public ObjectProvider
59{
60public:
61 SEN_NOCOPY_NOMOVE(ObjectMux)
62
63public:
64 ObjectMux() = default;
65 ~ObjectMux() override = default;
66
67public: // implements ObjectProvider (public methods)
68 void addListener(ObjectProviderListener* listener, bool notifyAboutExistingObjects) override;
69 void removeListener(ObjectProviderListener* listener, bool notifyAboutExistingObjects) override;
70 [[nodiscard]] bool hasListener(ObjectProviderListener* listener) const noexcept override;
71 [[nodiscard]] bool hasListeners() const noexcept override;
72
73public:
74 void addMuxedListener(MuxedProviderListener* listener, bool notifyAboutExistingObjects);
75 void removeMuxedListener(MuxedProviderListener* listener, bool notifyAboutExistingObjects);
76 [[nodiscard]] bool hasMuxedListener(MuxedProviderListener* listener) const noexcept;
77
78protected: // implements ObjectProvider (protected methods)
79 void notifyAddedOnExistingObjects(ObjectProviderListener* listener) override;
80 void notifyRemovedOnExistingObjects(ObjectProviderListener* listener) override;
81 void notifyObjectsAdded(const ObjectAdditionList& additions) override;
82 void notifyObjectsRemoved(const ObjectRemovalList& removals) override;
83
84protected:
89
92
93protected: // implements ObjectProviderListener
94 void onObjectsAdded(const ObjectAdditionList& additions) override;
95 void onObjectsRemoved(const ObjectRemovalList& removals) override;
96
97private:
98 using Lock = std::scoped_lock<std::recursive_mutex>;
99
100private:
102 void muxedListenerDeleted(MuxedProviderListener* listener);
103
104private:
105 std::unordered_map<ObjectId, ObjectAdditionList> presentObjects_;
106 mutable std::recursive_mutex listenersMutex_;
107 mutable std::recursive_mutex objectsMutex_;
108
109 std::vector<MuxedProviderListener*> muxedListeners_;
110};
111
113
114} // namespace sen
115
116#endif // SEN_CORE_OBJ_OBJECT_MUX_H
virtual void onObjectsRefCountReduced(const ObjectRemovalList &removals)=0
Called when an object is removed, but other providers for the ObjectMux also provide it.
virtual void onExistingObjectsReadded(const ObjectAdditionList &additions)=0
Called when an object is added that is already present in the ObjectMux's list.
friend class ObjectMux
Definition object_mux.h:45
Converts multiple object providers into one. Providers might reside in different threads....
Definition object_mux.h:59
ObjectMux()=default
void notifyMuxedRemovedOnExistingObjects(MuxedProviderListener *listener)
bool hasListeners() const noexcept override
Returns true if there are registered listeners.
void onObjectsAdded(const ObjectAdditionList &additions) override
Called when objects are been added to a source.
void notifyMuxedAddedOnExistingObjects(MuxedProviderListener *listener)
void callOnObjectsRefCountReduced(MuxedProviderListener *listener, const ObjectRemovalList &removals) const
void removeMuxedListener(MuxedProviderListener *listener, bool notifyAboutExistingObjects)
~ObjectMux() override=default
void notifyExistingObjectsReadded(const ObjectAdditionList &additions)
bool hasListener(ObjectProviderListener *listener) const noexcept override
Returns true if the listener has been added.
void notifyAddedOnExistingObjects(ObjectProviderListener *listener) override
Subclasses must call onObjectAdded on the listener for all the existing objects.
void notifyObjectsRefCountReduced(const ObjectRemovalList &removals)
void removeListener(ObjectProviderListener *listener, bool notifyAboutExistingObjects) override
Un-registers an event listener.
void notifyObjectsRemoved(const ObjectRemovalList &removals) override
Calls onObjectRemoved on all the registered listeners.
void addMuxedListener(MuxedProviderListener *listener, bool notifyAboutExistingObjects)
bool hasMuxedListener(MuxedProviderListener *listener) const noexcept
void notifyRemovedOnExistingObjects(ObjectProviderListener *listener) override
Subclasses must call onObjectRemoved on the listener for all the existing objects.
void notifyObjectsAdded(const ObjectAdditionList &additions) override
Calls onObjectAdded on all the registered listeners.
friend class MuxedProviderListener
Definition object_mux.h:101
void addListener(ObjectProviderListener *listener, bool notifyAboutExistingObjects) override
Registers an event listener.
void callOnExistingObjectsReadded(MuxedProviderListener *listener, const ObjectAdditionList &additions) const
void onObjectsRemoved(const ObjectRemovalList &removals) override
Called when objects will be removed from a source.
friend class ObjectProvider
Definition object_provider.h:135
std::vector< ObjectAddition > ObjectAdditionList
Sequence of object additions.
Definition object_provider.h:74
std::vector< ObjectRemoval > ObjectRemovalList
Sequence of object removals.
Definition object_provider.h:77
Definition assert.h:17
STL namespace.