11#pragma once
2- #include " eventbus/InternalEventStream.h"
2+ #include " ../../src/eventbus/EventDispatcherFactory.h"
3+ #include " ../../src/eventbus/EventStream.h"
4+ #include " ../../src/eventbus/SubscriptionFlags.h"
35#include < any>
46#include < mutex>
57#include < typeindex>
@@ -10,6 +12,12 @@ namespace ECFMP::EventBus {
1012 class EventBus
1113 {
1214 public:
15+ explicit EventBus (const std::shared_ptr<EventDispatcherFactory>& dispatcherFactory)
16+ : dispatcherFactory(dispatcherFactory)
17+ {
18+ assert (dispatcherFactory != nullptr && " Dispatcher factory cannot be null" );
19+ }
20+
1321 virtual ~EventBus () = default ;
1422 /* *
1523 * Subscribes the given listener to the event stream.
@@ -24,7 +32,15 @@ namespace ECFMP::EventBus {
2432 void
2533 Subscribe (std::shared_ptr<EventListener<EventType>> listener, std::shared_ptr<EventFilter<EventType>> filter)
2634 {
27- GetStream<EventType>().Subscribe (listener, filter);
35+ if (listener == nullptr ) {
36+ throw std::invalid_argument (" Listener cannot be null" );
37+ }
38+
39+ Subscribe<EventType>(EventSubscription{
40+ dispatcherFactory->CreateDispatcher <EventType>(listener, EventDispatchMode::Euroscope),
41+ listener,
42+ filter,
43+ {EventDispatchMode::Euroscope, false }});
2844 };
2945
3046 /* *
@@ -41,7 +57,15 @@ namespace ECFMP::EventBus {
4157 std::shared_ptr<EventListener<EventType>> listener, std::shared_ptr<EventFilter<EventType>> filter
4258 )
4359 {
44- GetStream<EventType>().SubscribeOnce (listener, filter);
60+ if (listener == nullptr ) {
61+ throw std::invalid_argument (" Listener cannot be null" );
62+ }
63+
64+ Subscribe<EventType>(EventSubscription{
65+ dispatcherFactory->CreateDispatcher <EventType>(listener, EventDispatchMode::Euroscope),
66+ listener,
67+ filter,
68+ {EventDispatchMode::Euroscope, true }});
4569 };
4670
4771 /* *
@@ -55,18 +79,28 @@ namespace ECFMP::EventBus {
5579 return GetStream<EventType>().template HasListenerOfType <ListenerType>();
5680 }
5781
82+ protected:
83+ template <typename ListenerType, typename EventType>
84+ void Subscribe (const EventSubscription<EventType>& subscription)
85+ {
86+ GetStream<EventType>().Subscribe (subscription);
87+ }
88+
89+ // Factory for dispatchers
90+ std::shared_ptr<EventDispatcherFactory> dispatcherFactory;
91+
5892 private:
5993 template <typename EventType>
60- auto GetStream () -> InternalEventStream <EventType>&
94+ auto GetStream () -> EventStream <EventType>&
6195 {
6296 auto lock = std::lock_guard (mutex);
6397
6498 const auto index = std::type_index (typeid (EventType));
6599 if (!streams.contains (index)) {
66- streams.insert ({index, std::any (std::make_shared<InternalEventStream <EventType>>())});
100+ streams.insert ({index, std::any (std::make_shared<EventStream <EventType>>())});
67101 }
68102
69- return *std::any_cast<std::shared_ptr<InternalEventStream <EventType>>>(streams.at (index));
103+ return *std::any_cast<std::shared_ptr<EventStream <EventType>>>(streams.at (index));
70104 }
71105
72106 // Protects the streams map
0 commit comments