A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
BaseManager.h
Go to the documentation of this file.
1// Copyright(c) Pixo Group. All Rights Reserved.
2
3#pragma once
4
5#include <unordered_map>
6#include "CoreMinimal.h"
7#include "EventLogService.h"
8#include "UObject/Object.h"
9#include "BaseManager.generated.h"
10
11#define DECLARE_EVENT_HANDLER(TEvent) protected: void HandleEvent_Impl(class TEvent* Event);
12
13#define DEFINE_EVENT_HANDLER(TEventType) \
14static_assert(std::is_base_of<UBaseEvent, TEventType>::value, "Trying to create definiton for invalid event"); \
15Handlers[TEventType::StaticClass()] = [this](UBaseEvent* Event) -> void \
16{ \
17HandleEvent_Impl(Cast<TEventType>(Event)); \
18};
19
20class UBaseEvent;
21
22PRAGMA_DISABLE_OPTIMIZATION
23
28UCLASS(/*Abstract*/)
29class PIXOCORE_API UBaseManager : public UObject
30{
34public:
36
37 template <typename TEventType, typename... TInitializeArgs>
38 void SendEvent(TInitializeArgs... Arguments)
39 {
40 EventLogService::NewEvent<TEventType>(Arguments...);
41 }
42
43 void HandleEvent(UBaseEvent* Event);
44 void SetPrivateOwner(APlayerController* Owner) { PrivateOwner = Owner; }
45 APlayerController* GetPrivateOwner() const { return PrivateOwner; }
47private:
48 UPROPERTY()
49 APlayerController* PrivateOwner;
50
51 using THandlerKey = UClass*;
52 using THandler = TFunction<void(UBaseEvent*)>;
54 struct THandlerHash
55 {
56 std::size_t operator()(THandlerKey code) const
57 {
58 return sizeof(code);
59 }
60 };
61
62 struct THandlerComp
63 {
64 bool operator()(THandlerKey lhs, THandlerKey rhs) const
65 {
66 return lhs == rhs;
67 }
68 };
69
70 using THandlers = std::unordered_map<THandlerKey, THandler, THandlerHash, THandlerComp>;
71
72protected:
73 THandlers Handlers;
74};
75
76PRAGMA_ENABLE_OPTIMIZATION
78template <typename TManagerType>
79FUNCTION_NON_NULL_RETURN_START
80TManagerType* NewManager(APlayerController* Owner, UClass* TargetManagerClass)
81FUNCTION_NON_NULL_RETURN_END
82{
83 static_assert(std::is_base_of<UBaseManager, TManagerType>::value, "TManagerType should derive from UBaseManager");
84 TManagerType* Manager = NewObject<TManagerType>(Owner, TargetManagerClass);
85 Manager->SetPrivateOwner(Owner);
86 return Manager;
87}
#define DECLARE_EVENT_HANDLER(TEvent)
Definition BaseManager.h:11
PRAGMA_ENABLE_OPTIMIZATION FUNCTION_NON_NULL_RETURN_START TManagerType * NewManager(APlayerController *Owner, UClass *TargetManagerClass) FUNCTION_NON_NULL_RETURN_END
Definition BaseManager.h:84
The UBaseEvent class serves as the base class for all events for our event-managers system....
Definition BaseEvent.h:83
It provides functionalities for handling events, sending events, and managing a private owner....
Definition BaseManager.h:32
APlayerController * PrivateOwner
UPROPERTY()
Definition BaseManager.h:53
UClass * THandlerKey
Definition BaseManager.h:55
std::unordered_map< THandlerKey, THandler, THandlerHash, THandlerComp > THandlers
Definition BaseManager.h:74
TFunction< void(UBaseEvent *)> THandler
Definition BaseManager.h:56
void SetPrivateOwner(APlayerController *Owner)
Definition BaseManager.h:46
void SendEvent(TInitializeArgs... Arguments)
Definition BaseManager.h:40
APlayerController * GetPrivateOwner() const
Definition BaseManager.h:47
THandlers Handlers
Definition BaseManager.h:77
bool operator()(THandlerKey lhs, THandlerKey rhs) const
Definition BaseManager.h:68
std::size_t operator()(THandlerKey code) const
Definition BaseManager.h:60