UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TypedElementData.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Misc/ScopeLock.h"
7#include "Misc/ScopeRWLock.h"
13
18#define UE_DECLARE_TYPED_ELEMENT_DATA_RTTI(ELEMENT_DATA_TYPE, ...) \
19 static __VA_ARGS__ FTypedHandleTypeId Private_RegisteredTypeId; \
20 static FTypedHandleTypeId StaticTypeId() { return Private_RegisteredTypeId; } \
21 static FName StaticTypeName() { static const FName TypeName = #ELEMENT_DATA_TYPE; return TypeName; }
22
27#define UE_DEFINE_TYPED_ELEMENT_DATA_RTTI(ELEMENT_DATA_TYPE) \
28 FTypedHandleTypeId ELEMENT_DATA_TYPE::Private_RegisteredTypeId = 0;
29
34template <typename ElementDataType>
35inline FString GetTypedElementDebugId(const ElementDataType& InElementData)
36{
37 return FString();
38}
39
40#if UE_TYPED_ELEMENT_HAS_REFTRACKING
45{
46public:
48 {
50 }
51
53 FTypedElementReference& operator=(const FTypedElementReference&) = default;
54
56 FTypedElementReference& operator=(FTypedElementReference&&) = default;
57
58 void LogReference() const
59 {
62 {
63 CallstackText[0] = 0;
66 }
67 }
68
69private:
72};
73
78{
79public:
81 {
84 : nullptr;
85 }
86
87 void Reset()
88 {
90 References.Reset();
92 }
93
95 {
97 return References.Add(FTypedElementReference());
98 }
99
100 void ReleaseRef(const FTypedElementReferenceId InReferenceId)
101 {
103 {
105 References.RemoveAt(InReferenceId);
106 }
107 }
108
109 void LogReferences() const
110 {
112 UE_LOG(LogCore, Error, TEXT("==============================================="));
113 UE_LOG(LogCore, Error, TEXT("External Element References:"));
114 for (const FTypedElementReference& Reference : References)
115 {
116 UE_LOG(LogCore, Error, TEXT("-----------------------------------------------"));
117 Reference.LogReference();
118 }
119 UE_LOG(LogCore, Error, TEXT("==============================================="));
121 {
122 UE_LOG(LogCore, Error, TEXT("Destruction requested by:"));
123 DestructionRequestCallstack->LogReference();
124 UE_LOG(LogCore, Error, TEXT("==============================================="));
125 }
126 }
127
128 void StoreDestructionRequestCallstack()
129 {
131#if DO_CHECK
133 {
134 UE_LOG(LogCore, Error, TEXT("==============================================="));
135 UE_LOG(LogCore, Error, TEXT("Destruction requested by:"));
136 DestructionRequestCallstack->LogReference();
137 UE_LOG(LogCore, Error, TEXT("==============================================="));
138 UE_LOG(LogCore, Fatal, TEXT("Element has already had its destruction callstack set! (see above)"));
139 }
140#endif // DO_CHECK
142 }
143
144private:
146
150};
151#endif // UE_TYPED_ELEMENT_HAS_REFTRACKING
152
157{
158public:
160
163
166
168 {
170 }
171
173 {
174 checkSlow(!Id.IsSet());
176#if UE_TYPED_ELEMENT_HAS_REFTRACKING
177 if (!References)
178 {
179 // Do this in Initialize rather than the constructor, as the CVar value
180 // may change while the already constructed instances are re-used
181 References = FTypedElementReferences::Create();
182 }
183#endif // UE_TYPED_ELEMENT_HAS_REFTRACKING
184 }
185
186 virtual void Reset()
187 {
189#if UE_TYPED_ELEMENT_HAS_REFCOUNTING
192 {
193 OldRefCount = FPlatformAtomics::InterlockedExchange(&RefCount, 0);
194 };
196 {
197 FTypedElementRefCount RefCountDuringAbort = FPlatformAtomics::InterlockedAdd(&RefCount, OldRefCount);
198 // Is there a real-world scenario where rolling back a Reset() could yield a non-zero value here?
199 // Any further AddRefs would also be paired with an OnAbort handler, undoing its increment.
200 // Any ReleaseRefs would be inert until commit time.
202 };
203#endif // UE_TYPED_ELEMENT_HAS_REFCOUNTING
204#if UE_TYPED_ELEMENT_HAS_REFTRACKING
205 if (References)
206 {
207 References->Reset();
208 }
209#endif // UE_TYPED_ELEMENT_HAS_REFTRACKING
210 }
211
212 inline const FTypedElementId& GetId() const
213 {
214 return Id;
215 }
216
218 {
220#if UE_TYPED_ELEMENT_HAS_REFCOUNTING
223 {
224 FPlatformAtomics::InterlockedIncrement(&RefCount);
225 };
227 {
228 checkSlow(RefCount > 0);
229 FPlatformAtomics::InterlockedDecrement(&RefCount);
230 };
231#endif // UE_TYPED_ELEMENT_HAS_REFCOUNTING
232#if UE_TYPED_ELEMENT_HAS_REFTRACKING
233 if (bCanTrackReference && References)
234 {
235 ReferenceId = References->AddRef();
236 }
237#endif // UE_TYPED_ELEMENT_HAS_REFTRACKING
238 return ReferenceId;
239 }
240
242 {
243#if UE_TYPED_ELEMENT_HAS_REFCOUNTING
244 checkSlow(RefCount > 0);
246 {
247 checkSlow(RefCount > 0);
248 FPlatformAtomics::InterlockedDecrement(&RefCount);
249 };
250#endif // UE_TYPED_ELEMENT_HAS_REFCOUNTING
251#if UE_TYPED_ELEMENT_HAS_REFTRACKING
252 if (References)
253 {
254 References->ReleaseRef(InReferenceId);
255 }
256#endif // UE_TYPED_ELEMENT_HAS_REFTRACKING
257 }
258
261 {
262#if UE_TYPED_ELEMENT_HAS_REFCOUNTING
263 return FPlatformAtomics::AtomicRead(&RefCount);
264#else // UE_TYPED_ELEMENT_HAS_REFCOUNTING
265 return 0;
266#endif // UE_TYPED_ELEMENT_HAS_REFCOUNTING
267 }
268
270 {
271#if UE_TYPED_ELEMENT_HAS_REFTRACKING
272 if (References)
273 {
274 References->StoreDestructionRequestCallstack();
275 }
276#endif // UE_TYPED_ELEMENT_HAS_REFTRACKING
277 }
278
280 {
281#if DO_CHECK
283 if (LocalRefCount > 1)
284 {
285#if UE_TYPED_ELEMENT_HAS_REFTRACKING
286 UE_LOG(LogCore, Warning, TEXT("Element '%s' is still externally referenced when being destroyed. Ref-count: %d;"), *GetDebugId(), LocalRefCount);
287 if (References)
288 {
289 References->LogReferences();
290 }
291 else
292 {
293 UE_LOG(LogCore, Warning, TEXT("Enable CVar 'TypedElements.EnableReferenceTracking' for Element reference tracking."));
294 }
295#else // UE_TYPED_ELEMENT_HAS_REFTRACKING
296 UE_LOG(LogCore, Warning, TEXT("Element '%s' is still externally referenced when being destroyed. Ref-count: %d"), *GetDebugId(), LocalRefCount);
297 UE_LOG(LogCore, Warning, TEXT("UE_TYPED_ELEMENT_HAS_REFTRACKING is disabled. Enable it, recompile and enable CVar 'TypedElements.EnableReferenceTracking' for reference tracking."));
298#endif // UE_TYPED_ELEMENT_HAS_REFTRACKING
299 }
300#endif // DO_CHECK
301 }
302
303 virtual const void* GetUntypedData() const
304 {
305 return nullptr;
306 }
307
308 virtual FString GetDebugId() const
309 {
310 return FString::Printf(TEXT("ID: %d"), Id.GetElementId());
311 }
312
313private:
315#if UE_TYPED_ELEMENT_HAS_REFCOUNTING
316 mutable FTypedElementRefCount RefCount = 0;
317#endif // UE_TYPED_ELEMENT_HAS_REFCOUNTING
318#if UE_TYPED_ELEMENT_HAS_REFTRACKING
320#endif // UE_TYPED_ELEMENT_HAS_REFTRACKING
321};
322
326template <typename ElementDataType>
328{
329public:
330 virtual void Reset() override
331 {
333 Data = ElementDataType();
334 }
335
336 inline const ElementDataType& GetData() const
337 {
338 return Data;
339 }
340
341 inline ElementDataType& GetMutableData()
342 {
343 return Data;
344 }
345
346 virtual const void* GetUntypedData() const override
347 {
348 return &Data;
349 }
350
351 virtual FString GetDebugId() const override
352 {
353 const FString ElementDebugId = GetTypedElementDebugId(Data);
354 return ElementDebugId.IsEmpty()
356 : FString::Printf(TEXT("%s - %s"), *ElementDebugId, *FTypedElementInternalData::GetDebugId());
357 }
358
359private:
360 ElementDataType Data;
361};
362
366template <>
370
375{
376public:
377
379
384
390
396
403
405 {
406 ControlBlock = Other.ControlBlock;
407 Other.ControlBlock = nullptr;
408 return *this;
409 }
410
412 {
413 return ControlBlock == Other.ControlBlock;
414 }
415
417 {
418 return !(*this == Other);
419 }
420
421 bool IsSet() const
422 {
423 return ControlBlock && ControlBlock->Data;
424 }
425
426 void Release()
427 {
429 ControlBlock = nullptr;
430 }
431
432 inline const FTypedElementId& GetId() const
433 {
434 if (ControlBlock)
435 {
436 if (ControlBlock->Data)
437 {
438 return ControlBlock->Data->GetId();
439 }
440 }
441
443 }
444
446 {
447 if (ControlBlock)
448 {
449 if (ControlBlock->Data)
450 {
451 return ControlBlock->Data;
452 }
453 }
454
455 return nullptr;
456 }
457
458protected:
460 {
461 if (ControlBlock)
462 {
464 }
465 }
466
468 {
469 if (ControlBlock)
470 {
472 if (ControlBlock->WeakRefCount == 0)
473 {
474 delete ControlBlock;
475 ControlBlock = nullptr;
476 }
477 }
478 }
479
485
508
510};
511
531
536template <typename ElementDataType>
538{
539public:
540 static_assert(TNumericLimits<int32>::Max() >= TypedHandleMaxElementId, "TTypedElementInternalDataStore internally uses signed 32-bit indices so cannot store TypedHandleMaxElementId! Consider making this container 64-bit aware, or explicitly remove this compile time check.");
541
543 {
545
547
548 InOutElementId = InternalDataFreeIndices.Num() > 0
549 ? InternalDataFreeIndices.Pop(EAllowShrinking::No)
550 : InternalDataArray.Add();
551
552 TTypedElementInternalData<ElementDataType>& InternalData = InternalDataArray[InOutElementId];
553 InternalData.Initialize(InTypeId, InOutElementId);
554 return InternalData;
555 }
556
558 {
559 // Script handles are not thread safe
560 uint32 Hash = GetTypeHash(InElementId);
561 if (FScriptTypedElementInternalDataOwner* ScriptElementInternalData = ScriptInternalDataMap.FindByHash(Hash, InElementId))
562 {
564 }
565
566 UE::TReadScopeLock InternalDataLock(InternalDataRW);
567 checkSlow(InternalDataArray.IsValidIndex(InElementId));
568 return ScriptInternalDataMap.EmplaceByHash(Hash,InElementId, InternalDataArray[InElementId]);
569 }
570
572 {
573 // Script handles are not thread safe
574 ScriptInternalDataMap.Remove(InElementId);
575 }
576
578 {
580
581 checkSlow(InternalDataArray.IsValidIndex(InElementId));
582
583 TTypedElementInternalData<ElementDataType>& InternalData = InternalDataArray[InElementId];
584 checkf(InExpectedDataPtr == &InternalData, TEXT("Internal data pointer did not match the expected value! Does this handle belong to a different element registry?"));
586 InternalData.Reset();
587 InternalDataFreeIndices.Add(InElementId);
588 }
589
591 {
592 UE::TReadScopeLock InternalDataLock(InternalDataRW);
593
594 checkSlow(InternalDataArray.IsValidIndex(InElementId));
595 return InternalDataArray[InElementId];
596 }
597
599 {
600 checkSlow(ElementDataType::Private_RegisteredTypeId == 0);
601 ElementDataType::Private_RegisteredTypeId = InTypeId;
602 }
603
605 {
606 return ElementDataType::StaticTypeId();
607 }
608
609 static inline FName StaticDataTypeName()
610 {
611 return ElementDataType::StaticTypeName();
612 }
613
614private:
615 mutable FTransactionallySafeRWLock InternalDataRW;
616 TArray<int32> InternalDataFreeIndices;
619};
620
625template <>
627{
628public:
629 static_assert(TNumericLimits<int32>::Max() >= TypedHandleMaxElementId, "TTypedElementInternalDataStore internally uses signed 32-bit indices so cannot store TypedHandleMaxElementId! Consider making this container 64-bit aware, or explicitly remove this compile time check.");
630
632 {
634
636 checkSlow(!ElementIdToArrayIndex.Contains(InOutElementId));
637
638 const int32 InternalDataArrayIndex = InternalDataFreeIndices.Num() > 0
639 ? InternalDataFreeIndices.Pop(EAllowShrinking::No)
640 : InternalDataArray.Add();
641
642 ElementIdToArrayIndex.Add(InOutElementId, InternalDataArrayIndex);
643
644 TTypedElementInternalData<void>& InternalData = InternalDataArray[InOutElementId];
645 InternalData.Initialize(InTypeId, InOutElementId);
646 return InternalData;
647 }
648
650 {
651 // Script handles are not thread safe
652 uint32 Hash = GetTypeHash(InElementId);
653 if (FScriptTypedElementInternalDataOwner* ScriptElementInternalData = ScriptInternalDataMap.FindByHash(Hash, InElementId))
654 {
656 }
657
658 UE::TReadScopeLock InternalDataLock(InternalDataRW);
659 const int32 Index = ElementIdToArrayIndex.FindChecked(InElementId);
660 return ScriptInternalDataMap.EmplaceByHash(Hash, InElementId, InternalDataArray[Index]);
661 }
662
664 {
665 // Script handles are not thread safe
666 ScriptInternalDataMap.Remove(InElementId);
667 }
668
670 {
672
674 ElementIdToArrayIndex.RemoveAndCopyValue(InElementId, InternalDataArrayIndex);
675
677
678 TTypedElementInternalData<void>& InternalData = InternalDataArray[InElementId];
679 checkf(InExpectedDataPtr == &InternalData, TEXT("Internal data pointer did not match the expected value! Does this handle belong to a different element registry?"));
681 InternalData.Reset();
682 InternalDataFreeIndices.Add(InternalDataArrayIndex);
683 }
684
686 {
687 UE::TReadScopeLock InternalDataLock(InternalDataRW);
688
689 const int32* InternalDataArrayIndexPtr = ElementIdToArrayIndex.Find(InElementId);
691 return InternalDataArray[*InternalDataArrayIndexPtr];
692 }
693
695 {
696 }
697
699 {
700 return 0;
701 }
702
703 static inline FName StaticDataTypeName()
704 {
705 return FName();
706 }
707
708private:
709 mutable FTransactionallySafeRWLock InternalDataRW;
711 TArray<int32> InternalDataFreeIndices;
712 TMap<FTypedHandleElementId, int32> ElementIdToArrayIndex;
714};
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define UE_AUTORTFM_ALWAYS_OPEN
Definition AutoRTFMDefines.h:114
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
#define ANSI_TO_TCHAR(str)
Definition StringConv.h:1020
FString GetTypedElementDebugId(const ElementDataType &InElementData)
Definition TypedElementData.h:35
uint8 FTypedHandleTypeId
Definition TypedElementLimits.h:29
int32 FTypedElementRefCount
Definition TypedElementLimits.h:33
constexpr SIZE_T TypedHandleRefTrackingSkipCount
Definition TypedElementLimits.h:26
constexpr SIZE_T TypedHandleRefTrackingDepth
Definition TypedElementLimits.h:27
int32 FTypedHandleElementId
Definition TypedElementLimits.h:30
int32 FTypedElementReferenceId
Definition TypedElementLimits.h:34
constexpr SIZE_T TypedHandleMaxElementId
Definition TypedElementLimits.h:24
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
Definition ScopeLock.h:141
Definition TypedElementData.h:513
FScriptTypedElementInternalDataOwner(FTypedElementInternalData &InInternalData)
Definition TypedElementData.h:516
~FScriptTypedElementInternalDataOwner()
Definition TypedElementData.h:524
Definition TypedElementData.h:375
bool operator==(const FScriptTypedElementInternalDataPtr &Other) const
Definition TypedElementData.h:411
void IncrementCount()
Definition TypedElementData.h:459
FScriptTypedElementInternalDataPtr(const FScriptTypedElementInternalDataPtr &Other)
Definition TypedElementData.h:385
const FTypedElementId & GetId() const
Definition TypedElementData.h:432
FScriptTypedElementInternalDataPtr(FScriptTypedElementInternalDataPtr &&Other)
Definition TypedElementData.h:391
~FScriptTypedElementInternalDataPtr()
Definition TypedElementData.h:380
FScriptTypedElementInternalDataControlBlock * ControlBlock
Definition TypedElementData.h:509
void Release()
Definition TypedElementData.h:426
void DecrementCount()
Definition TypedElementData.h:467
FTypedElementInternalData * GetInternalData() const
Definition TypedElementData.h:445
bool IsSet() const
Definition TypedElementData.h:421
FScriptTypedElementInternalDataPtr & operator=(const FScriptTypedElementInternalDataPtr &Other)
Definition TypedElementData.h:397
FScriptTypedElementInternalDataPtr(FTypedElementInternalData &InternalData)
Definition TypedElementData.h:480
FScriptTypedElementInternalDataPtr & operator=(FScriptTypedElementInternalDataPtr &&Other)
Definition TypedElementData.h:404
bool operator!=(const FScriptTypedElementInternalDataPtr &Other) const
Definition TypedElementData.h:416
Definition TypedElementData.h:157
virtual void Reset()
Definition TypedElementData.h:186
FTypedElementInternalData & operator=(const FTypedElementInternalData &)=delete
FTypedElementInternalData()=default
void ReleaseRef(const FTypedElementReferenceId InReferenceId) const
Definition TypedElementData.h:241
UE_AUTORTFM_ALWAYS_OPEN FTypedElementRefCount GetRefCount() const
Definition TypedElementData.h:260
const FTypedElementId & GetId() const
Definition TypedElementData.h:212
virtual ~FTypedElementInternalData()
Definition TypedElementData.h:167
FTypedElementInternalData & operator=(FTypedElementInternalData &&)=delete
virtual const void * GetUntypedData() const
Definition TypedElementData.h:303
FTypedElementInternalData(FTypedElementInternalData &&InOther)=delete
void Initialize(const FTypedHandleTypeId InTypeId, const FTypedHandleElementId InElementId)
Definition TypedElementData.h:172
void StoreDestructionRequestCallstack() const
Definition TypedElementData.h:269
void LogExternalReferencesOnDestruction() const
Definition TypedElementData.h:279
virtual FString GetDebugId() const
Definition TypedElementData.h:308
FTypedElementInternalData(const FTypedElementInternalData &)=delete
FTypedElementReferenceId AddRef(const bool bCanTrackReference) const
Definition TypedElementData.h:217
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
ElementType Pop(EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:1196
Definition ChunkedArray.h:56
UE_FORCEINLINE_HINT bool IsValidIndex(int32 Index) const
Definition ChunkedArray.h:182
int32 Add(int32 Count=1)
Definition ChunkedArray.h:242
Definition UnrealString.h.inl:34
Definition SparseArray.h:524
static FName StaticDataTypeName()
Definition TypedElementData.h:703
static FTypedHandleTypeId StaticDataTypeId()
Definition TypedElementData.h:698
void DisableScriptHandlesForElement(const FTypedHandleElementId InElementId)
Definition TypedElementData.h:663
void RemoveDataForElement(const FTypedHandleElementId InElementId, const FTypedElementInternalData *InExpectedDataPtr)
Definition TypedElementData.h:669
TTypedElementInternalData< void > & AddDataForElement(const FTypedHandleTypeId InTypeId, FTypedHandleElementId &InOutElementId)
Definition TypedElementData.h:631
const TTypedElementInternalData< void > & GetDataForElement(const FTypedHandleElementId InElementId) const
Definition TypedElementData.h:685
static void SetStaticDataTypeId(const FTypedHandleTypeId InTypeId)
Definition TypedElementData.h:694
FScriptTypedElementInternalDataPtr GetInternalDataForScriptHandle(const FTypedHandleElementId InElementId)
Definition TypedElementData.h:649
Definition TypedElementData.h:538
static FTypedHandleTypeId StaticDataTypeId()
Definition TypedElementData.h:604
static void SetStaticDataTypeId(const FTypedHandleTypeId InTypeId)
Definition TypedElementData.h:598
void DisableScriptHandlesForElement(const FTypedHandleElementId InElementId)
Definition TypedElementData.h:571
static FName StaticDataTypeName()
Definition TypedElementData.h:609
FScriptTypedElementInternalDataPtr GetInternalDataForScriptHandle(const FTypedHandleElementId InElementId)
Definition TypedElementData.h:557
TTypedElementInternalData< ElementDataType > & AddDataForElement(const FTypedHandleTypeId InTypeId, FTypedHandleElementId &InOutElementId)
Definition TypedElementData.h:542
void RemoveDataForElement(const FTypedHandleElementId InElementId, const FTypedElementInternalData *InExpectedDataPtr)
Definition TypedElementData.h:577
const TTypedElementInternalData< ElementDataType > & GetDataForElement(const FTypedHandleElementId InElementId) const
Definition TypedElementData.h:590
Definition TypedElementData.h:328
virtual FString GetDebugId() const override
Definition TypedElementData.h:351
const ElementDataType & GetData() const
Definition TypedElementData.h:336
virtual const void * GetUntypedData() const override
Definition TypedElementData.h:346
ElementDataType & GetMutableData()
Definition TypedElementData.h:341
virtual void Reset() override
Definition TypedElementData.h:330
Definition UniquePtr.h:107
Definition CriticalSection.h:14
Definition ScopeRWLock.h:21
Definition ScopeRWLock.h:60
@ Reference
Definition Protocol6.h:40
U16 Index
Definition radfft.cpp:71
static CORE_API uint32 CaptureStackBackTrace(uint64 *BackTrace, uint32 MaxDepth, void *Context=nullptr)
Definition AndroidPlatformStackWalk.cpp:215
static CORE_API bool ProgramCounterToHumanReadableString(int32 CurrentCallDepth, uint64 ProgramCounter, ANSICHAR *HumanReadableString, SIZE_T HumanReadableStringSize, FGenericCrashContext *Context=nullptr)
Definition GenericPlatformStackWalk.cpp:47
FTypedElementInternalData * Data
Definition TypedElementData.h:505
FScriptTypedElementInternalDataControlBlock & operator=(const FScriptTypedElementInternalDataControlBlock &)=delete
FScriptTypedElementInternalDataControlBlock(FScriptTypedElementInternalDataControlBlock &&)=delete
FScriptTypedElementInternalDataControlBlock(const FScriptTypedElementInternalDataControlBlock &)=delete
FScriptTypedElementInternalDataControlBlock & operator=(FScriptTypedElementInternalDataControlBlock &&)=delete
FTypedElementRefCount WeakRefCount
Definition TypedElementData.h:506
FScriptTypedElementInternalDataControlBlock(FTypedElementInternalData &InData)
Definition TypedElementData.h:491
Definition TypedElementId.h:17
void Private_InitializeNoRef(const FTypedHandleTypeId InTypeId, const FTypedHandleElementId InElementId)
Definition TypedElementId.h:104
FTypedHandleElementId GetElementId() const
Definition TypedElementId.h:73
void Private_DestroyNoRef()
Definition TypedElementId.h:110
bool IsSet() const
Definition TypedElementId.h:57
static TYPEDELEMENTFRAMEWORK_API const FTypedElementId Unset
Definition TypedElementId.h:116
Definition NumericLimits.h:41