From a9514513a72632561a3d36292fbe34e12ba2c0d5 Mon Sep 17 00:00:00 2001 From: Sidharth Guglani Date: Wed, 15 May 2019 08:57:50 -0700 Subject: [PATCH] use vector for subscribers in event system Summary: Replaced global event subscriber with a vector of subscriber functions Further changes in commit stack support the mutiple subscribers in event system Reviewed By: davidaurelio Differential Revision: D15352451 fbshipit-source-id: 7ca6f0943735bf1f76a906c23e15e14ae3c5f42c --- yoga/event/event.cpp | 23 +++++++++-------------- yoga/event/event.h | 2 ++ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/yoga/event/event.cpp b/yoga/event/event.cpp index bde5fca8..29b6493e 100644 --- a/yoga/event/event.cpp +++ b/yoga/event/event.cpp @@ -15,31 +15,26 @@ namespace yoga { namespace { -// For now, a single subscriber is enough. -// This can be changed as soon as the need for more than one subscriber arises. -std::function& globalEventSubscriber() { - static std::function subscriber = nullptr; - return subscriber; +Event::Subscribers& eventSubscribers() { + static Event::Subscribers subscribers = {}; + return subscribers; } } // namespace void Event::reset() { - globalEventSubscriber() = nullptr; + eventSubscribers() = {}; } void Event::subscribe(std::function&& subscriber) { - if (globalEventSubscriber() != nullptr) { - throw std::logic_error( - "Yoga currently supports only one global event subscriber"); - } - globalEventSubscriber() = std::move(subscriber); + eventSubscribers().push_back(subscriber); } void Event::publish(const YGNode& node, Type eventType, const Data& eventData) { - auto& subscriber = globalEventSubscriber(); - if (subscriber) { - subscriber(node, eventType, eventData); + for (auto& subscriber : eventSubscribers()) { + if (subscriber) { + subscriber(node, eventType, eventData); + } } } diff --git a/yoga/event/event.h b/yoga/event/event.h index c86d5bde..578d2f3a 100644 --- a/yoga/event/event.h +++ b/yoga/event/event.h @@ -7,6 +7,7 @@ #pragma once #include +#include struct YGConfig; struct YGNode; @@ -24,6 +25,7 @@ struct Event { }; class Data; using Subscriber = void(const YGNode&, Type, Data); + using Subscribers = std::vector>; template struct TypedData {};