5#include "CoreMinimal.h"
6#include "JsonEventSubscription.h"
10template <
class TEvent>
11TJsonEventSubscription<TEvent>& GetSubscription(TMap<FName, FEventSubscriptionPtr>& Subscriptions)
13 const FName& EventType = TEvent::StaticType();
14 const FEventSubscriptionPtr* Existing = Subscriptions.Find(EventType);
15 const FEventSubscriptionPtr& Subscription = Existing ? *Existing : Subscriptions.Emplace(EventType, MakeShared<TJsonEventSubscription<TEvent>>());
16 return StaticCast<TJsonEventSubscription<TEvent>&>(*Subscription);
19template <
class TEvent>
20FDelegateHandle SubscribeToEvent(TMap<FName, FEventSubscriptionPtr>& Subscriptions, TEventDelegate<TEvent> Callback)
22 return Detail::GetSubscription<TEvent>(Subscriptions).Delegate.Add(MoveTemp(Callback));
25template <
class TEvent,
class UserClass>
26FDelegateHandle SubscribeToUObjectEvent(
27 TMap<FName, FEventSubscriptionPtr>& Subscriptions,
29 TEventDelegateUObjectMethodPtr<TEvent, UserClass> InMethod)
31 const TEventDelegate<TEvent> Delegate = TEventDelegate<TEvent>::CreateUObject(InObj, InMethod);
32 return Detail::SubscribeToEvent<TEvent>(Subscriptions, Delegate);
35template <
class TEvent,
class UserClass>
36FDelegateHandle SubscribeToSpEvent(TMap<FName, FEventSubscriptionPtr>& Subscriptions, UserClass* InObj, TEventDelegateSpMethodPtr<TEvent, UserClass> InMethod)
38 const TEventDelegate<TEvent> Delegate = TEventDelegate<TEvent>::CreateSP(InObj, InMethod);
39 return Detail::SubscribeToEvent<TEvent>(Subscriptions, Delegate);
42template <
class TEvent,
typename FunctorType,
typename... VarTypes>
43FDelegateHandle SubscribeToLambdaEvent(TMap<FName, FEventSubscriptionPtr>& Subscriptions, FunctorType&& InFunctor, VarTypes... Vars)
45 const TEventDelegate<TEvent> Delegate = TEventDelegate<TEvent>::CreateLambda(Forward<FunctorType>(InFunctor), Vars...);
46 return Detail::SubscribeToEvent<TEvent>(Subscriptions, Delegate);
49template <
class TEvent>
50bool UnsubscribeFromEvent(TMap<FName, FEventSubscriptionPtr>& Subscriptions, FDelegateHandle DelegateHandle)
52 return Detail::GetSubscription<TEvent>(Subscriptions).Delegate.Remove(DelegateHandle);