UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TypedElementList.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"
7#include "Containers/Set.h"
8#include "CoreMinimal.h"
15#include "HAL/Platform.h"
16#include "Templates/Casts.h"
17#include "Templates/Function.h"
20#include "Templates/UniquePtr.h"
22#include "UObject/NameTypes.h"
25
26class UInterface;
27class UObject;
29struct FTypedElementId;
30
32{
33
35
37
38template <typename BaseInterfaceType, class HandleType>
40{
41 static_assert(sizeof(TTypedElement<BaseInterfaceType>) == sizeof(FTypedElement), "All TTypedElement instances must be the same size for this cast implementation to work!");
42 GetElementImpl(InRegistry, InElementHandle, BaseInterfaceType::UClassType::StaticClass(), reinterpret_cast<FTypedElement&>(OutElement));
43}
44
45template <typename BaseInterfaceType, class HandleType>
52
53} // namespace TypedElementList_Private
54
55
60template<class HandleType>
61class TTypedElementList final : public TSharedFromThis<TTypedElementList<HandleType>>
62{
63public:
64
65 using FHandleType = HandleType;
68
69
71
77
82 inline HandleType operator[](const int32 InIndex) const
83 {
85 }
86
91 inline HandleType GetElementHandleAt(const int32 InIndex) const
92 {
93 return ElementHandles[InIndex];
94 }
95
100 template <typename BaseInterfaceType>
105
110 template <typename BaseInterfaceType>
115
119 template <typename BaseInterfaceType>
121 {
122 return TypedElementList_Private::GetElement<BaseInterfaceType>(Registry.Get(), InElementHandle);
123 }
124
128 template <typename BaseInterfaceType>
133
137 template <typename BaseInterfaceType>
139 {
141 for (int32 ElementIndex = 0; ElementIndex < Num(); ++ElementIndex)
142 {
143 GetElementAt(ElementIndex, TempElement);
144 if (TempElement)
145 {
146 break;
147 }
148 }
149 return TempElement;
150 }
151
156 template <typename BaseInterfaceType>
158 {
161 for (int32 ElementIndex = 0; ElementIndex < Num(); ++ElementIndex)
162 {
163 GetElementAt(ElementIndex, TempElement);
164 if (TempElement && Predicate(TempElement))
165 {
167 break;
168 }
169 }
170 return ElementToReturn;
171 }
172
173
177 template <typename BaseInterfaceType>
179 {
181 for (int32 ElementIndex = Num() - 1; ElementIndex >= 0; --ElementIndex)
182 {
183 GetElementAt(ElementIndex, TempElement);
184 if (TempElement)
185 {
186 break;
187 }
188 }
189 return TempElement;
190 }
191
196 template <typename BaseInterfaceType>
198 {
201 for (int32 ElementIndex = Num() - 1; ElementIndex >= 0; --ElementIndex)
202 {
203 GetElementAt(ElementIndex, TempElement);
204 if (TempElement && Predicate(TempElement))
205 {
207 break;
208 }
209 }
210 return ElementToReturn;
211 }
212
213
214
218 template <typename BaseInterfaceType>
220 {
221 return Cast<BaseInterfaceType>(GetElementInterface(InElementHandle, BaseInterfaceType::UClassType::StaticClass()));
222 }
223
228
233
238
244
250
255
259 template <typename ArrayAllocator>
261 {
262 OutArray.Reset();
263 OutArray.Reserve(ElementHandles.Num());
264 ForEachElementHandle([&OutArray](const HandleType& InElementHandle)
265 {
267 return true;
269 }
270
276
281 template <typename BaseInterfaceType>
283 {
285 for (const HandleType& ElementHandle : ElementHandles)
286 {
289 {
290 break;
291 }
292 }
293 }
294
298 inline bool IsValidIndex(const int32 InIndex) const
299 {
300 return ElementHandles.IsValidIndex(InIndex);
301 }
302
306 inline int32 Num() const
307 {
308 return ElementHandles.Num();
309 }
310
314 inline void Shrink()
315 {
316 ElementCombinedIds.Shrink();
317 ElementHandles.Shrink();
318 }
319
323 inline void Reserve(const int32 InSize)
324 {
325 ElementCombinedIds.Reserve(InSize);
326 ElementHandles.Reserve(InSize);
327 }
328
332 inline void Empty(const int32 InSlack = 0)
333 {
334 // Avoid creating unnecessary notifications
335 const bool bWasEmpty = ElementHandles.IsEmpty();
336 if (!bWasEmpty)
337 {
338 NoteListMayChange();
339 }
340
341 ElementCombinedIds.Empty(InSlack);
342 ElementHandles.Empty(InSlack);
343 ElementCounts.ClearCounters();
344
345 if (!bWasEmpty)
346 {
347 ElementCounts.ClearCounters();
348 NoteListChanged(EChangeType::Cleared);
349 }
350 }
351
355 inline void Reset()
356 {
357 // Avoid creating unnecessary notifications
358 if (!ElementHandles.IsEmpty())
359 {
360 NoteListMayChange();
361 ElementCombinedIds.Reset();
362 ElementHandles.Reset();
363 ElementCounts.ClearCounters();
364 NoteListChanged(EChangeType::Cleared);
365 }
366 }
367
371 inline bool Contains(const FTypedElementId& InElementId) const
372 {
373 return ContainsElementImpl(InElementId);
374 }
375
379 inline bool Contains(const HandleType& InElementHandle) const
380 {
381 return ContainsElementImpl(InElementHandle.GetId());
382 }
383
387 template <typename ElementDataType>
389 {
390 return ContainsElementImpl(InElementOwner.GetId());
391 }
392
397 inline bool Add(const HandleType& InElementHandle)
398 {
399 return AddElementImpl(CopyTemp(InElementHandle));
400 }
401
406 inline bool Add(HandleType&& InElementHandle)
407 {
408 return AddElementImpl(MoveTemp(InElementHandle));
409 }
410
415 template <typename ElementDataType>
417 {
418 return AddElementImpl(InElementOwner.AcquireHandle());
419 }
420
425 {
426 if (this != &InElementList.Get())
427 {
429
430 Reserve(Num() + InElementList->Num());
431 InElementList->ForEachElementHandle([this](const HandleType& ElementHandle)
432 {
433 AddElementImpl(CopyTemp(ElementHandle));
434 return true;
435 });
436 }
437 }
438
443 {
445
446 Reserve(Num() + InElementHandles.Num());
447 for (const HandleType& ElementHandle : InElementHandles)
448 {
449 AddElementImpl(CopyTemp(ElementHandle));
450 }
451 }
452
456 template <typename ElementDataType>
461
465 template <typename ElementDataType>
467 {
469
470 Reserve(Num() + InElementOwners.Num());
471 for (const TTypedElementOwner<ElementDataType>& ElementOwner : InElementOwners)
472 {
473 AddElementImpl(ElementOwner.AcquireHandle());
474 }
475 }
476
482 {
483 return RemoveElementImpl(InElementId);
484 }
485
490 inline bool Remove(const HandleType& InElementHandle)
491 {
492 return RemoveElementImpl(InElementHandle.GetId());
493 }
494
499 template <typename ElementDataType>
501 {
502 return RemoveElementImpl(InElementOwner.GetId());
503 }
504
509 inline int32 RemoveAll(TFunctionRef<bool(const HandleType&)> InPredicate)
510 {
511 return RemoveAllElementsImpl(InPredicate);
512 }
513
518 template <typename BaseInterfaceType>
520 {
522 return RemoveAllElementsImpl([this, &TempElement, &InPredicate](const HandleType& InElementHandle)
523 {
526 });
527 }
528
533 {
534 return ElementCounts;
535 }
536
543 {
544 return OnPreChangeDelegate;
545 }
546
553 {
554 return OnChangedDelegate;
555 }
556
562
583
589 {
590 public:
591 enum class ESyncType : uint8
592 {
597 Added,
598
603 Removed,
604
609 Modified,
610
615 Cleared,
616
624 };
625
627
628 TYPEDELEMENTFRAMEWORK_API void Private_EmitSyncEvent(const ESyncType InSyncType, const HandleType& InElementHandle = HandleType());
629
630 DECLARE_EVENT_FourParams(FLegacySync, FOnSyncEvent, const TTypedElementList& /*InElementList*/, ESyncType /*InSyncType*/, const HandleType& /*InElementHandle*/, bool /*bIsWithinBatchOperation*/);
632
638
639 private:
640 const TTypedElementList& ElementList;
641
642 FOnSyncEvent OnSyncEventDelegate;
643
644 int32 NumOpenBatchOperations = 0;
645 bool bBatchOperationIsDirty = false;
646 };
647
671
676
682
688
693
695 {
696 return Registry.Get();
697 }
698
699private:
700 enum class EChangeType : uint8
701 {
706 Added,
707
712 Removed,
713
718 Cleared,
719 };
720
722
723 TYPEDELEMENTFRAMEWORK_API bool AddElementImpl(HandleType&& InElementHandle);
724 TYPEDELEMENTFRAMEWORK_API bool RemoveElementImpl(const FTypedElementId& InElementId);
725 TYPEDELEMENTFRAMEWORK_API int32 RemoveAllElementsImpl(TFunctionRef<bool(const HandleType&)> InPredicate);
726 TYPEDELEMENTFRAMEWORK_API bool ContainsElementImpl(const FTypedElementId& InElementId) const;
727
728 TYPEDELEMENTFRAMEWORK_API void NoteListMayChange();
729 TYPEDELEMENTFRAMEWORK_API void NoteListChanged(const EChangeType InChangeType, const HandleType& InElementHandle = HandleType());
730
735
740 TSet<FTypedHandleCombinedId> ElementCombinedIds;
741
746 TArray<HandleType> ElementHandles;
747
751 FTypedElementCounter ElementCounts;
752
756 FOnPreChange OnPreChangeDelegate;
757
761 FOnChanged OnChangedDelegate;
762
766 bool bHasPendingNotify = false;
767
772 TUniquePtr<FLegacySync> LegacySync;
773};
774
775
777{
783
789
790}
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint8 FTypedHandleTypeId
Definition TypedElementLimits.h:29
UE_REWRITE T CopyTemp(T &Val)
Definition UnrealTemplate.h:554
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 TypedElementCounter.h:50
TYPEDELEMENTFRAMEWORK_API void ClearCounters(const FName InCategory)
Definition TypedElementCounter.cpp:52
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_REWRITE bool IsEmpty() const
Definition Array.h:1133
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
UE_FORCEINLINE_HINT void Shrink()
Definition Array.h:1278
void Empty(SizeType Slack=0)
Definition Array.h:2273
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition AssetRegistryState.h:50
Definition SharedPointer.h:1640
Definition SharedPointer.h:153
Definition SubclassOf.h:30
Definition TypedElementList.h:653
FLegacySyncScopedBatch & operator=(const FLegacySyncScopedBatch &)=delete
FLegacySyncScopedBatch(const FLegacySyncScopedBatch &)=delete
TYPEDELEMENTFRAMEWORK_API void ForceDirty()
Definition TypedElementList.cpp:130
TYPEDELEMENTFRAMEWORK_API ~FLegacySyncScopedBatch()
Definition TypedElementList.cpp:114
TYPEDELEMENTFRAMEWORK_API bool IsDirty() const
Definition TypedElementList.cpp:123
FLegacySyncScopedBatch(FLegacySyncScopedBatch &&)=delete
FLegacySyncScopedBatch & operator=(FLegacySyncScopedBatch &&)=delete
Definition TypedElementList.h:589
TYPEDELEMENTFRAMEWORK_API void ForceBatchOperationDirty()
Definition TypedElementList.cpp:93
TYPEDELEMENTFRAMEWORK_API bool IsRunningBatchOperation() const
Definition TypedElementList.cpp:57
TYPEDELEMENTFRAMEWORK_API void EndBatchOperation(const bool InNotify=true)
Definition TypedElementList.cpp:69
ESyncType
Definition TypedElementList.h:592
TYPEDELEMENTFRAMEWORK_API void Private_EmitSyncEvent(const ESyncType InSyncType, const HandleType &InElementHandle=HandleType())
Definition TypedElementList.cpp:49
TYPEDELEMENTFRAMEWORK_API void BeginBatchOperation()
Definition TypedElementList.cpp:63
TYPEDELEMENTFRAMEWORK_API FOnSyncEvent & OnSyncEvent()
Definition TypedElementList.cpp:43
DECLARE_EVENT_FourParams(FLegacySync, FOnSyncEvent, const TTypedElementList &, ESyncType, const HandleType &, bool)
TYPEDELEMENTFRAMEWORK_API bool IsBatchOperationDirty() const
Definition TypedElementList.cpp:87
Definition TypedElementList.h:62
TYPEDELEMENTFRAMEWORK_API FScopedClearNewPendingChange GetScopedClearNewPendingChange()
Definition TypedElementList.cpp:475
void Shrink()
Definition TypedElementList.h:314
bool Add(const HandleType &InElementHandle)
Definition TypedElementList.h:397
void GetElementAt(const int32 InIndex, TTypedElement< BaseInterfaceType > &OutElement) const
Definition TypedElementList.h:111
TTypedElement< BaseInterfaceType > GetTopElement(TFunctionRef< bool(const TTypedElement< BaseInterfaceType > &)> Predicate) const
Definition TypedElementList.h:157
int32 Num() const
Definition TypedElementList.h:306
TTypedElement< BaseInterfaceType > GetTopElement() const
Definition TypedElementList.h:138
UTypedElementRegistry * GetRegistry() const
Definition TypedElementList.h:694
BaseInterfaceType * GetElementInterface(const FTypedElementHandle &InElementHandle) const
Definition TypedElementList.h:219
TYPEDELEMENTFRAMEWORK_API FLegacySync * Legacy_GetSyncPtr() const
Definition TypedElementList.cpp:415
TYPEDELEMENTFRAMEWORK_API ~TTypedElementList()
Definition TypedElementList.cpp:156
TYPEDELEMENTFRAMEWORK_API bool HasElements(const TSubclassOf< UInterface > &InBaseInterfaceType={}) const
Definition TypedElementList.cpp:188
TYPEDELEMENTFRAMEWORK_API int32 CountElementsOfType(const FName InElementTypeName) const
Definition TypedElementList.cpp:242
int32 RemoveAll(TFunctionRef< bool(const TTypedElement< BaseInterfaceType > &)> InPredicate)
Definition TypedElementList.h:519
bool Remove(const HandleType &InElementHandle)
Definition TypedElementList.h:490
bool Remove(const TTypedElementOwner< ElementDataType > &InElementOwner)
Definition TypedElementList.h:500
bool Contains(const FTypedElementId &InElementId) const
Definition TypedElementList.h:371
void Reserve(const int32 InSize)
Definition TypedElementList.h:323
DECLARE_EVENT_OneParam(TTypedElementList, FOnChanged, const TTypedElementList &)
void Append(TArrayView< const TTypedElementOwner< ElementDataType > > InElementOwners)
Definition TypedElementList.h:466
void GetElement(const HandleType &InElementHandle, TTypedElement< BaseInterfaceType > &OutElement) const
Definition TypedElementList.h:129
int32 RemoveAll(TFunctionRef< bool(const HandleType &)> InPredicate)
Definition TypedElementList.h:509
TTypedElement< BaseInterfaceType > GetBottomElement(TFunctionRef< bool(const TTypedElement< BaseInterfaceType > &)> Predicate) const
Definition TypedElementList.h:197
TTypedElement< BaseInterfaceType > GetElementAt(const int32 InIndex) const
Definition TypedElementList.h:101
void Empty(const int32 InSlack=0)
Definition TypedElementList.h:332
bool Add(const TTypedElementOwner< ElementDataType > &InElementOwner)
Definition TypedElementList.h:416
TYPEDELEMENTFRAMEWORK_API FLegacySync & Legacy_GetSync()
Definition TypedElementList.cpp:405
void GetElementHandles(TArray< HandleType, ArrayAllocator > &OutArray, const TSubclassOf< UInterface > &InBaseInterfaceType={}) const
Definition TypedElementList.h:260
void Append(const TArray< TTypedElementOwner< ElementDataType > > &InElementOwners)
Definition TypedElementList.h:457
TTypedElement< BaseInterfaceType > GetElement(const HandleType &InElementHandle) const
Definition TypedElementList.h:120
const FTypedElementCounter & GetCounter() const
Definition TypedElementList.h:532
bool IsValidIndex(const int32 InIndex) const
Definition TypedElementList.h:298
HandleType FHandleType
Definition TypedElementList.h:65
HandleType GetElementHandleAt(const int32 InIndex) const
Definition TypedElementList.h:91
bool Contains(const HandleType &InElementHandle) const
Definition TypedElementList.h:379
FOnPreChange & OnPreChange()
Definition TypedElementList.h:542
void Append(TArrayView< const HandleType > InElementHandles)
Definition TypedElementList.h:442
TYPEDELEMENTFRAMEWORK_API void ForEachElementHandle(TFunctionRef< bool(const HandleType &)> InCallback, const TSubclassOf< UInterface > &InBaseInterfaceType={}) const
Definition TypedElementList.cpp:277
TYPEDELEMENTFRAMEWORK_API TArray< HandleType > GetElementHandles(const TSubclassOf< UInterface > &InBaseInterfaceType={}) const
Definition TypedElementList.cpp:262
bool Contains(const TTypedElementOwner< ElementDataType > &InElementOwner)
Definition TypedElementList.h:388
void Append(const TTypedElementListConstRef &InElementList)
Definition TypedElementList.h:424
TYPEDELEMENTFRAMEWORK_API TTypedElementListRef Clone() const
Definition TypedElementList.cpp:168
HandleType operator[](const int32 InIndex) const
Definition TypedElementList.h:82
void Reset()
Definition TypedElementList.h:355
bool Remove(const FTypedElementId &InElementId)
Definition TypedElementList.h:481
TTypedElement< BaseInterfaceType > GetBottomElement() const
Definition TypedElementList.h:178
static TYPEDELEMENTFRAMEWORK_API TTypedElementListRef Private_CreateElementList(UTypedElementRegistry *InRegistry)
Definition TypedElementList.cpp:139
bool Add(HandleType &&InElementHandle)
Definition TypedElementList.h:406
FOnChanged & OnChanged()
Definition TypedElementList.h:552
void ForEachElement(TFunctionRef< bool(const TTypedElement< BaseInterfaceType > &)> InCallback) const
Definition TypedElementList.h:282
TYPEDELEMENTFRAMEWORK_API bool NotifyPendingChanges()
Definition TypedElementList.cpp:421
TYPEDELEMENTFRAMEWORK_API int32 CountElements(const TSubclassOf< UInterface > &InBaseInterfaceType={}) const
Definition TypedElementList.cpp:209
DECLARE_EVENT_OneParam(TTypedElementList, FOnPreChange, const TTypedElementList &)
TYPEDELEMENTFRAMEWORK_API bool HasElementsOfType(const FName InElementTypeName) const
Definition TypedElementList.cpp:230
Definition UniquePtr.h:107
Definition Interface.h:19
Definition Object.h:95
Definition TypedElementRegistry.h:55
Definition TypedElementList.cpp:7
void GetElementImpl(const UTypedElementRegistry *InRegistry, const FTypedElementHandle &InElementHandle, const TSubclassOf< UInterface > &InBaseInterfaceType, FTypedElement &OutElement)
Definition TypedElementList.cpp:9
void GetElement(const UTypedElementRegistry *InRegistry, const HandleType &InElementHandle, TTypedElement< BaseInterfaceType > &OutElement)
Definition TypedElementList.h:39
Definition TypedElementList.cpp:521
FScriptTypedElementListPtr ConvertToScriptTypedElementList(const FTypedElementListConstPtr &NativeList)
Definition TypedElementList.cpp:554
FTypedElementListPtr ConvertToNativeTypedElementList(const FScriptTypedElementListConstPtr &ScriptList)
Definition TypedElementList.cpp:526
Definition TypedElementHandle.h:625
Definition TypedElementHandle.h:18
Definition TypedElementId.h:17
Definition TypedElementList.h:568
FScopedClearNewPendingChange(const FScopedClearNewPendingChange &)=delete
TYPEDELEMENTFRAMEWORK_API ~FScopedClearNewPendingChange()
Definition TypedElementList.cpp:466
FScopedClearNewPendingChange & operator=(const FScopedClearNewPendingChange &)=delete
Definition TypedElementHandle.h:409
Definition TypedElementHandle.h:396
Definition WeakObjectPtrTemplates.h:25
FORCEINLINE T * Get(bool bEvenIfPendingKill) const
Definition WeakObjectPtrTemplates.h:132