UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
FindReferencersArchive.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/Sort.h"
7#include "Containers/Array.h"
9#include "Containers/Map.h"
11#include "CoreMinimal.h"
12#include "HAL/PlatformCrt.h"
13#include "HAL/PlatformMath.h"
16
17class FArchive;
18class UObject;
19
20/*----------------------------------------------------------------------------
21 FFindReferencersArchive.
22----------------------------------------------------------------------------*/
27{
28public:
37
49
58
61
71
78 virtual FString GetArchiveName() const { return TEXT("FFindReferencersArchive"); }
79
85
86protected:
87 // Container specifically optimized for the operations we're doing here.
88 // - Reduce allocations while adding.
89 // - Reduce cache misses while searching.
90 // - Fast to reset its values as they're all contiguous in memory.
91 // - Reduce iteration count to initialized values only when searching for values > 0 by stopping at ValueNum().
93 {
94 public:
95 // Functions used to prepare the container until it is frozen
96
98 {
99 CheckUnfrozen();
100
101 TargetObjects.Reserve(Num);
102 }
103
105 {
106 CheckUnfrozen();
107
108 TargetObjects.Add(Object);
109 }
110
111 void Freeze()
112 {
113 CheckUnfrozen();
114
115 bFrozen = true;
116 Algo::Sort(TargetObjects);
118 }
119
120 // Functions to use once the container has been frozen
121
122 // This will initialize and return the refcount associated with the object if it exists
124 {
125 CheckFrozen();
126
129 {
130 return nullptr;
131 }
132
133 if (ExistingIndex >= RefCounts.Num())
134 {
136 }
137
138 return &RefCounts[ExistingIndex];
139 }
140
141 // This won't initialize the refcount associated with the object even if it exists
143 {
144 CheckFrozen();
145
148 {
149 return nullptr;
150 }
151
152 return (ExistingIndex < RefCounts.Num()) ? &RefCounts[ExistingIndex] : nullptr;
153 }
154
156 {
157 RefCounts.Empty(TargetObjects.Num());
158 }
159
161 {
162 return RefCounts.Num();
163 }
164
166 {
167 return TargetObjects[Index];
168 }
169
170 // This should not be queried past RefCountNum(), otherwise you're doing useless work.
172 {
173 return RefCounts[Index];
174 }
175
176 private:
177 UE_FORCEINLINE_HINT void CheckFrozen() const
178 {
179 checkf(bFrozen, TEXT("Container has not been frozen and cannot be searched yet"));
180 }
181
182 UE_FORCEINLINE_HINT void CheckUnfrozen() const
183 {
184 checkf(!bFrozen, TEXT("Container has been frozen and cannot be modified anymore"));
185 }
186
187 bool bFrozen = false;
188 TArray<UObject*> TargetObjects;
189 TArray<int32> RefCounts;
190 };
191
193
196
199
200private:
201
206};
#define NULL
Definition oodle2base.h:134
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ 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
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Num
Definition MetalRHIPrivate.h:234
Definition ArchiveUObject.h:17
friend FArchive & operator<<(FArchive &Ar, ANSICHAR &Value)
Definition Archive.h:1387
Definition Archive.h:1208
Definition FindReferencersArchive.h:93
void Reserve(int32 Num)
Definition FindReferencersArchive.h:97
void ResetRefCounts()
Definition FindReferencersArchive.h:155
int32 RefCountNum() const
Definition FindReferencersArchive.h:160
int32 * GetRefCountPtr(UObject *Object)
Definition FindReferencersArchive.h:123
void Freeze()
Definition FindReferencersArchive.h:111
UObject * GetObject(int32 Index) const
Definition FindReferencersArchive.h:165
int32 GetRefCount(int32 Index) const
Definition FindReferencersArchive.h:171
void AddObject(UObject *Object)
Definition FindReferencersArchive.h:104
const int32 * TryGetRefCountPtr(UObject *Object) const
Definition FindReferencersArchive.h:142
Definition FindReferencersArchive.h:27
virtual FString GetArchiveName() const
Definition FindReferencersArchive.h:78
FTargetObjectContainer TargetObjects
Definition FindReferencersArchive.h:192
class UObject * PotentialReferencer
Definition FindReferencersArchive.h:198
COREUOBJECT_API int32 AppendReferenceCounts(TMap< class UObject *, int32 > &out_ReferenceCounts) const
Definition FindReferencersArchive.cpp:143
COREUOBJECT_API int32 GetReferenceCounts(TMap< class UObject *, int32 > &out_ReferenceCounts) const
Definition FindReferencersArchive.cpp:137
COREUOBJECT_API void ResetPotentialReferencer(UObject *InPotentialReferencer)
Definition FindReferencersArchive.cpp:44
TMultiMap< class UObject *, class FProperty * > ReferenceMap
Definition FindReferencersArchive.h:195
COREUOBJECT_API int32 GetReferenceCount(class UObject *TargetObject, TArray< class FProperty * > *out_ReferencingProperties=NULL) const
Definition FindReferencersArchive.cpp:104
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void SetNumZeroed(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2340
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
void Empty(SizeType Slack=0)
Definition Array.h:2273
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition UnrealString.h.inl:34
Definition Object.h:95
UE_REWRITE void Sort(RangeType &&Range)
Definition Sort.h:16
auto BinarySearch(const RangeType &Range, const ValueType &Value, SortPredicateType SortPredicate) -> decltype(GetNum(Range))
Definition BinarySearch.h:173
U16 Index
Definition radfft.cpp:71