/****************************************************************************** * \file SHEventManager.h * \author Loh Xiao Qi * \brief Class declaration for event manager. * * \copyright Copyright (c) 2022 Digipen Institute of Technology. Reproduction * or disclosure of this file or its contents without the prior written consent * of Digipen Institute of Technology is prohibited. ******************************************************************************/ #pragma once #include "SHEvent.h" #include "SHEventReceiver.h" #include #include /****************************************************************************** INSTRUCTIONS FOR USE: On broadcaster side: 1. ******************************************************************************/ namespace SHADE { using ResponseFunction = std::function; using ReceiverPtr = std::shared_ptr; using ResponseVec = std::vector; using StaticResponseVec = std::vector; using EventManagerListener = std::function; class SHEventManager { public: /**************************************************************************** * \brief Returns function pointer to entry point for events. ****************************************************************************/ static EventManagerListener GetListenerFunction(); /**************************************************************************** * \param ListenerConstPtr - Const pointer to listener that sent event. * \param EventType - Templated type for every type of event * \brief Receives event from the listeners. ****************************************************************************/ static void CatchEvent(SHEvent); /**************************************************************************** * \param ResponseFunction - function pointer from receiver to be passed * into event manager to be called when events are broadcasted. * \param SHPackageType - package type that corresponding subscriber is * subscribing to. * \brief Links a function pointer from a subscriber to a particular * package type ****************************************************************************/ static void SubscribeTo(SHEventIdentifier, ReceiverPtr); template static T* BroadcastEvent(T data, SHEventIdentifier eventType); private: // Registry for broadcasters and subscribers static std::unordered_map packageReceiverRegistry; static std::unordered_map dataEventMap; static SHEventHandle handleCounter; /**************************************************************************** * \param ListenerConstPtr - Const pointer to listener that sent event. * \param EventType - Event data * \brief Broadcast event to all receivers that are subscribed to this * listener. ****************************************************************************/ static void Broadcast(SHEvent const&); /**************************************************************************** * \param ReceiverPtr - Pointer to receiver * \param ListenerConstPtr - Const pointer to listener that receiver is * subscribing to. * \brief Registers receiver as a subscriber to listener in the registry. ****************************************************************************/ static void RegisterReceiverToType(SHEventIdentifier, ReceiverPtr); }; }