UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TypedElementRegistry.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
8#include "Containers/Set.h"
11#include "CoreMinimal.h"
12#include "CoreTypes.h"
13#include "Delegates/Delegate.h"
23#include "HAL/CriticalSection.h"
24#include "HAL/PlatformCrt.h"
26#include "Math/NumericLimits.h"
28#include "Misc/ScopeLock.h"
29#include "Misc/ScopeRWLock.h"
31#include "Templates/Casts.h"
34#include "Templates/Tuple.h"
35#include "Templates/UniquePtr.h"
37#include "UObject/Class.h"
38#include "UObject/Interface.h"
39#include "UObject/NameTypes.h"
40#include "UObject/Object.h"
43#include "UObject/Stack.h"
45
46#include <type_traits>
47
48#include "TypedElementRegistry.generated.h"
49
53UCLASS(Transient, MinimalAPI)
55{
57
58public:
60
61 //~ UObject interface
62 TYPEDELEMENTFRAMEWORK_API virtual void FinishDestroy() override;
63 static TYPEDELEMENTFRAMEWORK_API void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector);
64
68 static TYPEDELEMENTFRAMEWORK_API void Private_InitializeInstance();
69
73 static TYPEDELEMENTFRAMEWORK_API void Private_ShutdownInstance();
74
78 UFUNCTION(BlueprintPure, DisplayName="Get Default Typed Element Registry", Category = "TypedElementFramework|Registry", meta=(ScriptName="GetDefaultTypedElementRegistry"))
80
87 {
88 return OnElementReplacedDelegate;
89 }
90
96 {
97 return OnElementUpdatedDelegate;
98 }
99
105 {
106 return OnProcessingDeferredElementsToDestroyDelegate;
107 }
108
114 {
115 const FRegisteredElementType* RegisteredElementType = GetRegisteredElementTypeFromName(InElementTypeName);
116 return RegisteredElementType ? RegisteredElementType->TypeId : 0;
117 }
118
124 {
125 const FRegisteredElementType* RegisteredElementType = GetRegisteredElementTypeFromId(InElementTypeId);
127 }
128
134 {
136 {
138 }
139 else
140 {
142 }
143 }
144
149 template <typename ElementDataType, bool bSupportScriptHandles>
154
158 template <typename BaseInterfaceType>
160 {
161 checkf(InElementInterface->GetClass()->ImplementsInterface(BaseInterfaceType::UClassType::StaticClass()), TEXT("The InElementInterface pass must implement the interface to register."));
162 RegisterElementInterfaceImpl(InElementTypeName, InElementInterface, BaseInterfaceType::UClassType::StaticClass(), InAllowOverride);
163 }
164
168 template <typename BaseInterfaceType>
170 {
171 return Cast<BaseInterfaceType>(GetElementInterfaceImpl(InElementTypeId, BaseInterfaceType::UClassType::StaticClass()));
172 }
173
177 template <typename BaseInterfaceType>
179 {
180 return Cast<BaseInterfaceType>(GetElementInterfaceImpl(InElementHandle.GetId().GetTypeId(), BaseInterfaceType::UClassType::StaticClass()));
181 }
182
187 {
188 return GetElementInterfaceImpl(InElementHandle.GetId().GetTypeId(), InBaseInterfaceType);
189 }
190
194 UFUNCTION(BlueprintPure, Category="TypedElementFramework|Registry")
196 {
197 return GetElementInterfaceImpl(InElementHandle.GetId().GetTypeId(), InBaseInterfaceType);
198 }
199
208
213 template <typename ElementDataType>
218
227
232 template <typename ElementDataType>
237
243 TYPEDELEMENTFRAMEWORK_API void ProcessDeferredElementsToDestroy();
244
249
254
259 {
260 FTypedElement Element;
261 GetElementImpl(InElementId, InBaseInterfaceType, Element);
262 return Element;
263 }
264
268 template <typename BaseInterfaceType>
270 {
272 GetElementImpl(InElementId, BaseInterfaceType::UClassType::StaticClass(), Element);
273 return Element;
274 }
275
280 {
281 FTypedElement Element;
282 GetElementImpl(InElementHandle, InBaseInterfaceType, Element);
283 return Element;
284 }
285
289 template <typename BaseInterfaceType>
291 {
293 GetElementImpl(InElementHandle, BaseInterfaceType::UClassType::StaticClass(), Element);
294 return Element;
295 }
296
304
312
317
322
326 template <typename ElementDataType>
331
335 template <typename ElementDataType>
337 {
338 FTypedElementListRef ElementList = CreateElementList();
339 ElementList->Append(InElementOwners);
340 return ElementList;
341 }
342
347 TYPEDELEMENTFRAMEWORK_API FString RegistredElementTypesAndInterfacesToString() const;
348
353 {
355 {
357 }
358
359 FRegisteredElementType* RegisteredElementType = GetRegisteredElementTypeFromId(InElementId.GetTypeId());
361 {
362 FFrame::KismetExecutionMessage(TEXT("Element type ID has not been registered to this registry!"), ELogVerbosity::Error);
364 }
365
367 ScriptTypedElementHandle.Private_Initialize(RegisteredElementType->GetDataForScriptElement(InElementId.GetElementId()));
369 }
370
372 {
373 FScopeLock ActiveElementListsLock(&ActiveElementListsCS);
374 ActiveElementLists.Add(InElementList);
375 }
376
378 {
379 FScopeLock ActiveElementListsLock(&ActiveElementListsCS);
380 ActiveElementLists.Remove(InElementList);
381 }
382
383
385 {
386 // Script type element are not thread safe so no need for a critical section
387 ActiveScriptElementLists.Add(InElementList);
388 }
389
391 {
392 // Script type element are not thread safe so no need for a critical section
393 ActiveScriptElementLists.Remove(InElementList);
394 }
395
396 // Note: Access for FTypedElementList
401
404 {
405 public:
408 {
409 checkf(Registry, TEXT("FDisableElementDestructionOnGC must be used with a valid registry!"));
410 Registry->IncrementDisableElementDestructionOnGCCount();
411 }
412
414 {
415 Registry->DecrementDisableElementDestructionOnGCCount();
416 }
417
420
423
424 private:
426 };
427
428private:
429 struct FRegisteredElementType
430 {
431 virtual ~FRegisteredElementType() = default;
432
433 virtual FTypedElementInternalData& AddDataForElement(FTypedHandleElementId& InOutElementId) = 0;
434 virtual void RemoveDataForElement(const FTypedHandleElementId InElementId, const FTypedElementInternalData* InExpectedDataPtr, const bool bDefer) = 0;
435 virtual const FTypedElementInternalData& GetDataForElement(const FTypedHandleElementId InElementId) const = 0;
436 virtual FScriptTypedElementInternalDataPtr GetDataForScriptElement(const FTypedHandleElementId InElementId) = 0;
437 virtual void ProcessDeferredElementsToRemove() = 0;
438 virtual void SetDataTypeId(const FTypedHandleTypeId InTypeId) = 0;
439 virtual FTypedHandleTypeId GetDataTypeId() const = 0;
440 virtual FName GetDataTypeName() const = 0;
441
442 FTypedHandleTypeId TypeId = 0;
443 FName TypeName;
444
446 };
447
448 template <typename ElementDataType, bool bSupportScriptHandles>
449 struct TRegisteredElementType : public FRegisteredElementType
450 {
451 virtual ~TRegisteredElementType() = default;
452
453 virtual FTypedElementInternalData& AddDataForElement(FTypedHandleElementId& InOutElementId) override
454 {
455 return HandleDataStore.AddDataForElement(TypeId, InOutElementId);
456 }
457
458 virtual void RemoveDataForElement(const FTypedHandleElementId InElementId, const FTypedElementInternalData* InExpectedDataPtr, const bool bDefer) override
459 {
460 if constexpr (bSupportScriptHandles)
461 {
463 HandleDataStore.DisableScriptHandlesForElement(InElementId);
464 }
465
466 if (bDefer)
467 {
468 InExpectedDataPtr->StoreDestructionRequestCallstack();
469
470 FScopeLock DeferredElementsToRemoveLock(&DeferredElementsToRemoveCS);
471 DeferredElementsToRemove.Add(MakeTuple(InElementId, InExpectedDataPtr));
472 }
473 else
474 {
475 HandleDataStore.RemoveDataForElement(InElementId, InExpectedDataPtr);
476 }
477 }
478
479 virtual FScriptTypedElementInternalDataPtr GetDataForScriptElement(const FTypedHandleElementId InElementId) override
480 {
481 if constexpr (bSupportScriptHandles)
482 {
483 return HandleDataStore.GetInternalDataForScriptHandle(InElementId);
484 }
485 else
486 {
487 return {};
488 }
489 }
490
491 virtual const FTypedElementInternalData& GetDataForElement(const FTypedHandleElementId InElementId) const override
492 {
493 return HandleDataStore.GetDataForElement(InElementId);
494 }
495
496 virtual void ProcessDeferredElementsToRemove() override
497 {
498 FScopeLock DeferredElementsToRemoveLock(&DeferredElementsToRemoveCS);
499 for (const FDeferredElementToRemove& DeferredElementToRemove : DeferredElementsToRemove)
500 {
501 HandleDataStore.RemoveDataForElement(DeferredElementToRemove.Get<0>(), DeferredElementToRemove.Get<1>());
502 }
503 DeferredElementsToRemove.Reset();
504 }
505
506 virtual void SetDataTypeId(const FTypedHandleTypeId InTypeId) override
507 {
509 }
510
511 virtual FTypedHandleTypeId GetDataTypeId() const override
512 {
514 }
515
516 virtual FName GetDataTypeName() const override
517 {
519 }
520
522
524 FCriticalSection DeferredElementsToRemoveCS;
525 TArray<FDeferredElementToRemove> DeferredElementsToRemove;
526 };
527
531
532 template <typename ElementDataType>
534 {
535 FRegisteredElementType* RegisteredElementType = GetRegisteredElementTypeFromName(InElementTypeName);
536 checkf(RegisteredElementType, TEXT("Element type '%s' has not been registered!"), *InElementTypeName.ToString());
537
538 checkf(RegisteredElementType->GetDataTypeId() == TTypedElementInternalDataStore<ElementDataType>::StaticDataTypeId(), TEXT("Element type '%s' uses '%s' as its handle data type, but '%s' was requested!"), *InElementTypeName.ToString(), *RegisteredElementType->GetDataTypeName().ToString(), *TTypedElementInternalDataStore<ElementDataType>::StaticDataTypeName().ToString());
539
541 FTypedElementInternalData& NewElementData = RegisteredElementType->AddDataForElement(NewElementId);
542
544 ElementOwner.Private_InitializeAddRef(static_cast<TTypedElementInternalData<ElementDataType>&>(NewElementData));
545
546 return ElementOwner;
547 }
548
549 template <typename ElementDataType>
551 {
552 FRegisteredElementType* RegisteredElementType = GetRegisteredElementTypeFromId(InOutElementOwner.GetId().GetTypeId());
553 checkf(RegisteredElementType, TEXT("Element type ID '%d' has not been registered!"), InOutElementOwner.GetId().GetTypeId());
554
555 RegisteredElementType->RemoveDataForElement(InOutElementOwner.GetId().GetElementId(), InOutElementOwner.Private_GetInternalData(), /*bDefer*/true);
556 InOutElementOwner.Private_DestroyNoRef();
557 }
558
559 template <typename BaseInterfaceType>
561 {
562 OutElement.Private_DestroyReleaseRef();
563
564 if (InElementId)
565 {
566 FRegisteredElementType* RegisteredElementType = GetRegisteredElementTypeFromId(InElementId.GetTypeId());
567 checkf(RegisteredElementType, TEXT("Element type ID '%d' has not been registered!"), InElementId.GetTypeId());
568
569 if (UObject* InterfaceObject = RegisteredElementType->Interfaces.FindRef(InBaseInterfaceType->GetFName()))
570 {
572 if constexpr (std::is_void<BaseInterfaceType>::value)
573 {
574 OutElement.Private_InitializeAddRef(TypedElementInternalData, InterfaceObject->GetInterfaceAddress(InBaseInterfaceType));
575 }
576 else
577 {
579 }
580 }
581 }
582 }
583
584 template <typename BaseInterfaceType>
586 {
587 OutElement.Private_DestroyReleaseRef();
588
589 if (InElementHandle)
590 {
591 FRegisteredElementType* RegisteredElementType = GetRegisteredElementTypeFromId(InElementHandle.GetId().GetTypeId());
592 checkf(RegisteredElementType, TEXT("Element type ID '%d' has not been registered!"), InElementHandle.GetId().GetTypeId());
593
594 if (UObject* InterfaceObject = RegisteredElementType->Interfaces.FindRef(InBaseInterfaceType->GetFName()))
595 {
596 const FTypedElementInternalData& TypedElementInternalData = *InElementHandle.Private_GetInternalData();
597 if constexpr (std::is_void<BaseInterfaceType>::value)
598 {
599 OutElement.Private_InitializeAddRef(TypedElementInternalData, InterfaceObject->GetInterfaceAddress(InBaseInterfaceType));
600 }
601 else
602 {
604 }
605 }
606 }
607 }
608
609 void AddRegisteredElementType(TUniquePtr<FRegisteredElementType>&& InRegisteredElementType)
610 {
611 checkf(InRegisteredElementType->TypeId > 0, TEXT("Element type ID was unassigned!"));
612 checkf(!GetRegisteredElementTypeFromId(InRegisteredElementType->TypeId), TEXT("Element type '%d' has already been registered!"), InRegisteredElementType->TypeId);
613 checkf(!GetRegisteredElementTypeFromName(InRegisteredElementType->TypeName), TEXT("Element type '%s' has already been registered!"), *InRegisteredElementType->TypeName.ToString());
614
615 {
616 UE::TWriteScopeLock RegisteredElementTypesLock(RegisteredElementTypesRW);
617
618 LLM_SCOPE(ELLMTag::EngineMisc);
619 RegisteredElementTypesNameToId.Add(InRegisteredElementType->TypeName, InRegisteredElementType->TypeId);
620 RegisteredElementTypes[InRegisteredElementType->TypeId - 1] = MoveTemp(InRegisteredElementType);
621 }
622 }
623
624 FRegisteredElementType* GetRegisteredElementTypeFromId(const FTypedHandleTypeId InTypeId) const
625 {
626 UE::TReadScopeLock RegisteredElementTypesLock(RegisteredElementTypesRW);
627
628 return InTypeId > 0
629 ? RegisteredElementTypes[InTypeId - 1].Get()
630 : nullptr;
631 }
632
633 FRegisteredElementType* GetRegisteredElementTypeFromName(const FName& InTypeName) const
634 {
635 UE::TReadScopeLock RegisteredElementTypesLock(RegisteredElementTypesRW);
636
637 if (const FTypedHandleTypeId* TypeId = RegisteredElementTypesNameToId.Find(InTypeName))
638 {
639 return RegisteredElementTypes[(*TypeId) - 1].Get();
640 }
641
642 return nullptr;
643 }
644
645 TYPEDELEMENTFRAMEWORK_API void NotifyElementListPendingChanges();
646
647 TYPEDELEMENTFRAMEWORK_API void OnBeginFrame();
648 TYPEDELEMENTFRAMEWORK_API void OnEndFrame();
649 TYPEDELEMENTFRAMEWORK_API void OnPostGarbageCollect();
650
651 inline void IncrementDisableElementDestructionOnGCCount()
652 {
653 checkf(DisableElementDestructionOnGCCount != MAX_uint8, TEXT("DisableElementDestructionOnGCCount overflow!"));
654 ++DisableElementDestructionOnGCCount;
655 }
656
657 inline void DecrementDisableElementDestructionOnGCCount()
658 {
659 checkf(DisableElementDestructionOnGCCount != 0, TEXT("DisableElementDestructionOnGCCount underflow!"));
660 --DisableElementDestructionOnGCCount;
661 }
662
663 mutable FTransactionallySafeRWLock RegisteredElementTypesRW;
666
667 mutable FCriticalSection ActiveElementListsCS;
668 TSet<FTypedElementList*> ActiveElementLists;
669
670 TSet<FScriptTypedElementList*> ActiveScriptElementLists;
671
672 uint8 DisableElementDestructionOnGCCount = 0;
673 bool bIsWithinFrame = false;
674
675 FOnElementReplaced OnElementReplacedDelegate;
676 FOnElementUpdated OnElementUpdatedDelegate;
677 FSimpleMulticastDelegate OnProcessingDeferredElementsToDestroyDelegate;
678};
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
#define TEXT(x)
Definition Platform.h:1272
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
uint8_t uint8
Definition binka_ue_file_header.h:8
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 Array.h:670
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 CriticalSection.h:14
Definition ScopeRWLock.h:21
Definition ScopeRWLock.h:60
Definition Interface.h:19
Definition Object.h:95
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 Tuple.h:652
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