UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
LazyObjectPtr.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 LazyObjectPtr.h: Lazy, guid-based weak pointer to a UObject, mostly useful for actors
5=============================================================================*/
6
7#pragma once
8
10#include "CoreGlobals.h"
11#include "HAL/Platform.h"
13#include "Misc/Guid.h"
16#include "Templates/Casts.h"
17#include "Templates/Requires.h"
19#include "UObject/Object.h"
21
22#include <type_traits>
23
24class UObject;
25
26template <typename T> struct TIsPODType;
27template <typename T> struct TIsWeakPointerType;
28
34{
37
39 : Guid(InGuid)
40 {}
41
44 {
45 Guid.Invalidate();
46 }
47
49 COREUOBJECT_API explicit FUniqueObjectGuid(const UObject* InObject);
50
52 COREUOBJECT_API FString ToString() const;
53
55 COREUOBJECT_API void FromString(const FString& From);
56
59
66
69 {
70 return Guid.IsValid();
71 }
72
74 {
75 return Guid == Other.Guid;
76 }
77
79 {
80 return Guid != Other.Guid;
81 }
82
85 {
86 // A default GUID is 0,0,0,0 and this is "invalid"
87 return !IsValid();
88 }
89
91 {
92 return GetTypeHash(ObjectGuid.Guid);
93 }
96 {
97 return Guid;
98 }
99
101 {
102 Ar << ObjectGuid.Guid;
103 return Ar;
104 }
105
107 {
108 Slot << ObjectGuid.Guid;
109 }
110
111 UE_DEPRECATED(5.4, "The current object tag is no longer used by TSoftObjectPtr, you can remove all calls")
113 {
114 return 0;
115 }
116 UE_DEPRECATED(5.4, "The current object tag is no longer used by TSoftObjectPtr, you can remove all calls")
118 {
119 return 0;
120 }
121
127 template <typename T>
132
133private:
135 FGuid Guid;
136};
137
138template<> struct TIsPODType<FUniqueObjectGuid> { enum { Value = true }; };
139
150struct FLazyObjectPtr : public TPersistentObjectPtr<FUniqueObjectGuid>
151{
152private:
154
155public:
160
163 {
164 (*this)=Object;
165 }
170 template <typename T>
173 {
174 // This needs to be a template instead of TObjectPtr<const UObject> because C++ does derived-to-base
175 // pointer conversions ('standard conversion sequences') in more cases than TSmartPtr<Derived>-to-TSmartPtr<Base>
176 // conversions ('user-defined conversions'), meaning it doesn't auto-convert in many real use cases.
177 //
178 // https://en.cppreference.com/w/cpp/language/implicit_conversion
179 }
180
187 {
188 *this = FObjectPtr(const_cast<UObject*>(Object));
189 }
190 template <typename T>
192 {
193 // This needs to be a template instead of TObjectPtr<const UObject> because C++ does derived-to-base
194 // pointer conversions ('standard conversion sequences') in more cases than TSmartPtr<Derived>-to-TSmartPtr<Base>
195 // conversions ('user-defined conversions'), meaning it doesn't auto-convert in many real use cases.
196 //
197 // https://en.cppreference.com/w/cpp/language/implicit_conversion
198
199 *this = FObjectPtr(Object);
200 }
201
207
210 {
211 *this = GetUniqueID().FixupForPIE(PIEInstance);
212 }
213
216
218 COREUOBJECT_API static void ResetPIEFixups();
219};
220
223
228template<class T=UObject>
230{
231public:
232 using ElementType = T;
233
234 TLazyObjectPtr() = default;
235
240
242 template <
243 typename U
244 UE_REQUIRES(std::is_convertible_v<U*, T*>)
245 >
250
252 template <
253 typename U
254 UE_REQUIRES(std::is_convertible_v<U*, T*>)
255 >
261
267
273
279
291
301
308 {
309 // there are cases where a TLazyObjectPtr can get an object of the wrong type assigned to it which are difficult to avoid
310 // e.g. operator=(const FUniqueObjectGuid& ObjectID)
311 // "WARNING: this doesn't check the type of the object is correct..."
312 return dynamic_cast<T*>(FLazyObjectPtr::Get());
313 }
314
317 {
318 return *Get();
319 }
320
323 {
324 return Get();
325 }
326
329 {
331 }
332
339 {
341 }
342
349 {
351 }
352
359 {
360 return FLazyObjectPtr::IsNull();
361 }
362
364 UE_FORCEINLINE_HINT explicit operator bool() const
365 {
366 return IsValid();
367 }
368
371 {
372 return GetTypeHash(static_cast<const FLazyObjectPtr&>(*this));
373 }
374
379
381 template<typename U, typename = decltype((T*)nullptr == (U*)nullptr)>
383 {
384 return (const FLazyObjectPtr&)*this == (const FLazyObjectPtr&)Rhs;
385 }
386 template<typename U, typename = decltype((T*)nullptr != (U*)nullptr)>
388 {
389 return (const FLazyObjectPtr&)*this != (const FLazyObjectPtr&)Rhs;
390 }
391
393 template<typename U, typename = decltype((T*)nullptr == (U*)nullptr)>
394 UE_FORCEINLINE_HINT bool operator==(const U* Rhs) const
395 {
396 return Get() == Rhs;
397 }
398
401 {
402 return !IsValid();
403 }
405 template<typename U, typename = decltype((T*)nullptr != (U*)nullptr)>
406 UE_FORCEINLINE_HINT bool operator!=(const U* Rhs) const
407 {
408 return Get() != Rhs;
409 }
410
413 {
414 return IsValid();
415 }
416};
417
419template<typename T>
421{
422 return LazyObjectPtr.GetLazyObjecPtrTypeHash();
423}
424
425template<typename T>
427{
428 LazyObjectPtr.SerializePtr(Ar);
429 return Ar;
430}
431
433template<typename T, typename U, typename = decltype((T*)nullptr == (U*)nullptr)>
435{
436 return Lhs == Rhs.Get();
437}
438
440template<typename T>
442{
443 return !Rhs.IsValid();
444}
445
447template<typename T, typename U, typename = decltype((T*)nullptr != (U*)nullptr)>
449{
450 return Lhs != Rhs.Get();
451}
452
454template<typename T>
456{
457 return Rhs.IsValid();
458}
459
460template<class T> struct TIsPODType<TLazyObjectPtr<T> > { enum { Value = TIsPODType<FLazyObjectPtr>::Value }; };
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::TYPE_OF_NULLPTR TYPE_OF_NULLPTR
The type of the C++ nullptr keyword.
Definition Platform.h:1157
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
UE_FORCEINLINE_HINT bool operator==(const U *Lhs, const TLazyObjectPtr< T > &Rhs)
Definition LazyObjectPtr.h:434
FArchive & operator<<(FArchive &Ar, TLazyObjectPtr< T > &LazyObjectPtr)
Definition LazyObjectPtr.h:426
UE_FORCEINLINE_HINT uint32 GetTypeHash(const TLazyObjectPtr< T > &LazyObjectPtr)
Definition LazyObjectPtr.h:420
UE_FORCEINLINE_HINT bool operator!=(const U *Lhs, const TLazyObjectPtr< T > &Rhs)
Definition LazyObjectPtr.h:448
const bool
Definition NetworkReplayStreaming.h:178
#define UE_REQUIRES(...)
Definition Requires.h:86
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition StructuredArchiveSlots.h:144
Definition StructuredArchiveSlots.h:52
Definition Object.h:95
int32 GetPlayInEditorID()
Definition CoreGlobals.cpp:877
Definition Guid.h:109
void Invalidate()
Definition Guid.h:305
bool IsValid() const
Definition Guid.h:318
Definition LazyObjectPtr.h:151
UE_FORCEINLINE_HINT void operator=(const UObject *Object)
Definition LazyObjectPtr.h:186
UE_FORCEINLINE_HINT void FixupForPIE(int32 PIEInstance)
Definition LazyObjectPtr.h:209
UE_FORCEINLINE_HINT void operator=(FObjectPtr Object)
Definition LazyObjectPtr.h:182
UE_FORCEINLINE_HINT void operator=(const FUniqueObjectGuid &InObjectID)
Definition LazyObjectPtr.h:203
UE_FORCEINLINE_HINT void operator=(TObjectPtr< T > Object)
Definition LazyObjectPtr.h:191
UE_FORCEINLINE_HINT FLazyObjectPtr(FObjectPtr Object)
Definition LazyObjectPtr.h:162
UE_FORCEINLINE_HINT FLazyObjectPtr(const UObject *Object)
Definition LazyObjectPtr.h:166
UE_FORCEINLINE_HINT FLazyObjectPtr(TObjectPtr< T > Object)
Definition LazyObjectPtr.h:171
static COREUOBJECT_API void PossiblySerializeObjectGuid(UObject *Object, FStructuredArchive::FRecord Record)
Definition LazyObjectPtr.cpp:109
UE_FORCEINLINE_HINT FLazyObjectPtr()
Definition LazyObjectPtr.h:157
static COREUOBJECT_API void ResetPIEFixups()
Definition LazyObjectPtr.cpp:196
Definition ObjectPtr.h:55
Definition LazyObjectPtr.h:34
FUniqueObjectGuid(const FGuid &InGuid)
Definition LazyObjectPtr.h:38
UE_FORCEINLINE_HINT friend uint32 GetTypeHash(const FUniqueObjectGuid &ObjectGuid)
Definition LazyObjectPtr.h:90
UE_FORCEINLINE_HINT void Reset()
Definition LazyObjectPtr.h:43
static int32 InvalidateTag()
Definition LazyObjectPtr.h:117
COREUOBJECT_API UObject * ResolveObject() const
Definition LazyObjectPtr.cpp:55
UE_FORCEINLINE_HINT const FGuid & GetGuid() const
Definition LazyObjectPtr.h:95
COREUOBJECT_API FUniqueObjectGuid FixupForPIE(int32 PlayInEditorID=UE::GetPlayInEditorID()) const
Definition LazyObjectPtr.cpp:50
UE_FORCEINLINE_HINT bool IsValid() const
Definition LazyObjectPtr.h:68
UE_FORCEINLINE_HINT bool operator==(const FUniqueObjectGuid &Other) const
Definition LazyObjectPtr.h:73
static UE_FORCEINLINE_HINT FUniqueObjectGuid GetOrCreateIDForObject(const UObject *Object)
Definition LazyObjectPtr.h:123
friend FArchive & operator<<(FArchive &Ar, FUniqueObjectGuid &ObjectGuid)
Definition LazyObjectPtr.h:100
friend void operator<<(FStructuredArchive::FSlot Slot, FUniqueObjectGuid &ObjectGuid)
Definition LazyObjectPtr.h:106
static COREUOBJECT_API FUniqueObjectGuid GetOrCreateIDForObject(FObjectPtr Object)
Definition LazyObjectPtr.cpp:83
COREUOBJECT_API void FromString(const FString &From)
Definition LazyObjectPtr.cpp:66
static UE_FORCEINLINE_HINT FUniqueObjectGuid GetOrCreateIDForObject(TObjectPtr< T > Object)
Definition LazyObjectPtr.h:128
UE_FORCEINLINE_HINT bool operator!=(const FUniqueObjectGuid &Other) const
Definition LazyObjectPtr.h:78
static int32 GetCurrentTag()
Definition LazyObjectPtr.h:112
COREUOBJECT_API FUniqueObjectGuid(const UObject *InObject)
FUniqueObjectGuid()
Definition LazyObjectPtr.h:35
UE_FORCEINLINE_HINT bool IsDefault() const
Definition LazyObjectPtr.h:84
COREUOBJECT_API FString ToString() const
Definition LazyObjectPtr.cpp:61
Definition IsPODType.h:12
@ Value
Definition IsPODType.h:13
Definition UnrealTypeTraits.h:181
@ Value
Definition UnrealTypeTraits.h:182
Definition LazyObjectPtr.h:230
UE_FORCEINLINE_HINT bool IsStale() const
Definition LazyObjectPtr.h:338
UE_FORCEINLINE_HINT TLazyObjectPtr(const TLazyObjectPtr< U > &Other)
Definition LazyObjectPtr.h:246
TLazyObjectPtr(const TLazyObjectPtr< T > &)=default
UE_FORCEINLINE_HINT void operator=(T *Object)
Definition LazyObjectPtr.h:275
TLazyObjectPtr< T > & operator=(TLazyObjectPtr< T > &&)=default
UE_FORCEINLINE_HINT bool IsPending() const
Definition LazyObjectPtr.h:348
UE_FORCEINLINE_HINT T * operator->() const
Definition LazyObjectPtr.h:322
TLazyObjectPtr()=default
UE_FORCEINLINE_HINT bool IsNull() const
Definition LazyObjectPtr.h:358
UE_FORCEINLINE_HINT TLazyObjectPtr< T > & operator=(const TLazyObjectPtr< U > &Other)
Definition LazyObjectPtr.h:256
UE_FORCEINLINE_HINT uint32 GetLazyObjecPtrTypeHash() const
Definition LazyObjectPtr.h:370
UE_FORCEINLINE_HINT bool operator==(TYPE_OF_NULLPTR) const
Definition LazyObjectPtr.h:400
UE_FORCEINLINE_HINT const FUniqueObjectGuid & GetUniqueID() const
Definition LazyObjectPtr.h:297
UE_FORCEINLINE_HINT T & operator*() const
Definition LazyObjectPtr.h:316
UE_FORCEINLINE_HINT bool operator!=(TYPE_OF_NULLPTR) const
Definition LazyObjectPtr.h:412
UE_FORCEINLINE_HINT bool operator!=(const TLazyObjectPtr< U > &Rhs) const
Definition LazyObjectPtr.h:387
UE_FORCEINLINE_HINT bool IsValid() const
Definition LazyObjectPtr.h:328
UE_FORCEINLINE_HINT void SerializePtr(FArchive &Ar)
Definition LazyObjectPtr.h:375
UE_FORCEINLINE_HINT void Reset()
Definition LazyObjectPtr.h:269
UE_FORCEINLINE_HINT bool operator==(const TLazyObjectPtr< U > &Rhs) const
Definition LazyObjectPtr.h:382
UE_FORCEINLINE_HINT T * Get() const
Definition LazyObjectPtr.h:307
TLazyObjectPtr(TLazyObjectPtr< T > &&)=default
UE_FORCEINLINE_HINT TLazyObjectPtr(T *Object)
Definition LazyObjectPtr.h:263
UE_FORCEINLINE_HINT bool operator==(const U *Rhs) const
Definition LazyObjectPtr.h:394
UE_FORCEINLINE_HINT bool operator!=(const U *Rhs) const
Definition LazyObjectPtr.h:406
UE_FORCEINLINE_HINT void operator=(const FUniqueObjectGuid &InObjectID)
Definition LazyObjectPtr.h:287
T ElementType
Definition LazyObjectPtr.h:232
TLazyObjectPtr< T > & operator=(const TLazyObjectPtr< T > &)=default
Definition ObjectPtr.h:488
Definition PersistentObjectPtr.h:19
UE_FORCEINLINE_HINT bool IsPending() const
Definition PersistentObjectPtr.h:218
UE_FORCEINLINE_HINT friend uint32 GetTypeHash(const TPersistentObjectPtr &Ptr)
Definition PersistentObjectPtr.h:253
UE_FORCEINLINE_HINT bool IsStale() const
Definition PersistentObjectPtr.h:238
UObject * Get() const
Definition PersistentObjectPtr.h:120
UE_FORCEINLINE_HINT bool IsValid() const
Definition PersistentObjectPtr.h:228
UE_FORCEINLINE_HINT const FUniqueObjectGuid & GetUniqueID() const
Definition PersistentObjectPtr.h:104
UE_FORCEINLINE_HINT bool IsNull() const
Definition PersistentObjectPtr.h:247
void operator=(const FUniqueObjectGuid &InObjectID)
Definition PersistentObjectPtr.h:49
void Reset()
Definition PersistentObjectPtr.h:29