UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SortedSet.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Algo/BinarySearch.h"
6#include "Algo/IndexOf.h"
7#include "Algo/Sort.h"
10#include "UObject/NameTypes.h"
11
12template <typename ElementType, typename ArrayAllocator, typename SortPredicate>
14
23template <typename InElementType, typename ArrayAllocator /*= FDefaultAllocator*/, typename SortPredicate /*= TLess<InElementType>*/>
25{
26 template <typename OtherElementType, typename OtherArrayAllocator, typename OtherSortPredicate>
27 friend class TSortedSet;
28
30
31public:
34
35 [[nodiscard]] TSortedSet() = default;
37 [[nodiscard]] TSortedSet(const TSortedSet&) = default;
39 TSortedSet& operator=(const TSortedSet&) = default;
40
42 template<typename OtherArrayAllocator>
47
49 template<typename OtherArrayAllocator>
54
56 [[nodiscard]] TSortedSet(std::initializer_list<ElementType> InitList)
57 {
58 this->Reserve((int32)InitList.size());
59 this->Append(InitList);
60 }
61
63 // Start - intrusive TOptional<TSortedSet> state //
65 constexpr static bool bHasIntrusiveUnsetOptionalState = true;
67
69 : Elements(Tag)
70 {
71 }
73 {
74 return Elements == Tag;
75 }
77 // End - intrusive TOptional<TSortedSet> state //
79
81 template<typename OtherArrayAllocator>
87
89 template<typename OtherArrayAllocator>
91 {
92 Elements = Other.Elements;
93 return *this;
94 }
95
97 TSortedSet& operator=(std::initializer_list<ElementType> InitList)
98 {
99 this->Empty((int32)InitList.size());
100 this->Append(InitList);
101 return *this;
102 }
103
106 {
107 return Elements == Other.Elements;
108 }
109
112 {
113 return Elements != Other.Elements;
114 }
115
125
128 {
129 Elements.Reset();
130 }
131
134 {
135 Elements.Shrink();
136 }
137
140 {
141 Elements.Reserve(Number);
142 }
143
150 [[nodiscard]] bool IsEmpty() const
151 {
152 return Elements.IsEmpty();
153 }
154
157 {
158 return Elements.Num();
159 }
160
163 {
164 return Elements.Max();
165 }
166
169 {
170 return Elements.Num();
171 }
172
180 {
181 return Elements.GetAllocatedSize();
182 }
183
186 {
187 Elements.CountBytes(Ar);
188 }
189
205
213 template <typename InitArgType = ElementType>
215 {
216 ElementType* DataPtr = AllocateMemoryForEmplace(InInitArg, bIsAlreadyInSetPtr);
217
218 ::new((void*)DataPtr) ElementType(Forward<InitArgType>(InInitArg));
219
220 return FSetElementId::FromInteger((int32)(DataPtr - Elements.GetData()));
221 }
222
230 {
231 int32 RemoveIndex = FindIndex(InKey);
232 if (RemoveIndex == INDEX_NONE)
233 {
234 return 0;
235 }
236
237 Elements.RemoveAt(RemoveIndex);
238 return 1;
239 }
240
248 {
249 int32 FoundIndex = FindIndex(Key);
250 if (FoundIndex != INDEX_NONE)
251 {
252 return &Elements[FoundIndex];
253 }
254
255 return nullptr;
256 }
258 {
259 return const_cast<TSortedSet*>(this)->Find(Key);
260 }
261
270 {
271 return FindOrAddImpl(InValue, bIsAlreadyInSetPtr);
272 }
277
284 {
285 // The goal of this function is to be fast, and so the implementation may be improved at any time even if it gives different results.
286
287 return Elements.IsEmpty() ? nullptr : &Elements.Last();
288 }
290 {
291 return const_cast<TSortedSet*>(this)->FindArbitraryElement();
292 }
293
301 {
302 return FindIndex(Key) != INDEX_NONE;
303 }
304
309 {
310 return TArray<ElementType>(Elements);
311 }
313 {
314 return TArray<ElementType>(MoveTemp(Elements));
315 }
316
323 {
324 Ar.Logf(TEXT("TSortedSet: %i elements"), Elements.Num());
325 }
326
327private:
328 template <bool bMove>
329 void AppendImpl(std::conditional_t<bMove, ElementType, const ElementType>* Ptr, int32 Count)
330 {
331 // Insert new unsorted elements at the end of sorted elements, then sort them all together into the right place at the end.
332 //
333 // Needs to handle duplicates in both the existing set and within new elements.
334
335 if (Count == 0)
336 {
337 return;
338 }
339
340 // Reserve space for the new elements - we may not need this many if there are duplicates
341 Elements.Reserve(Elements.Num() + Count);
342
343 // Get a view over the sorted elements - even if Elements grows in the loop below, this won't be invalidated due to the Reserve above
345
346 for (;;)
347 {
348 // Find existing element in sorted elements
349 int32 InsertIndex = 0;
350 if (!SortedView.IsEmpty())
351 {
352 // If the new element is strictly 'greater' than the last of the sorted elements, then insert at the end, otherwise binary search for the insertion point
353 if (SortPredicate()(SortedView.Last(), *Ptr))
354 {
355 InsertIndex = SortedView.Num();
356 }
357 else
358 {
359 InsertIndex = Algo::LowerBound(SortedView, *Ptr, SortPredicate());
360 }
361 }
362
363 // If the element at the insertion point is equivalent to ('not less than') the new element, then we can insert it in-place without breaking the sort order
364 if (InsertIndex < SortedView.Num() && !SortPredicate()(*Ptr, Elements[InsertIndex]))
365 {
366 // Replace duplicate element by constructing it over the previous one - this will still leave the sorted elements in order
367 ElementType* OldElement = Elements.GetData() + InsertIndex;
369 if constexpr (bMove)
370 {
371 ::new ((void*)OldElement) ElementType(MoveTemp(*Ptr));
372 }
373 else
374 {
375 ::new ((void*)OldElement) ElementType(*Ptr);
376 }
377 }
378 else
379 {
380 // Find existing element in unsorted elements
381 ElementType* ExistingElement = nullptr;
382 int32 NumUnsortedElements = Elements.Num() - SortedView.Num();
383 if (NumUnsortedElements > 0)
384 {
385 ExistingElement = MakeArrayView(Elements.GetData() + SortedView.Num(), NumUnsortedElements).FindByPredicate([Ptr](const ElementType& Val) { return !SortPredicate()(*Ptr, Val) && !SortPredicate()(Val, *Ptr); });
386 }
387
388 if (ExistingElement)
389 {
390 // Replace duplicate element by constructing it over the previous one.
392 if constexpr (bMove)
393 {
394 ::new ((void*)ExistingElement) ElementType(MoveTemp(*Ptr));
395 }
396 else
397 {
398 ::new ((void*)ExistingElement) ElementType(*Ptr);
399 }
400 }
401 else
402 {
403 // Add the element to the end of the container
404 if constexpr (bMove)
405 {
406 Elements.Add(MoveTemp(*Ptr));
407 }
408 else
409 {
410 Elements.Add(*Ptr);
411 }
412
413 // If the new element is precisely 'greater than' all existing sorted elements and we haven't added any unsorted elements yet, then just expand
414 // the sorted view to include the new element.
415 if (InsertIndex == SortedView.Num() && Elements.Num() == SortedView.Num() + 1)
416 {
417 SortedView = Elements;
418 }
419 }
420 }
421
422 --Count;
423 if (Count == 0)
424 {
425 // If we still have unsorted elements, sort them into the rest of the container
426 if (SortedView.Num() != Elements.Num())
427 {
428 Algo::Sort(Elements, SortPredicate());
429 }
430 return;
431 }
432
433 ++Ptr;
434 }
435 }
436
437public:
444 template <typename OtherArrayAllocator, typename OtherSortPredicate>
446 {
447 this->AppendImpl<true>(Other.Elements.GetData(), Other.Elements.Num());
448 Other.Reset();
449 }
450 template <typename OtherArrayAllocator, typename OtherSortPredicate>
452 {
453 this->AppendImpl<false>(Other.Elements.GetData(), Other.Elements.Num());
454 }
455 template <typename OtherArrayAllocator>
457 {
458 this->AppendImpl<true>(Other.GetData(), Other.Num());
459 Other.Reset();
460 }
462 {
463 this->AppendImpl<false>(Other.GetData(), Other.Num());
464 }
465 template <typename OtherArrayAllocator>
466 void Append(std::initializer_list<ElementType> Other)
467 {
468 this->AppendImpl<false>(Other.GetData(), (int32)Other.Num());
469 }
470
477 {
478 return Elements.IsValidIndex(Id.AsInteger());
479 }
480
482 {
483 return Elements[Id.AsInteger()];
484 }
486 {
487 return (*const_cast<TSortedSet*>(this))[Id];
488 }
490 {
491 return (*this)[Id];
492 }
494 {
495 return (*this)[Id];
496 }
497
498private:
499 using ElementArrayType = TArray<ElementType, ArrayAllocator>;
500
502 template <typename InitArgType>
504 {
505 int32 InsertIndex = Algo::LowerBound(Elements, InInitArg, SortPredicate());
506
507 // Since we returned lower bound we already know InInitArg <= InsertIndex key. So if InInitArg is not < InsertIndex key, they must be equal
508 bool bAlreadyExists = InsertIndex < Elements.Num() && !SortPredicate()(InInitArg, Elements[InsertIndex]);
509
510 ElementType* DataPtr = nullptr;
511 if (!bAlreadyExists)
512 {
513 Elements.EmplaceAt(InsertIndex, Forward<InitArgType>(InInitArg));
514 }
515
517 {
519 }
520
521 return *(Elements.GetData() + InsertIndex);
522 }
523
525 [[nodiscard]] UE_FORCEINLINE_HINT int32 FindIndex(KeyInitType Key) const
526 {
527 return Algo::BinarySearch(Elements, Key, SortPredicate());
528 }
529
531 template <typename InitArgType>
532 UE_FORCEINLINE_HINT ElementType* AllocateMemoryForEmplace(InitArgType&& InInitArg, bool* bIsAlreadyInSetPtr = nullptr)
533 {
534 int32 InsertIndex = Algo::LowerBound(Elements, InInitArg, SortPredicate());
535
536 // Since we returned lower bound we already know InInitArg <= InsertIndex key. So if InInitArg is not < InsertIndex key, they must be equal
537 bool bAlreadyExists = InsertIndex < Elements.Num() && !SortPredicate()(InInitArg, Elements[InsertIndex]);
538
539 ElementType* DataPtr = nullptr;
540 if (bAlreadyExists)
541 {
542 // Replacing element, delete old one
543 DataPtr = Elements.GetData() + InsertIndex;
544 DestructItem(DataPtr);
545 }
546 else
547 {
548 // Adding new one, this may reallocate Elements
549 Elements.InsertUninitialized(InsertIndex);
550 DataPtr = Elements.GetData() + InsertIndex;
551 }
552
554 {
556 }
557
558 return DataPtr;
559 }
560
562 template<bool bConst>
563 class TBaseIterator
564 {
565 private:
566 using ArrayIteratorType = std::conditional_t<bConst, typename ElementArrayType::TConstIterator, typename ElementArrayType::TIterator>;
567 using ItElementType = std::conditional_t<bConst, const ElementType, ElementType>;
568
569 protected:
570 [[nodiscard]] UE_FORCEINLINE_HINT TBaseIterator(const ArrayIteratorType& InArrayIt)
571 : ArrayIt(InArrayIt)
572 {
573 }
574
575 public:
576 UE_FORCEINLINE_HINT TBaseIterator& operator++()
577 {
578 ++ArrayIt;
579 return *this;
580 }
581
583 [[nodiscard]] UE_FORCEINLINE_HINT explicit operator bool() const
584 {
585 return !!ArrayIt;
586 }
587
588 [[nodiscard]] UE_FORCEINLINE_HINT bool operator==(const TBaseIterator& Rhs) const
589 {
590 return ArrayIt == Rhs.ArrayIt;
591 }
592 [[nodiscard]] UE_FORCEINLINE_HINT bool operator!=(const TBaseIterator& Rhs) const
593 {
594 return !(*this == Rhs);
595 }
596
598 {
599 return FSetElementId::FromInteger(ArrayIt.GetIndex());
600 }
601
602 UE_FORCEINLINE_HINT ItElementType& operator*() const
603 {
604 return *ArrayIt;
605 }
606 UE_FORCEINLINE_HINT ItElementType* operator->() const
607 {
608 return &*ArrayIt;
609 }
610
611 protected:
612 ArrayIteratorType ArrayIt;
613 };
614
616 ElementArrayType Elements;
617
618public:
620 class TIterator : public TBaseIterator<false>
621 {
622 public:
624 : TBaseIterator<false>(InSet.Elements.CreateIterator())
625 {
626 }
627
630 {
631 TBaseIterator<false>::ArrayIt.RemoveCurrent();
632 }
633 };
634
636 class TConstIterator : public TBaseIterator<true>
637 {
638 public:
640 : TBaseIterator<true>(InSet.Elements.CreateConstIterator())
641 {
642 }
643 };
644
647 {
648 return TIterator(*this);
649 }
650
656
657public:
663 {
664 return Elements.begin();
665 }
667 {
668 return Elements.begin();
669 }
671 {
672 return Elements.end();
673 }
675 {
676 return Elements.end();
677 }
678};
679
681
682template <typename ElementType, typename ArrayAllocator, typename SortPredicate>
684{
685 Ar << Set.Elements;
686
687 if (Ar.IsLoading())
688 {
689 // We need to re-sort, in case the predicate is not consistent with what it was before
690 Algo::Sort(Set.Elements, SortPredicate());
691 }
692
693 return Ar;
694}
695
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
FORCEINLINE constexpr void DestructItem(ElementType *Element)
Definition MemoryOps.h:56
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
#define DECLARE_TEMPLATE_INTRINSIC_TYPE_LAYOUT(TemplatePrefix, T)
Definition MemoryLayout.h:661
bool SortPredicate(const FCompileOnTheFlyData &A, const FCompileOnTheFlyData &B)
Definition MovieSceneCompiledDataManager.cpp:364
const bool
Definition NetworkReplayStreaming.h:178
FArchive & operator<<(FArchive &Ar, TSortedSet< ElementType, ArrayAllocator, SortPredicate > &Set)
Definition SortedSet.h:683
float Val(const FString &Value)
Definition UnrealMath.cpp:3163
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition Archive.h:1208
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
Definition OutputDevice.h:133
void Logf(const FmtType &Fmt)
Definition OutputDevice.h:234
Definition SetUtilities.h:95
static UE_FORCEINLINE_HINT FSetElementId FromInteger(int32 Integer)
Definition SetUtilities.h:121
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr ElementType * GetData() const
Definition ArrayView.h:295
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType & Last(SizeType IndexFromTheEnd=0) UE_LIFETIMEBOUND
Definition Array.h:1263
UE_NODEBUG UE_FORCEINLINE_HINT void InsertUninitialized(SizeType Index)
Definition Array.h:1782
void RemoveAt(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2083
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
UE_REWRITE SizeType Max() const
Definition Array.h:1161
UE_REWRITE bool IsEmpty() const
Definition Array.h:1133
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_NODEBUG UE_FORCEINLINE_HINT bool IsValidIndex(SizeType Index) const
Definition Array.h:1122
UE_NODEBUG void CountBytes(FArchive &Ar) const
Definition Array.h:1649
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(void) const
Definition Array.h:1059
UE_FORCEINLINE_HINT void Shrink()
Definition Array.h:1278
UE_FORCEINLINE_HINT void EmplaceAt(SizeType Index, ArgsType &&... Args)
Definition Array.h:2665
void Empty(SizeType Slack=0)
Definition Array.h:2273
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition SortedSet.h:637
UE_FORCEINLINE_HINT TConstIterator(const TSortedSet &InSet)
Definition SortedSet.h:639
Definition SortedSet.h:621
UE_FORCEINLINE_HINT void RemoveCurrent()
Definition SortedSet.h:629
UE_FORCEINLINE_HINT TIterator(TSortedSet &InSet)
Definition SortedSet.h:623
Definition SortedSet.h:25
TSortedSet(const TSortedSet &)=default
TSortedSet & operator=(TSortedSet< ElementType, OtherArrayAllocator, SortPredicate > &&Other)
Definition SortedSet.h:82
void Append(TArray< ElementType, OtherArrayAllocator > &&Other)
Definition SortedSet.h:456
TSortedSet & operator=(const TSortedSet< ElementType, OtherArrayAllocator, SortPredicate > &Other)
Definition SortedSet.h:90
TSortedSet()=default
UE_FORCEINLINE_HINT auto end() const
Definition SortedSet.h:674
UE_FORCEINLINE_HINT void Empty(int32 ExpectedNumElements=0)
Definition SortedSet.h:121
UE_FORCEINLINE_HINT void Reset()
Definition SortedSet.h:127
UE_FORCEINLINE_HINT bool operator!=(const TSortedSet &Other) const
Definition SortedSet.h:111
typename TTypeTraits< ElementType >::ConstPointerType KeyInitType
Definition SortedSet.h:33
void Append(std::initializer_list< ElementType > Other)
Definition SortedSet.h:466
UE_FORCEINLINE_HINT void Reserve(int32 Number)
Definition SortedSet.h:139
static constexpr bool bHasIntrusiveUnsetOptionalState
Definition SortedSet.h:65
TSortedSet & operator=(std::initializer_list< ElementType > InitList)
Definition SortedSet.h:97
TSortedSet & operator=(TSortedSet &&)=default
UE_FORCEINLINE_HINT auto end()
Definition SortedSet.h:670
UE_FORCEINLINE_HINT TIterator CreateIterator()
Definition SortedSet.h:646
UE_FORCEINLINE_HINT int32 GetMaxIndex() const
Definition SortedSet.h:168
void Append(TArrayView< const ElementType > Other)
Definition SortedSet.h:461
TSortedSet(TSortedSet< InElementType, OtherArrayAllocator, SortPredicate > &&Other)
Definition SortedSet.h:43
UE_FORCEINLINE_HINT const ElementType & Get(FSetElementId Id) const
Definition SortedSet.h:493
UE_FORCEINLINE_HINT TConstIterator CreateConstIterator() const
Definition SortedSet.h:652
TSortedSet(FIntrusiveUnsetOptionalState Tag)
Definition SortedSet.h:68
UE_FORCEINLINE_HINT void Shrink()
Definition SortedSet.h:133
bool operator==(FIntrusiveUnsetOptionalState Tag) const
Definition SortedSet.h:72
ElementType * FindArbitraryElement()
Definition SortedSet.h:283
TArray< ElementType > Array() &&
Definition SortedSet.h:312
UE_FORCEINLINE_HINT void CountBytes(FArchive &Ar) const
Definition SortedSet.h:185
UE_FORCEINLINE_HINT ElementType * Find(KeyInitType Key)
Definition SortedSet.h:247
FSetElementId Emplace(InitArgType &&InInitArg, bool *bIsAlreadyInSetPtr=nullptr)
Definition SortedSet.h:214
void Dump(FOutputDevice &Ar)
Definition SortedSet.h:322
UE_FORCEINLINE_HINT bool Contains(KeyInitType Key) const
Definition SortedSet.h:300
friend class TSortedSet
Definition SortedSet.h:27
UE_FORCEINLINE_HINT auto begin() const
Definition SortedSet.h:666
TSortedSet & operator=(const TSortedSet &)=default
UE_FORCEINLINE_HINT bool operator==(const TSortedSet &Other) const
Definition SortedSet.h:105
UE_FORCEINLINE_HINT bool IsValidId(FSetElementId Id) const
Definition SortedSet.h:476
UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize() const
Definition SortedSet.h:179
UE_FORCEINLINE_HINT ElementType & Get(FSetElementId Id)
Definition SortedSet.h:489
InElementType ElementType
Definition SortedSet.h:32
UE_FORCEINLINE_HINT ElementType & operator[](FSetElementId Id)
Definition SortedSet.h:481
UE_FORCEINLINE_HINT FSetElementId Add(ElementType &&InValue, bool *bIsAlreadyInSetPtr=nullptr)
Definition SortedSet.h:201
TArray< ElementType > Array() const &
Definition SortedSet.h:308
UE_FORCEINLINE_HINT auto begin()
Definition SortedSet.h:662
bool IsEmpty() const
Definition SortedSet.h:150
UE_FORCEINLINE_HINT const ElementType & operator[](FSetElementId Id) const
Definition SortedSet.h:485
UE_FORCEINLINE_HINT ElementType & FindOrAdd(ElementType &&InValue, bool *bIsAlreadyInSetPtr=nullptr)
Definition SortedSet.h:273
UE_FORCEINLINE_HINT int32 Remove(KeyInitType InKey)
Definition SortedSet.h:229
void Append(TSortedSet< ElementType, OtherArrayAllocator, OtherSortPredicate > &&Other)
Definition SortedSet.h:445
UE_FORCEINLINE_HINT ElementType & FindOrAdd(const ElementType &InValue, bool *bIsAlreadyInSetPtr=nullptr)
Definition SortedSet.h:269
const ElementType * FindArbitraryElement() const
Definition SortedSet.h:289
UE_FORCEINLINE_HINT int32 Num() const
Definition SortedSet.h:156
UE_FORCEINLINE_HINT FSetElementId Add(const ElementType &InValue, bool *bIsAlreadyInSetPtr=nullptr)
Definition SortedSet.h:197
void Append(const TSortedSet< ElementType, OtherArrayAllocator, OtherSortPredicate > &Other)
Definition SortedSet.h:451
TSortedSet(const TSortedSet< InElementType, OtherArrayAllocator, SortPredicate > &Other)
Definition SortedSet.h:50
UE_FORCEINLINE_HINT const ElementType * Find(KeyInitType Key) const
Definition SortedSet.h:257
TSortedSet(TSortedSet &&)=default
UE_FORCEINLINE_HINT int32 Max() const
Definition SortedSet.h:162
TSortedSet(std::initializer_list< ElementType > InitList)
Definition SortedSet.h:56
UE_REWRITE void Sort(RangeType &&Range)
Definition Sort.h:16
UE_REWRITE auto LowerBound(const RangeType &Range, const ValueType &Value, SortPredicateType SortPredicate) -> decltype(GetNum(Range))
Definition BinarySearch.h:92
auto BinarySearch(const RangeType &Range, const ValueType &Value, SortPredicateType SortPredicate) -> decltype(GetNum(Range))
Definition BinarySearch.h:173
FVector operator*(const FSquareMatrix3 &InMatrix, const FVector &InVector)
Definition ARBlueprintLibrary.cpp:650
bool operator!=(const FCachedAssetKey &A, const FCachedAssetKey &B)
Definition AssetDataMap.h:506
bool operator==(const FCachedAssetKey &A, const FCachedAssetKey &B)
Definition AssetDataMap.h:501
FORCEINLINE UE_STRING_CLASS RhsType && Rhs
Definition String.cpp.inl:718
@ false
Definition radaudio_common.h:23
Definition IntrusiveUnsetOptionalState.h:71
TCallTraits< T >::ConstPointerType ConstPointerType
Definition UnrealTypeTraits.h:337