5#include "Containers/Array.h"
8#include "Containers/Set.h"
48#include "TypedElementRegistry.generated.h"
78 UFUNCTION(BlueprintPure, DisplayName=
"Get Default Typed Element Registry", Category =
"TypedElementFramework|Registry", meta=(ScriptName=
"GetDefaultTypedElementRegistry"))
88 return OnElementReplacedDelegate;
97 return OnElementUpdatedDelegate;
106 return OnProcessingDeferredElementsToDestroyDelegate;
149 template <
typename ElementDataType,
bool bSupportScriptHandles>
158 template <
typename BaseInterfaceType>
161 checkf(
InElementInterface->GetClass()->ImplementsInterface(BaseInterfaceType::UClassType::StaticClass()),
TEXT(
"The InElementInterface pass must implement the interface to register."));
168 template <
typename BaseInterfaceType>
177 template <
typename BaseInterfaceType>
194 UFUNCTION(BlueprintPure, Category=
"TypedElementFramework|Registry")
213 template <
typename ElementDataType>
232 template <
typename ElementDataType>
268 template <
typename BaseInterfaceType>
272 GetElementImpl(
InElementId, BaseInterfaceType::UClassType::StaticClass(), Element);
289 template <
typename BaseInterfaceType>
293 GetElementImpl(
InElementHandle, BaseInterfaceType::UClassType::StaticClass(), Element);
326 template <
typename ElementDataType>
335 template <
typename ElementDataType>
409 checkf(
Registry,
TEXT(
"FDisableElementDestructionOnGC must be used with a valid registry!"));
410 Registry->IncrementDisableElementDestructionOnGCCount();
415 Registry->DecrementDisableElementDestructionOnGCCount();
429 struct FRegisteredElementType
431 virtual ~FRegisteredElementType() =
default;
437 virtual void ProcessDeferredElementsToRemove() = 0;
440 virtual FName GetDataTypeName()
const = 0;
448 template <
typename ElementDataType,
bool bSupportScriptHandles>
449 struct TRegisteredElementType :
public FRegisteredElementType
451 virtual ~TRegisteredElementType() =
default;
463 HandleDataStore.DisableScriptHandlesForElement(
InElementId);
483 return HandleDataStore.GetInternalDataForScriptHandle(
InElementId);
493 return HandleDataStore.GetDataForElement(
InElementId);
496 virtual void ProcessDeferredElementsToRemove()
override
503 DeferredElementsToRemove.Reset();
516 virtual FName GetDataTypeName()
const override
532 template <
typename ElementDataType>
549 template <
typename ElementDataType>
559 template <
typename BaseInterfaceType>
572 if constexpr (std::is_void<BaseInterfaceType>::value)
584 template <
typename BaseInterfaceType>
597 if constexpr (std::is_void<BaseInterfaceType>::value)
629 ? RegisteredElementTypes[
InTypeId - 1].Get()
633 FRegisteredElementType* GetRegisteredElementTypeFromName(
const FName&
InTypeName)
const
639 return RegisteredElementTypes[(*TypeId) - 1].Get();
651 inline void IncrementDisableElementDestructionOnGCCount()
653 checkf(DisableElementDestructionOnGCCount !=
MAX_uint8,
TEXT(
"DisableElementDestructionOnGCCount overflow!"));
654 ++DisableElementDestructionOnGCCount;
657 inline void DecrementDisableElementDestructionOnGCCount()
659 checkf(DisableElementDestructionOnGCCount != 0,
TEXT(
"DisableElementDestructionOnGCCount underflow!"));
660 --DisableElementDestructionOnGCCount;
672 uint8 DisableElementDestructionOnGCCount = 0;
673 bool bIsWithinFrame =
false;
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
TSizedDefaultAllocator< 32 > FDefaultAllocator
Definition ContainerAllocationPolicies.h:831
@ INDEX_NONE
Definition CoreMiscDefines.h:150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
#define LLM_SCOPE(...)
Definition LowLevelMemTracker.h:1095
#define MAX_uint8
Definition NumericLimits.h:19
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UFUNCTION(...)
Definition ObjectMacros.h:745
#define UCLASS(...)
Definition ObjectMacros.h:776
CORE_API bool IsInGameThread()
Definition ThreadingBase.cpp:185
constexpr TTuple< std::decay_t< Types >... > MakeTuple(Types &&... Args)
Definition Tuple.h:794
uint8 FTypedHandleTypeId
Definition TypedElementLimits.h:29
int32 FTypedHandleElementId
Definition TypedElementLimits.h:30
constexpr SIZE_T TypedHandleMaxTypeId
Definition TypedElementLimits.h:23
UE_FORCEINLINE_HINT TUniquePtr< T > MakeUnique(TArgs &&... Args)
Definition UniquePtr.h:918
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition NameTypes.h:617
Definition UObjectGlobals.h:2492
Definition ScopeLock.h:141
Definition TypedElementData.h:375
Definition TypedElementData.h:157
Definition ArrayView.h:139
Definition SharedPointer.h:153
Definition SortedMap.h:20
Definition SubclassOf.h:30
Definition TypedElementData.h:538
static FTypedHandleTypeId StaticDataTypeId()
Definition TypedElementData.h:604
static void SetStaticDataTypeId(const FTypedHandleTypeId InTypeId)
Definition TypedElementData.h:598
static FName StaticDataTypeName()
Definition TypedElementData.h:609
Definition TypedElementData.h:328
Definition TypedElementList.h:62
static TYPEDELEMENTFRAMEWORK_API TTypedElementListRef Private_CreateElementList(UTypedElementRegistry *InRegistry)
Definition TypedElementList.cpp:139
Definition UniquePtr.h:107
Definition ScopeRWLock.h:21
Definition ScopeRWLock.h:60
Definition Interface.h:19
Definition TypedElementRegistry.h:55
FOnElementReplaced & OnElementReplaced()
Definition TypedElementRegistry.h:86
UObject * GetElementInterface(const FTypedElementHandle &InElementHandle, const TSubclassOf< UInterface > InBaseInterfaceType) const
Definition TypedElementRegistry.h:186
void Private_OnElementListCreated(FTypedElementList *InElementList)
Definition TypedElementRegistry.h:371
FTypedElement GetElement(const FTypedElementId &InElementId, const TSubclassOf< UInterface > &InBaseInterfaceType) const
Definition TypedElementRegistry.h:258
DECLARE_MULTICAST_DELEGATE_OneParam(FOnElementUpdated, TArrayView< const FTypedElementHandle >)
FTypedHandleTypeId GetRegisteredElementTypeId(const FName InElementTypeName) const
Definition TypedElementRegistry.h:113
FTypedElementOwner CreateElement(const FName InElementTypeName, const FTypedHandleElementId InElementId)
Definition TypedElementRegistry.h:204
FTypedElement GetElement(const FTypedElementHandle &InElementHandle, const TSubclassOf< UInterface > &InBaseInterfaceType) const
Definition TypedElementRegistry.h:279
FTypedElementListRef CreateElementList(const TArray< TTypedElementOwner< ElementDataType > > &InElementOwners)
Definition TypedElementRegistry.h:327
FTypedElementListRef CreateElementList(TArrayView< const TTypedElementOwner< ElementDataType > > InElementOwners)
Definition TypedElementRegistry.h:336
void DestroyElement(TTypedElementOwner< ElementDataType > &InOutElementOwner)
Definition TypedElementRegistry.h:233
TTypedElement< BaseInterfaceType > GetElement(const FTypedElementHandle &InElementHandle) const
Definition TypedElementRegistry.h:290
void DestroyElement(FTypedElementOwner &InOutElementOwner)
Definition TypedElementRegistry.h:223
void Private_OnElementListDestroyed(FTypedElementList *InElementList)
Definition TypedElementRegistry.h:377
TTypedElement< BaseInterfaceType > GetElement(const FTypedElementId &InElementId) const
Definition TypedElementRegistry.h:269
void Private_GetElementImpl(const FTypedElementHandle &InElementHandle, const TSubclassOf< UInterface > &InBaseInterfaceType, FTypedElement &OutElement) const
Definition TypedElementRegistry.h:397
TTypedElementOwner< ElementDataType > CreateElement(const FName InElementTypeName)
Definition TypedElementRegistry.h:214
FSimpleMulticastDelegate & OnProcessingDeferredElementsToDestroy()
Definition TypedElementRegistry.h:104
void RegisterElementType(const FName InElementTypeName, bool bSupportScriptHandles)
Definition TypedElementRegistry.h:133
FOnElementUpdated & OnElementUpdated()
Definition TypedElementRegistry.h:95
BaseInterfaceType * GetElementInterface(const FTypedHandleTypeId InElementTypeId) const
Definition TypedElementRegistry.h:169
void Private_OnElementListCreated(FScriptTypedElementList *InElementList)
Definition TypedElementRegistry.h:384
void RegisterElementInterface(const FName InElementTypeName, UObject *InElementInterface, const bool InAllowOverride=false)
Definition TypedElementRegistry.h:159
FScriptTypedElementHandle CreateScriptHandle(const FTypedElementId &InElementId)
Definition TypedElementRegistry.h:352
void RegisterElementType(const FName InElementTypeName)
Definition TypedElementRegistry.h:150
FTypedElementListRef CreateElementList()
Definition TypedElementRegistry.h:300
DECLARE_MULTICAST_DELEGATE_OneParam(FOnElementReplaced, FOnElementReplaced_Payload)
FScriptTypedElementListRef CreateScriptElementList()
Definition TypedElementRegistry.h:308
BaseInterfaceType * GetElementInterface(const FTypedElementHandle &InElementHandle) const
Definition TypedElementRegistry.h:178
FName GetRegisteredElementTypeName(const FTypedHandleTypeId InElementTypeId) const
Definition TypedElementRegistry.h:123
void Private_OnElementListDestroyed(FScriptTypedElementList *InElementList)
Definition TypedElementRegistry.h:390
@ Error
Definition LogVerbosity.h:28
void GetElementImpl(const UTypedElementRegistry *InRegistry, const FTypedElementHandle &InElementHandle, const TSubclassOf< UInterface > &InBaseInterfaceType, FTypedElement &OutElement)
Definition TypedElementList.cpp:9
static COREUOBJECT_API void KismetExecutionMessage(const TCHAR *Message, ELogVerbosity::Type Verbosity, FName WarningId=FName())
Definition ScriptCore.cpp:644
Definition NameTypes.h:1639
Definition TypedElementHandle.h:625
void Private_Initialize(FScriptTypedElementInternalDataPtr &&InInternalData)
Definition TypedElementHandle.h:678
Definition TypedElementHandle.h:18
Definition TypedElementId.h:17
static TYPEDELEMENTFRAMEWORK_API const FTypedElementId Unset
Definition TypedElementId.h:116
Definition TypedElementHandle.h:409
void Private_InitializeAddRef(TTypedElementInternalData< ElementDataType > &InData)
Definition TypedElementHandle.h:559
Definition TypedElementHandle.h:396
Definition TypedElementRegistry.h:404
FDisableElementDestructionOnGC(UTypedElementRegistry *InRegistry)
Definition TypedElementRegistry.h:406
FDisableElementDestructionOnGC(const FDisableElementDestructionOnGC &)=delete
~FDisableElementDestructionOnGC()
Definition TypedElementRegistry.h:413
FDisableElementDestructionOnGC & operator=(FDisableElementDestructionOnGC &&)=delete
FDisableElementDestructionOnGC & operator=(const FDisableElementDestructionOnGC &)=delete
FDisableElementDestructionOnGC(FDisableElementDestructionOnGC &&)=delete