UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
UObjectIterator.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 UObjectIterator.h: High level iterators for uobject
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
11#include "UObject/UObjectHash.h"
14#include "UObject/Object.h"
15#include "UObject/Class.h"
16
21{
22public:
36 {
37 // casting UObjectBase to UObject for clients
38 return GetObject();
39 }
45 {
46 return GetObject();
47 }
48};
49
50
51
53{
54 None = 0,
55 ThreadSafe = 1, // Use only with function local iterators. Persistent iterators may prevent (hang) UObject creation on worker threads otherwise.
56 ThreadSafeAdvance = 2 // Can be used for global iterators but locks the global UObjectArray each time the iterator advances to the next object (can be slow but does not result in deadlocks).
57};
58
67
74template <EObjectIteratorThreadSafetyOptions IteratorThreadSafety>
76{
77protected:
78
80 inline bool AdvanceIterator()
81 {
82 bool bResult = false;
84 {
85 bResult = Advance();
86 }
87 else
88 {
90 bResult = Advance();
92 }
93 return bResult;
94 }
95
96public:
97
108 , Class(InClass)
111 {
112 check(Class);
113
115 {
117 }
118
119 do
120 {
121 UObject* Object = **this;
122 if (!(Object->HasAnyFlags(ExclusionFlags) || Object->HasAnyInternalFlags(InternalExclusionFlags) || (Class != UObject::StaticClass() && !Object->IsA(Class))))
123 {
124 break;
125 }
126 } while (AdvanceIterator());
127 }
128
145
160
171
176 {
177 //@warning: behavior is partially mirrored in UnObjGC.cpp. Make sure to adapt code there as well if you make changes below.
178 // verify that the async loading exclusion flag still matches (i.e. we didn't start/stop async loading within the scope of the iterator)
180
181 while (AdvanceIterator())
182 {
183 UObject* Object = **this;
184 if (!(Object->HasAnyFlags(ExclusionFlags) || (Class != UObject::StaticClass() && !Object->IsA(Class)) || Object->HasAnyInternalFlags(InternalExclusionFlags)))
185 {
186 break;
187 }
188 }
189 }
194 inline UObject* operator*() const
195 {
196 // casting UObjectBase to UObject for clients
197 FUObjectItem* ObjectItem = GetObject();
198 return (UObject*)(ObjectItem ? ObjectItem->GetObject() : nullptr);
199 }
204 inline UObject* operator->() const
205 {
206 FUObjectItem* ObjectItem = GetObject();
207 return (UObject*)(ObjectItem ? ObjectItem->GetObject() : nullptr);
208 }
209private:
211 UClass* Class;
212protected:
217};
218
226
228UE_DEPRECATED(4.27, "FObjectIterator is not thread safe, use FThreadSafeObjectIterator or FPresistentThreadSafeObjectIterator instead.")
230
231
240
249
256template< class T > class TObjectIterator
257{
258public:
260 {
261 EndTag
262 };
263
273
278 : Index(Begin.ObjectArray.Num())
279 {
280 }
281
286 {
287 Advance();
288 }
289
291 UE_FORCEINLINE_HINT explicit operator bool() const
292 {
293 return ObjectArray.IsValidIndex(Index);
294 }
297 {
298 return !(bool)*this;
299 }
300
308 {
309 return (T*)GetObject();
310 }
316 UE_FORCEINLINE_HINT T* operator-> () const
318 {
319 return (T*)GetObject();
320 }
321
322 UE_FORCEINLINE_HINT bool operator==(const TObjectIterator& Rhs) const { return Index == Rhs.Index; }
323 UE_FORCEINLINE_HINT bool operator!=(const TObjectIterator& Rhs) const { return Index != Rhs.Index; }
324
325protected:
332 {
333 return ObjectArray[Index];
334 }
335
340 inline bool Advance()
341 {
342 //@todo UE check this for LHS on Index on consoles
343 while(++Index < ObjectArray.Num())
344 {
345 if (GetObject())
346 {
347 return true;
348 }
349 }
350 return false;
351 }
352
353protected:
358};
359
362{
363public:
364
375
385
395
400 {
401 // verify that the async loading exclusion flag still matches (i.e. we didn't start/stop async loading within the scope of the iterator)
403 while (AdvanceIterator())
404 {
405 if (!(*this)->HasAnyFlags(ExclusionFlags) && !(*this)->HasAnyInternalFlags(InternalExclusionFlags))
406 {
407 break;
408 }
409 }
410 }
411};
412
413template <typename T>
426
427template <>
445
constexpr bool operator!(EUpdateTransformFlags Value)
Definition ActorComponent.h:116
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT FLinearColor operator*(float Scalar, const FLinearColor &Color)
Definition Color.h:473
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
#define FUNCTION_NON_NULL_RETURN_END
Definition Platform.h:807
#define FUNCTION_NON_NULL_RETURN_START
Definition Platform.h:804
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Num
Definition MetalRHIPrivate.h:234
const bool
Definition NetworkReplayStreaming.h:178
EInternalObjectFlags
Definition ObjectMacros.h:631
@ Unreachable
Object is not reachable on the object graph.
@ PendingConstruction
Object didn't have its class constructor called yet (only the UObjectBase one to initialize its most ...
#define EInternalObjectFlags_AsyncLoading
Definition ObjectMacros.h:681
EObjectFlags
Definition ObjectMacros.h:552
@ RF_NoFlags
No flags, used to avoid a cast.
Definition ObjectMacros.h:555
@ RF_ClassDefaultObject
This object is used as the default template for all instances of a class. One object is created for e...
Definition ObjectMacros.h:563
UClass * StaticClass()
Definition ReflectedTypeAccessors.h:13
bool(* IsInAsyncLoadingThread)()
Definition ThreadingBase.cpp:357
FUObjectArray GUObjectArray
Definition UObjectHash.cpp:55
void GetObjectsOfClass(const UClass *ClassToLookFor, TArray< UObject * > &Results, bool bIncludeDerivedClasses, EObjectFlags ExclusionFlags, EInternalObjectFlags ExclusionInternalFlags)
Definition UObjectHash.cpp:1812
TObjectIteratorBase< EObjectIteratorThreadSafetyOptions::None > FUnsafeObjectIterator
Definition UObjectIterator.h:225
EObjectIteratorThreadSafetyOptions
Definition UObjectIterator.h:53
EInternalObjectFlags GetObjectIteratorDefaultInternalExclusionFlags(EInternalObjectFlags InternalExclusionFlags)
Definition UObjectIterator.h:59
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition UObjectIterator.h:21
UE_FORCEINLINE_HINT FUObjectItem * operator->() const
Definition UObjectIterator.h:44
FRawObjectIterator(bool bOnlyGCedObjects=false)
Definition UObjectIterator.h:27
UE_FORCEINLINE_HINT FUObjectItem * operator*() const
Definition UObjectIterator.h:35
Definition UObjectArray.h:1356
bool Advance()
Definition UObjectArray.h:1435
const FUObjectArray & GetIteratedArray() const
Definition UObjectArray.h:1453
EEndTagType
Definition UObjectArray.h:1359
@ EndTag
Definition UObjectArray.h:1360
UE_FORCEINLINE_HINT FUObjectItem * GetObject() const
Definition UObjectArray.h:1427
Definition UObjectArray.h:940
void LockInternalArray() const
Definition UObjectArray.h:1335
void UnlockInternalArray() const
Definition UObjectArray.h:1345
Definition Array.h:670
Definition Array.h:64
Definition UObjectIterator.h:76
TObjectIteratorBase(const TObjectIteratorBase &Other)
Definition UObjectIterator.h:149
bool AdvanceIterator()
Definition UObjectIterator.h:80
EObjectFlags ExclusionFlags
Definition UObjectIterator.h:214
~TObjectIteratorBase()
Definition UObjectIterator.h:164
TObjectIteratorBase(UClass *InClass=UObject::StaticClass(), bool bOnlyGCedObjects=false, EObjectFlags AdditionalExclusionFlags=RF_NoFlags, EInternalObjectFlags InInternalExclusionFlags=EInternalObjectFlags::None)
Definition UObjectIterator.h:106
void operator++()
Definition UObjectIterator.h:175
EInternalObjectFlags InternalExclusionFlags
Definition UObjectIterator.h:216
UObject * operator->() const
Definition UObjectIterator.h:204
UObject * operator*() const
Definition UObjectIterator.h:194
TObjectIteratorBase(FUObjectArray::TIterator::EEndTagType, const TObjectIteratorBase &Begin)
Definition UObjectIterator.h:134
TObjectIterator(TObjectIteratorBase::EEndTagType, const TObjectIterator &Begin)
Definition UObjectIterator.h:391
void operator++()
Definition UObjectIterator.h:399
TObjectIterator(bool bOnlyGCedObjects)
Definition UObjectIterator.h:381
TObjectIterator(EObjectFlags AdditionalExclusionFlags=RF_ClassDefaultObject, bool bIncludeDerivedClasses=true, EInternalObjectFlags InInternalExclusionFlags=EInternalObjectFlags::None)
Definition UObjectIterator.h:371
Definition UObjectIterator.h:257
int32 Index
Definition UObjectIterator.h:357
bool Advance()
Definition UObjectIterator.h:340
TObjectIterator(EObjectFlags AdditionalExclusionFlags=RF_ClassDefaultObject, bool bIncludeDerivedClasses=true, EInternalObjectFlags InInternalExclusionFlags=EInternalObjectFlags::None)
Definition UObjectIterator.h:267
UE_FORCEINLINE_HINT bool operator!=(const TObjectIterator &Rhs) const
Definition UObjectIterator.h:323
TObjectIterator(EEndTagType, const TObjectIterator &Begin)
Definition UObjectIterator.h:277
UE_FORCEINLINE_HINT void operator++()
Definition UObjectIterator.h:285
TArray< UObject * > ObjectArray
Definition UObjectIterator.h:355
UE_FORCEINLINE_HINT bool operator==(const TObjectIterator &Rhs) const
Definition UObjectIterator.h:322
EEndTagType
Definition UObjectIterator.h:260
@ EndTag
Definition UObjectIterator.h:261
UE_FORCEINLINE_HINT UObject * GetObject() const
Definition UObjectIterator.h:331
Definition Class.h:3793
Definition Object.h:95
EInternalObjectFlags GetAsyncLoadingInternalFlagsExclusion()
Definition ObjectVisibility.cpp:18
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition UObjectArray.h:50
class UObjectBase * GetObject() const
Definition UObjectArray.h:146
friend TObjectIterator< UObject > begin(const TObjectRange &Range)
Definition UObjectIterator.h:440
TObjectRange(EObjectFlags AdditionalExclusionFlags=RF_ClassDefaultObject, bool bIncludeDerivedClasses=true, EInternalObjectFlags InInternalExclusionFlags=EInternalObjectFlags::None)
Definition UObjectIterator.h:430
TObjectIterator< UObject > Begin
Definition UObjectIterator.h:443
TObjectRange(bool bOnlyGCedObjects)
Definition UObjectIterator.h:435
friend TObjectIterator< UObject > end(const TObjectRange &Range)
Definition UObjectIterator.h:441
Definition UObjectIterator.h:415
friend TObjectIterator< T > begin(const TObjectRange &Range)
Definition UObjectIterator.h:421
TObjectRange(EObjectFlags AdditionalExclusionFlags=RF_ClassDefaultObject, bool bIncludeDerivedClasses=true, EInternalObjectFlags InInternalExclusionFlags=EInternalObjectFlags::None)
Definition UObjectIterator.h:416
TObjectIterator< T > Begin
Definition UObjectIterator.h:424
friend TObjectIterator< T > end(const TObjectRange &Range)
Definition UObjectIterator.h:422