11 #include "EventStreamDetail.h" 12 #include "JobManager.h" 13 #include "threads/CriticalSection.h" 21 template<
typename Event>
27 void Subscribe(
A* owner,
void (
A::*fn)(
const Event&))
29 auto subscription = std::make_shared<detail::CSubscription<Event, A>>(owner, fn);
30 std::unique_lock<CCriticalSection> lock(m_criticalSection);
31 m_subscriptions.emplace_back(std::move(subscription));
35 void Unsubscribe(
A* obj)
37 std::vector<std::shared_ptr<detail::ISubscription<Event>>> toCancel;
39 std::unique_lock<CCriticalSection> lock(m_criticalSection);
40 auto it = m_subscriptions.begin();
41 while (it != m_subscriptions.end())
43 if ((*it)->IsOwnedBy(obj))
45 toCancel.push_back(*it);
46 it = m_subscriptions.erase(it);
54 for (
auto& subscription : toCancel)
55 subscription->Cancel();
59 std::vector<std::shared_ptr<detail::ISubscription<Event>>> m_subscriptions;
60 CCriticalSection m_criticalSection;
64 template<
typename Event>
68 explicit CEventSource() : m_queue(
false, 1, CJob::PRIORITY_HIGH) {}
73 std::unique_lock<CCriticalSection> lock(this->m_criticalSection);
74 auto& subscriptions = this->m_subscriptions;
75 auto task = [subscriptions, event](){
76 for (
auto& s: subscriptions)
77 s->HandleEvent(event);
80 m_queue.Submit(std::move(task));
87 template<
typename Event>
92 void HandleEvent(
A event)
94 std::unique_lock<CCriticalSection> lock(this->m_criticalSection);
95 for (
const auto& subscription : this->m_subscriptions)
97 subscription->HandleEvent(event);
Definition: EventStream.h:65
Definition: ArraysTest1.cpp:27
Definition: EventStream.h:88
Definition: EventStream.h:22
Job Queue class to handle a queue of unique jobs to be processed sequentially.
Definition: JobManager.h:63