UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
StructOnScope.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "UObject/Class.h"
7#include "Templates/Casts.h"
9
11
13{
14protected:
20
21 virtual void Initialize()
22 {
23 if (const UStruct* ScriptStructPtr = ScriptStruct.Get())
24 {
25 SampleStructMemory = (uint8*)FMemory::Malloc(ScriptStructPtr->GetStructureSize() ? ScriptStructPtr->GetStructureSize() : 1, ScriptStructPtr->GetMinAlignment());
26 ScriptStructPtr->InitializeStruct(SampleStructMemory);
27 OwnsMemory = true;
28 }
29 }
30
31public:
32
37
39 {
40 if (this != &InOther)
41 {
42 Reset();
43
44 ScriptStruct = InOther.ScriptStruct;
45 SampleStructMemory = InOther.SampleStructMemory;
46 OwnsMemory = InOther.OwnsMemory;
47
48 InOther.OwnsMemory = false;
49 InOther.Reset();
50 }
51 return *this;
52 }
53
56
57 virtual bool OwnsStructMemory() const
58 {
59 return OwnsMemory;
60 }
61
63 {
64 return SampleStructMemory;
65 }
66
67 virtual const uint8* GetStructMemory() const
68 {
69 return SampleStructMemory;
70 }
71
72 virtual const UStruct* GetStruct() const
73 {
74 return ScriptStruct.Get();
75 }
76
81
82 COREUOBJECT_API virtual UPackage* GetPackage() const;
83 COREUOBJECT_API virtual void SetPackage(UPackage* InPackage);
84
85 virtual bool IsValid() const
86 {
88 }
89
90 virtual void Destroy()
91 {
92 if (!OwnsMemory)
93 {
94 return;
95 }
96
97 if (const UStruct* ScriptStructPtr = ScriptStruct.Get())
98 {
100 {
101 ScriptStructPtr->DestroyStruct(SampleStructMemory);
102 }
103 ScriptStruct = nullptr;
104 }
105
107 {
109 SampleStructMemory = nullptr;
110 }
111 }
112
113 virtual void Reset()
114 {
115 Destroy();
116
117 ScriptStruct = nullptr;
118 SampleStructMemory = nullptr;
119 OwnsMemory = false;
120 }
121
123
131
132 // If the struct definition is still available and there is struct memory to read from,
133 // add any object references in the struct data to the collector
135};
136
140template<typename T>
141class TStructOnScope final : public FStructOnScope
142{
143public:
144 TStructOnScope() = default;
145 virtual ~TStructOnScope() = default;
146
149
153 {
154 if (const UScriptStruct* ScriptStructPtr = ::Cast<UScriptStruct>(ScriptStruct.Get()))
155 {
156 ScriptStructPtr->CopyScriptStruct(SampleStructMemory, &InStruct);
157 }
158 }
159
162 {
163 Initialize(TBaseStructure<typename TRemoveReference<U>::Type>::Get());
164 if (const UScriptStruct* ScriptStructPtr = ::Cast<UScriptStruct>(ScriptStruct.Get()))
165 {
166 ScriptStructPtr->CopyScriptStruct(SampleStructMemory, &InStruct);
167 }
168 return *this;
169 }
170
175 template<typename U
176 , typename = typename TEnableIf<TIsDerivedFrom<typename TRemoveReference<U>::Type, T>::IsDerived, void>::Type
177 , typename... TArgs>
178 void InitializeAs(TArgs&&... InArgs)
179 {
180 Destroy();
181 if (UScriptStruct* ScriptStructPtr = TBaseStructure<U>::Get())
182 {
183 ScriptStruct = ScriptStructPtr;
184 SampleStructMemory = (uint8*)FMemory::Malloc(ScriptStructPtr->GetStructureSize() ? ScriptStructPtr->GetStructureSize() : 1);
185 new (SampleStructMemory) U(Forward<TArgs>(InArgs)...);
186 OwnsMemory = true;
187 }
188 }
189
196 {
197 if (const UScriptStruct* ScriptStructPtr = ::Cast<const UScriptStruct>(InOther.GetStruct()))
198 {
199 if (ScriptStructPtr->IsChildOf(TBaseStructure<T>::Get()))
200 {
201 Initialize(ScriptStructPtr);
202 ScriptStructPtr->CopyScriptStruct(SampleStructMemory, InOther.GetStructMemory());
203 return true;
204 }
205 }
206 else
207 {
208 Destroy();
209 return true;
210 }
211 return false;
212 }
213
220 {
221 if (this == &InOther)
222 {
223 return true;
224 }
225 if (const UScriptStruct* ScriptStructPtr = ::Cast<const UScriptStruct>(InOther.GetStruct()))
226 {
227 if (ScriptStructPtr->IsChildOf(TBaseStructure<T>::Get()) && InOther.OwnsStructMemory())
228 {
229 *static_cast<FStructOnScope*>(this) = MoveTemp(InOther);
230 return true;
231 }
232 }
233 else
234 {
235 Destroy();
236 return true;
237 }
238 return false;
239 }
240
246 {
248 {
249 UE_LOG(LogClass, Fatal, TEXT("Initialize of %s to %s failed"), *InOther.GetStruct()->GetName(), *TBaseStructure<T>::Get()->GetName());
250 }
251 }
252
258 {
260 {
261 UE_LOG(LogClass, Fatal, TEXT("Initialize of %s failed"), *TBaseStructure<T>::Get()->GetName());
262 }
263 }
264
265 T* Get() const
266 {
267 return reinterpret_cast<T*>(SampleStructMemory);
268 }
269
270 T* operator->() const
271 {
272 return Get();
273 }
274
275 explicit operator bool() const
276 {
277 return IsValid();
278 }
279
280 template<typename U>
281 U* Cast()
282 {
284 {
285 return reinterpret_cast<U*>(SampleStructMemory);
286 }
287 return nullptr;
288 }
289
290 template<typename U>
291 const U* Cast() const
292 {
293 return const_cast<TStructOnScope*>(this)->Cast<U>();
294 }
295
296 template<typename U>
298 {
299 U* Result = nullptr;
300 if (!IsValid())
301 {
302 UE_LOG(LogClass, Fatal, TEXT("Cast of nullptr to %s failed"), *TBaseStructure<U>::Get()->GetName());
303 return Result;
304 }
305
306 Result = Cast<U>();
307 if (!Result)
308 {
309 UE_LOG(LogClass, Fatal, TEXT("Cast of %s to %s failed"), *TBaseStructure<T>::Get()->GetName(), *TBaseStructure<U>::Get()->GetName());
310 }
311 return Result;
312 }
313
314 template<typename U>
315 const U* CastChecked() const
316 {
317 return const_cast<TStructOnScope*>(this)->CastChecked<U>();
318 }
319
321 {
322 if (Ar.IsLoading())
323 {
324 FString StructPath;
325 Ar << StructPath;
326 if (!StructPath.IsEmpty())
327 {
329 if (ScriptStructPtr == nullptr || !ScriptStructPtr->IsChildOf(TBaseStructure<T>::Get()))
330 {
331 Ar.SetError();
332 return;
333 }
334 ScriptStruct = ScriptStructPtr;
335 Initialize();
336 ScriptStructPtr->SerializeItem(Ar, SampleStructMemory, nullptr);
337 }
338 }
339 // Saving
340 else
341 {
342 FString StructPath;
343 if (UScriptStruct* ScriptStructPtr = const_cast<UScriptStruct*>(::Cast<UScriptStruct>(ScriptStruct.Get())))
344 {
345 StructPath = ScriptStructPtr->GetPathName();
346 Ar << StructPath;
347 ScriptStructPtr->SerializeItem(Ar, SampleStructMemory, nullptr);
348 }
349 else
350 {
351 Ar << StructPath;
352 }
353 }
354 }
355
356private:
363};
364
372template <typename T, typename U = T, typename... TArgs>
374{
376 Struct.template InitializeAs<U>(Forward<TArgs>(Args)...);
377 return Struct;
378}
379
380template<typename T>
382{
383 Struct.Serialize(Ar);
384 return Ar;
385}
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
const bool
Definition NetworkReplayStreaming.h:178
TStructOnScope< T > MakeStructOnScope(TArgs &&... Args)
Definition StructOnScope.h:373
FArchive & operator<<(FArchive &Ar, TStructOnScope< T > &Struct)
Definition StructOnScope.h:381
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 Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
CORE_API void SetError()
Definition Archive.cpp:314
Definition UObjectGlobals.h:2492
Definition StructOnScope.h:13
virtual COREUOBJECT_API UPackage * GetPackage() const
Definition StructOnScope.cpp:43
void Initialize(TWeakObjectPtr< const UStruct > InScriptStruct)
Definition StructOnScope.h:125
virtual COREUOBJECT_API ~FStructOnScope()
Definition StructOnScope.cpp:37
virtual void Destroy()
Definition StructOnScope.h:90
FStructOnScope(const FStructOnScope &)=delete
FStructOnScope & operator=(FStructOnScope &&InOther)
Definition StructOnScope.h:38
TWeakObjectPtr< UPackage > Package
Definition StructOnScope.h:17
virtual const UStruct * GetStruct() const
Definition StructOnScope.h:72
virtual void Initialize()
Definition StructOnScope.h:21
virtual const uint8 * GetStructMemory() const
Definition StructOnScope.h:67
virtual bool OwnsStructMemory() const
Definition StructOnScope.h:57
COREUOBJECT_API void AddReferencedObjects(FReferenceCollector &Collector)
Definition StructOnScope.cpp:53
virtual void Reset()
Definition StructOnScope.h:113
TWeakObjectPtr< const UStruct > & GetStructPtr()
Definition StructOnScope.h:77
TWeakObjectPtr< const UStruct > ScriptStruct
Definition StructOnScope.h:15
virtual uint8 * GetStructMemory()
Definition StructOnScope.h:62
COREUOBJECT_API FStructOnScope()
Definition StructOnScope.cpp:6
virtual COREUOBJECT_API void SetPackage(UPackage *InPackage)
Definition StructOnScope.cpp:48
bool OwnsMemory
Definition StructOnScope.h:19
uint8 * SampleStructMemory
Definition StructOnScope.h:16
virtual bool IsValid() const
Definition StructOnScope.h:85
FStructOnScope & operator=(const FStructOnScope &)=delete
Definition EnableIf.h:20
Definition StructOnScope.h:142
bool InitializeFrom(FStructOnScope &&InOther)
Definition StructOnScope.h:219
bool InitializeFrom(const FStructOnScope &InOther)
Definition StructOnScope.h:195
TStructOnScope & operator=(U &&InStruct)
Definition StructOnScope.h:161
virtual ~TStructOnScope()=default
void InitializeAs(TArgs &&... InArgs)
Definition StructOnScope.h:178
U * CastChecked()
Definition StructOnScope.h:297
void Serialize(FArchive &Ar)
Definition StructOnScope.h:320
void InitializeFromChecked(FStructOnScope &&InOther)
Definition StructOnScope.h:257
T * Get() const
Definition StructOnScope.h:265
TStructOnScope()=default
U * Cast()
Definition StructOnScope.h:281
TStructOnScope & operator=(TStructOnScope &&InOther)=default
TStructOnScope(TStructOnScope &&InOther)=default
void InitializeFromChecked(const FStructOnScope &InOther)
Definition StructOnScope.h:245
TStructOnScope(U &&InStruct)
Definition StructOnScope.h:151
T * operator->() const
Definition StructOnScope.h:270
const U * Cast() const
Definition StructOnScope.h:291
const U * CastChecked() const
Definition StructOnScope.h:315
Definition Package.h:216
Definition Class.h:1720
COREUOBJECT_API void SerializeItem(FArchive &Ar, void *Value, void const *Defaults)
Definition Class.cpp:3378
Definition Class.h:480
bool IsChildOf() const
Definition Class.h:788
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition Class.h:5288
Definition RemoveReference.h:10
T Type
Definition RemoveReference.h:10
Definition WeakObjectPtrTemplates.h:25
FORCEINLINE void Reset()
Definition WeakObjectPtrTemplates.h:92
FORCEINLINE T * Get(bool bEvenIfPendingKill) const
Definition WeakObjectPtrTemplates.h:132
FORCEINLINE bool IsValid(bool bEvenIfPendingKill, bool bThreadsafeTest=false) const
Definition WeakObjectPtrTemplates.h:232