From a867ecbcbf7ee66330d2b59a5a297b0f9fe04f05 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Mon, 19 Sep 2022 17:08:08 +0800 Subject: [PATCH] SP3-108 Shifted definitions for functions in Event Manager from cpp to hpp --- .../src/ECS_Base/Managers/SHEntityManager.h | 2 +- SHADE_Engine/src/Events/SHEvent.h | 4 +- SHADE_Engine/src/Events/SHEventManager.cpp | 101 ------------------ .../{SHEventManager.h => SHEventManager.hpp} | 97 +++++++++++------ 4 files changed, 67 insertions(+), 137 deletions(-) delete mode 100644 SHADE_Engine/src/Events/SHEventManager.cpp rename SHADE_Engine/src/Events/{SHEventManager.h => SHEventManager.hpp} (78%) diff --git a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h index a9560fa3..193fb17d 100644 --- a/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h +++ b/SHADE_Engine/src/ECS_Base/Managers/SHEntityManager.h @@ -22,7 +22,7 @@ #include "../SHECSMacros.h" #include "ECS_Base/Events/SHEntityCreationEvent.h" #include "ECS_Base/Events/SHEntityDestroyedEvent.h" -#include "Events/SHEventManager.h" +#include "Events/SHEventManager.hpp" #include "SH_API.h" namespace SHADE diff --git a/SHADE_Engine/src/Events/SHEvent.h b/SHADE_Engine/src/Events/SHEvent.h index 217609d3..6d246f3d 100644 --- a/SHADE_Engine/src/Events/SHEvent.h +++ b/SHADE_Engine/src/Events/SHEvent.h @@ -22,11 +22,11 @@ namespace SHADE template struct SHEventSpec : SHEvent { - SHEventSpec(SHEventIdentifier t, SHEventHandle e, T* dp) + SHEventSpec(SHEventIdentifier t, SHEventHandle e, std::shared_ptr dp) :SHEvent{ t, e }, data{ dp } {} std::shared_ptr data; }; - using SHEventPtr = std::shared_ptr; + using SHEventPtr = std::shared_ptr; } diff --git a/SHADE_Engine/src/Events/SHEventManager.cpp b/SHADE_Engine/src/Events/SHEventManager.cpp deleted file mode 100644 index 4372cf6d..00000000 --- a/SHADE_Engine/src/Events/SHEventManager.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/****************************************************************************** - * \file SHEventManager.cpp - * \author Loh Xiao Qi - * \brief Function Implmentations for SHEventManager - * - * \copyright Copyright (c) 2021 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 - ******************************************************************************/ -#include "SHpch.h" -#include "SHEventManager.h" - -namespace SHADE -{ - std::unordered_map SHEventManager::packageReceiverRegistry; - - SHEventHandle SHEventManager::handleCounter{ 0 }; - - /**************************************************************************** - * \param ListenerConstPtr - Const pointer to listener that sent event. - * \param EventType - Templated type for every type of event - - * \brief Receives event from the listeners. - ****************************************************************************/ - void SHEventManager::CatchEvent(SHEventPtr event) - { - - // Do something with the event - - Broadcast(event); - } - - /**************************************************************************** - * \param ResponseFunction - function pointer from receiver to be passed - * into event manager to be called when events are broadcasted. - * \param SHEventIdentifier - package type that corresponding subscriber is - * subscribing to. - - * \brief Links a function pointer from a subscriber to a particular - * package type - ****************************************************************************/ - void SHEventManager::SubscribeTo(SHEventIdentifier pkgType, ReceiverPtr receiver) - { - RegisterReceiverToType(pkgType, receiver); - } - - template - void SHEventManager::BroadcastEvent(T data, SHEventIdentifier eventType) - { - std::shared_ptr data = std::make_shared(data); - - CatchEvent( - reinterpret_cast - ( - std::make_shared>(eventType, handleCounter++, data) - ) - ); - } - - /**************************************************************************** - * \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. - ****************************************************************************/ - void SHEventManager::RegisterReceiverToType( - SHEventIdentifier pkgType, ReceiverPtr receiver) - { - if (packageReceiverRegistry.contains(pkgType)) - { - packageReceiverRegistry[pkgType].emplace_back(receiver); - } - else - { - packageReceiverRegistry.emplace(pkgType, std::vector{ receiver }); - } - } - - /**************************************************************************** - * \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. - ****************************************************************************/ - void SHEventManager::Broadcast(SHEventPtr event) - { - ResponseVec& receivers{ packageReceiverRegistry[event->type] }; - for (auto& receiver : receivers) - { - receiver->Receive(event); - } - - //auto& funcs{ ackageReceiverRegistry[event.GetType()] }; - //for (auto func : funcs) - //{ - // func(event.GetData()); - //} - } -} diff --git a/SHADE_Engine/src/Events/SHEventManager.h b/SHADE_Engine/src/Events/SHEventManager.hpp similarity index 78% rename from SHADE_Engine/src/Events/SHEventManager.h rename to SHADE_Engine/src/Events/SHEventManager.hpp index b9ea370c..f511518a 100644 --- a/SHADE_Engine/src/Events/SHEventManager.h +++ b/SHADE_Engine/src/Events/SHEventManager.hpp @@ -1,5 +1,5 @@ /****************************************************************************** - * \file SHEventManager.h + * \file SHEventManager.hpp * \author Loh Xiao Qi * \brief Class declaration for event manager. * @@ -9,10 +9,9 @@ ******************************************************************************/ #pragma once +#include "SHpch.h" #include "SHEvent.h" #include "SHEventReceiver.h" -#include -#include /****************************************************************************** INSTRUCTIONS FOR USE: @@ -28,7 +27,7 @@ overload the assignment operator accordingly. It is fine to send a single object of a basic type such as int/float. - Headers required: SHEventManager.h + Headers required: SHEventManager.hpp On Receiver side: 1. Create a function with the signature: @@ -54,7 +53,7 @@ 4. Inside the new ptr should be a shared pointer of const CustomClass type. - Headers required: SHEventManager.h, SHEventReceiver.h + Headers required: SHEventManager.hpp, SHEventReceiver.h If you have any questions/suggestions for improvement lmk. ******************************************************************************/ @@ -70,6 +69,48 @@ namespace SHADE class SHEventManager { + private: + + // Registry for broadcasters and subscribers + inline static std::unordered_map packageReceiverRegistry; + + inline static SHEventHandle handleCounter {0}; + + /**************************************************************************** + * \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(SHEventPtr event) + { + ResponseVec& receivers{ packageReceiverRegistry[event->type] }; + for (auto& receiver : receivers) + { + receiver->Receive(event); + } + } + + /**************************************************************************** + * \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 pkgType, ReceiverPtr receiver) + { + if (packageReceiverRegistry.find(pkgType) == packageReceiverRegistry.end()) + { + packageReceiverRegistry.emplace(pkgType, std::vector{ receiver }); + } + else + { + packageReceiverRegistry[pkgType].emplace_back(receiver); + } + } + public: /**************************************************************************** @@ -78,7 +119,13 @@ namespace SHADE * \brief Receives event from the listeners. ****************************************************************************/ - static void CatchEvent(SHEventPtr); + static void CatchEvent(SHEventPtr event) + { + + // Do something with the event + + Broadcast(event); + } /**************************************************************************** * \param ResponseFunction - function pointer from receiver to be passed @@ -89,36 +136,20 @@ namespace SHADE * \brief Links a function pointer from a subscriber to a particular * package type ****************************************************************************/ - static void SubscribeTo(SHEventIdentifier, ReceiverPtr); + static void SubscribeTo(SHEventIdentifier pkgType, ReceiverPtr receiver) + { + RegisterReceiverToType(pkgType, receiver); + } template - static void BroadcastEvent(T data, SHEventIdentifier eventType); - - private: - - // Registry for broadcasters and subscribers - static std::unordered_map packageReceiverRegistry; - - 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(SHEventPtr event); - - /**************************************************************************** - * \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); + static void BroadcastEvent(T data, SHEventIdentifier eventType) + { + std::shared_ptr ptr = std::make_shared(data); + CatchEvent( + std::make_shared>(eventType, handleCounter++, ptr) + ); + } }; } -- 2.40.1