UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PropertyOptional.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include "Misc/Optional.h"
8
9#define UE_API COREUOBJECT_API
10
11//
12// Encapsulates the memory layout logic for an optional without implementing the full FProperty API.
13//
15{
21
23 {
24 checkf(ValueProperty, TEXT("Expected ValueProperty to be initialized"));
25 return ValueProperty;
26 }
27
28 inline bool IsSet(const void* Data) const
29 {
30 checkSlow(Data);
31 return ValueProperty->HasIntrusiveUnsetOptionalState()
33 : *GetIsSetPointer(Data);
34 }
35 inline void* MarkSetAndGetInitializedValuePointerToReplace(void* Data) const
36 {
37 checkSlow(Data);
38 if (ValueProperty->HasIntrusiveUnsetOptionalState())
39 {
40 if (!IsSet(Data))
41 {
42 // Need to destroy the value in its optional unset state first
45 }
46 }
47 else
48 {
49 bool* IsSetPointer = GetIsSetPointer(Data);
50 if (!*IsSetPointer)
51 {
53 *IsSetPointer = true;
54 }
55 }
56 return Data;
57 }
58 inline void MarkUnset(void* Data) const
59 {
60 checkSlow(Data);
61 if (ValueProperty->HasIntrusiveUnsetOptionalState())
62 {
64 }
65 else
66 {
67 bool* IsSetPointer = GetIsSetPointer(Data);
68 if (*IsSetPointer)
69 {
71 *IsSetPointer = false;
72 }
73 }
74 }
75
76 // For reading the value of a set optional.
77 // Must be called on a non-null pointer to a set optional.
78 inline const void* GetValuePointerForRead(const void* Data) const
79 {
80 checkSlow(Data && IsSet(Data));
81 return Data;
82 }
83
84 // For replacing the value of a set optional.
85 // Must be called on a non-null pointer to a set optional.
86 inline void* GetValuePointerForReplace(void* Data) const
87 {
88 checkSlow(Data && IsSet(Data));
89 return Data;
90 }
91
92 // For reading the value of a set optional.
93 // Must be called on a non-null pointer to an optional.
94 // If called on an unset optional, will return null.
95 inline const void* GetValuePointerForReadIfSet(const void* Data) const
96 {
97 checkSlow(Data);
98 return IsSet(Data) ? Data : nullptr;
99 }
100
101 // For replacing the value of a set optional.
102 // Must be called on a non-null pointer to an optional.
103 // If called on an unset optional, will return null.
104 inline void* GetValuePointerForReplaceIfSet(void* Data) const
105 {
106 checkSlow(Data);
107 return IsSet(Data) ? Data : nullptr;
108 }
109
110 // For calling from polymorphic code that doesn't know whether it needs the value pointer for
111 // read or replace, or whether it has a const pointer or not.
112 // Must be called on a non-null pointer to a set optional.
113 inline const void* GetValuePointerForReadOrReplace(const void* Data) const
114 {
115 checkSlow(Data && IsSet(Data));
116 return Data;
117 }
118 inline void* GetValuePointerForReadOrReplace(void* Data) const
119 {
120 checkSlow(Data && IsSet(Data));
121 return Data;
122 }
123
124 // For calling from polymorphic code that doesn't know whether it needs the value pointer for
125 // read or replace, or whether it has a const pointer or not.
126 // Must be called on a non-null pointer to an optional.
127 // If called on an unset optional, will return null.
128 inline const void* GetValuePointerForReadOrReplaceIfSet(const void* Data) const
129 {
130 checkSlow(Data);
131 return IsSet(Data) ? Data : nullptr;
132 }
133 inline void* GetValuePointerForReadOrReplaceIfSet(void* Data) const
134 {
135 checkSlow(Data);
136 return IsSet(Data) ? Data : nullptr;
137 }
138
139 inline int32 CalcSize() const
140 {
141 if (ValueProperty->HasIntrusiveUnsetOptionalState())
142 {
143 return ValueProperty->GetSize();
144 }
145 else
146 {
148 }
149 }
150
151protected:
152
153 constexpr FOptionalPropertyLayout() : ValueProperty(nullptr) {}
154
155 // Variables
156 FProperty* ValueProperty; // The type of the inner value
157
158 inline int32 CalcIsSetOffset() const
159 {
160 check(!ValueProperty->HasIntrusiveUnsetOptionalState());
163 TEXT("Expected optional value property to have aligned size, but got misaligned size %i for %s that has minimum alignment %i"),
167 return ValueProperty->GetSize();
168 }
169
170 UE_FORCEINLINE_HINT bool* GetIsSetPointer(void* Data) const
171 {
172 return reinterpret_cast<bool*>(reinterpret_cast<uint8*>(Data) + CalcIsSetOffset());
173 }
174 UE_FORCEINLINE_HINT const bool* GetIsSetPointer(const void* Data) const
175 {
176 return reinterpret_cast<const bool*>(reinterpret_cast<const uint8*>(Data) + CalcIsSetOffset());
177 }
178};
179
180//
181// A property corresponding to UE's optional type, TOptional<T>.
182// NOTE: this property is not yet handled by all UE subsystems that produce or consume properties.
183//
185{
187
188public:
189
191 UE_API FOptionalProperty(FFieldVariant InOwner, const UECodeGen_Private::FGenericPropertyParams& Prop);
192
193#if UE_WITH_CONSTINIT_UOBJECT
194 consteval FOptionalProperty(
195 UE::CodeGen::ConstInit::FPropertyParams InBaseParams,
197 )
200 {
201 // CONSTINIT_UOBJECT_TODO: Inner property element size at compile time (currently populated during LinkInternal)
202 }
203#endif
204
205 UE_API virtual ~FOptionalProperty();
206
207 // Sets the optional property's value property.
209
210 // UObject interface
211 UE_API virtual void Serialize(FArchive& Ar) override;
213 // End of UObject interface
214
215 // Field interface
216 UE_API virtual void PostDuplicate(const FField& InField) override;
217 UE_API virtual FField* GetInnerFieldByName(const FName& InName) override;
218 UE_API virtual void GetInnerFields(TArray<FField*>& OutFields) override;
219 UE_API virtual void AddCppProperty(FProperty* Property) override;
220 // End of Field interface
221
222 // UHT interface
223 UE_API virtual FString GetCPPType(FString* ExtendedTypeText = NULL, uint32 CPPExportFlags = 0) const override;
224 UE_API virtual FString GetCPPMacroType(FString& ExtendedTypeText) const override;
225 // End of UHT interface
226
227 // FProperty interface
228 UE_API virtual void LinkInternal(FArchive& Ar) override;
229 UE_API virtual bool Identical(const void* A, const void* B, uint32 PortFlags) const override;
230 UE_API virtual void SerializeItem(FStructuredArchive::FSlot Slot, void* Value, void const* Defaults) const override;
231 UE_API virtual bool NetSerializeItem(FArchive& Ar, UPackageMap* Map, void* Data, TArray<uint8>* MetaData = NULL) const override;
232 UE_API virtual bool SupportsNetSharedSerialization() const override;
233 UE_API virtual void ExportText_Internal(FString& ValueStr, const void* ContainerOrPropertyPtr, EPropertyPointerType PropertyPointerType, const void* DefaultValue, UObject* Parent, int32 PortFlags, UObject* ExportRootScope) const override;
235 UE_API virtual void CopyValuesInternal(void* Dest, void const* Src, int32 Count) const override;
236 UE_API virtual void ClearValueInternal(void* Data) const override;
237 UE_API virtual void InitializeValueInternal(void* Data) const override;
238 UE_API virtual void DestroyValueInternal(void* Data) const override;
240 UE_API virtual void FinishDestroyInternal(void* Data) const override;
241 UE_API virtual void InstanceSubobjects(void* Data, void const* DefaultData, TNotNull<UObject*> Owner, struct FObjectInstancingGraph* InstanceGraph) override;
242 UE_API virtual int32 GetMinAlignment() const override;
245 UE_API virtual EConvertFromTypeResult ConvertFromType(const FPropertyTag& Tag, FStructuredArchive::FSlot Slot, uint8* Data, const UStruct* DefaultsStruct, const uint8* Defaults) override;
246 UE_API virtual uint32 GetValueTypeHashInternal(const void* Src) const override;
247 UE_API virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
248 UE_API virtual bool UseBinaryOrNativeSerialization(const FArchive& Ar) const override;
249 UE_API virtual bool LoadTypeName(UE::FPropertyTypeName Type, const FPropertyTag* Tag = nullptr) override;
250 UE_API virtual void SaveTypeName(UE::FPropertyTypeNameBuilder& Type) const override;
251 UE_API virtual bool CanSerializeFromTypeName(UE::FPropertyTypeName Type) const override;
252 UE_API virtual bool HasIntrusiveUnsetOptionalState() const override;
253 UE_API virtual bool SameType(const FProperty* Other) const override;
254
256 UE_API virtual void* ResolveVisitedPathInfo(void* Data, const FPropertyVisitorInfo& Info) const override;
257 // End of FProperty interface
258};
259
260#undef UE_API
#define NULL
Definition oodle2base.h:134
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define checkfSlow(expr, format,...)
Definition AssertionMacros.h:333
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define DECLARE_FIELD_API(TClass, TSuperClass, TStaticFlags, TRequiredAPI)
Definition Field.h:257
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
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
T TNotNull
Definition NotNull.h:307
@ CASTCLASS_FOptionalProperty
Definition ObjectMacros.h:392
EObjectFlags
Definition ObjectMacros.h:552
EPropertyObjectReferenceType
Definition ObjectMacros.h:533
#define UE_API
Definition PropertyOptional.h:9
EPropertyVisitorControlFlow
Definition PropertyVisitor.h:15
EPropertyPointerType
Definition UnrealType.h:156
EConvertFromTypeResult
Definition UnrealType.h:130
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition Field.h:353
Definition Field.h:556
FField Super
Definition Field.h:575
COREUOBJECT_API FString GetFullName() const
Definition Field.cpp:599
FFieldVariant Owner
Definition Field.h:600
Definition NameTypes.h:617
Definition PropertyOptional.h:185
virtual UE_API void CopyValuesInternal(void *Dest, void const *Src, int32 Count) const override
Definition PropertyOptional.cpp:414
virtual UE_API bool UseBinaryOrNativeSerialization(const FArchive &Ar) const override
Definition PropertyOptional.cpp:641
virtual UE_API void SaveTypeName(UE::FPropertyTypeNameBuilder &Type) const override
Definition PropertyOptional.cpp:671
virtual UE_API EConvertFromTypeResult ConvertFromType(const FPropertyTag &Tag, FStructuredArchive::FSlot Slot, uint8 *Data, const UStruct *DefaultsStruct, const uint8 *Defaults) override
Definition PropertyOptional.cpp:487
virtual UE_API FString GetCPPMacroType(FString &ExtendedTypeText) const override
Definition PropertyOptional.cpp:143
virtual UE_API void GetInnerFields(TArray< FField * > &OutFields) override
Definition PropertyOptional.cpp:119
virtual UE_API void EmitReferenceInfo(UE::GC::FSchemaBuilder &Schema, int32 BaseOffset, TArray< const FStructProperty * > &EncounteredStructProps, UE::GC::FPropertyStack &DebugPath) override
Definition GarbageCollection.cpp:6641
virtual UE_API void ExportText_Internal(FString &ValueStr, const void *ContainerOrPropertyPtr, EPropertyPointerType PropertyPointerType, const void *DefaultValue, UObject *Parent, int32 PortFlags, UObject *ExportRootScope) const override
Definition PropertyOptional.cpp:340
virtual UE_API bool CanSerializeFromTypeName(UE::FPropertyTypeName Type) const override
Definition PropertyOptional.cpp:682
virtual UE_API void SerializeItem(FStructuredArchive::FSlot Slot, void *Value, void const *Defaults) const override
Definition PropertyOptional.cpp:195
virtual UE_API void AddReferencedObjects(FReferenceCollector &Collector) override
Definition PropertyOptional.cpp:79
virtual UE_API bool ContainsObjectReference(TArray< const FStructProperty * > &EncounteredStructProps, EPropertyObjectReferenceType InReferenceType=EPropertyObjectReferenceType::Strong) const override
Definition GarbageCollection.cpp:6840
virtual UE_API bool SupportsNetSharedSerialization() const override
Definition PropertyOptional.cpp:335
virtual UE_API void LinkInternal(FArchive &Ar) override
Definition PropertyOptional.cpp:150
virtual UE_API bool LoadTypeName(UE::FPropertyTypeName Type, const FPropertyTag *Tag=nullptr) override
Definition PropertyOptional.cpp:653
virtual UE_API void * ResolveVisitedPathInfo(void *Data, const FPropertyVisitorInfo &Info) const override
Definition PropertyOptional.cpp:716
virtual UE_API FField * GetInnerFieldByName(const FName &InName) override
Definition PropertyOptional.cpp:109
virtual UE_API void ClearValueInternal(void *Data) const override
Definition PropertyOptional.cpp:431
virtual UE_API uint32 GetValueTypeHashInternal(const void *Src) const override
Definition PropertyOptional.cpp:628
virtual UE_API ~FOptionalProperty()
Definition PropertyOptional.cpp:52
virtual UE_API void FinishDestroyInternal(void *Data) const override
Definition PropertyOptional.cpp:463
virtual UE_API bool HasIntrusiveUnsetOptionalState() const override
Definition PropertyOptional.cpp:68
virtual UE_API void GetPreloadDependencies(TArray< UObject * > &OutDeps) override
Definition PropertyOptional.cpp:95
virtual UE_API int32 GetMinAlignment() const override
Definition PropertyOptional.cpp:482
virtual UE_API void InitializeValueInternal(void *Data) const override
Definition PropertyOptional.cpp:436
virtual UE_API void InstanceSubobjects(void *Data, void const *DefaultData, TNotNull< UObject * > Owner, struct FObjectInstancingGraph *InstanceGraph) override
Definition PropertyOptional.cpp:472
virtual UE_API EPropertyVisitorControlFlow Visit(FPropertyVisitorContext &Context, const TFunctionRef< EPropertyVisitorControlFlow(const FPropertyVisitorContext &)> InFunc) const override
Definition PropertyOptional.cpp:694
virtual UE_API void DestroyValueInternal(void *Data) const override
Definition PropertyOptional.cpp:448
virtual UE_API void PostDuplicate(const FField &InField) override
Definition PropertyOptional.cpp:102
virtual UE_API bool ContainsClearOnFinishDestroyInternal(TArray< const FStructProperty * > &EncounteredStructProps) const override
Definition PropertyOptional.cpp:457
virtual UE_API bool SameType(const FProperty *Other) const override
Definition PropertyOptional.cpp:74
UE_API void SetValueProperty(FProperty *InValueProperty)
Definition PropertyOptional.cpp:61
virtual UE_API void AddCppProperty(FProperty *Property) override
Definition PropertyOptional.cpp:126
Definition OutputDevice.h:133
Definition UnrealType.h:174
void DestroyValue(void *Dest) const
Definition UnrealType.h:1025
virtual COREUOBJECT_API bool IsIntrusiveOptionalValueSet(const void *Data) const
Definition Property.cpp:2368
virtual COREUOBJECT_API int32 GetMinAlignment() const
Definition Property.cpp:1193
virtual void virtual ExportText_Internal(FString &ValueStr, const void *PropertyValueOrContainer, EPropertyPointerType PointerType, const void *DefaultValue, UObject *Parent, int32 PortFlags, UObject *ExportRootScope=nullptr) const PURE_VIRTUAL(FProperty const TCHAR ImportText_Internal)(const TCHAR *Buffer, void *ContainerOrPropertyPtr, EPropertyPointerType PointerType, UObject *OwnerObject, int32 PortFlags, FOutputDevice *ErrorText) const PURE_VIRTUAL(FProperty
Definition UnrealType.h:719
virtual FString GetCPPType(FString *ExtendedTypeText=NULL, uint32 CPPExportFlags=0) const PURE_VIRTUAL(FProperty
Definition UnrealType.h:339
UE_FORCEINLINE_HINT int32 GetSize() const
Definition UnrealType.h:1206
virtual COREUOBJECT_API void ClearIntrusiveOptionalValue(void *Data) const
Definition Property.cpp:2374
virtual bool Identical(const void *A, const void *B, uint32 PortFlags=0) const PURE_VIRTUAL(FProperty
Definition UnrealType.h:515
void InitializeValue(void *Dest) const
Definition UnrealType.h:1108
virtual void SerializeItem(FStructuredArchive::FSlot Slot, void *Value, void const *Defaults=NULL) const PURE_VIRTUAL(FProperty virtual COREUOBJECT_API boo NetSerializeItem)(FArchive &Ar, UPackageMap *Map, void *Data, TArray< uint8 > *MetaData=NULL) const
Definition UnrealType.h:582
Definition UObjectGlobals.h:2492
Definition StructuredArchiveSlots.h:52
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition PropertyTypeName.h:151
Definition PropertyTypeName.h:46
Definition GarbageCollectionSchema.h:62
Definition GarbageCollectionSchema.h:265
Definition Object.h:95
Definition CoreNet.h:191
Definition Class.h:480
Definition Class.h:4941
Definition PropertyOptional.h:15
constexpr FOptionalPropertyLayout()
Definition PropertyOptional.h:153
void * GetValuePointerForReadOrReplace(void *Data) const
Definition PropertyOptional.h:118
UE_FORCEINLINE_HINT const bool * GetIsSetPointer(const void *Data) const
Definition PropertyOptional.h:174
void MarkUnset(void *Data) const
Definition PropertyOptional.h:58
FProperty * ValueProperty
Definition PropertyOptional.h:156
void * GetValuePointerForReadOrReplaceIfSet(void *Data) const
Definition PropertyOptional.h:133
void * GetValuePointerForReplaceIfSet(void *Data) const
Definition PropertyOptional.h:104
bool IsSet(const void *Data) const
Definition PropertyOptional.h:28
FProperty * GetValueProperty() const
Definition PropertyOptional.h:22
int32 CalcIsSetOffset() const
Definition PropertyOptional.h:158
const void * GetValuePointerForReadOrReplaceIfSet(const void *Data) const
Definition PropertyOptional.h:128
constexpr FOptionalPropertyLayout(FProperty *InValueProperty)
Definition PropertyOptional.h:16
int32 CalcSize() const
Definition PropertyOptional.h:139
const void * GetValuePointerForReadOrReplace(const void *Data) const
Definition PropertyOptional.h:113
const void * GetValuePointerForRead(const void *Data) const
Definition PropertyOptional.h:78
UE_FORCEINLINE_HINT bool * GetIsSetPointer(void *Data) const
Definition PropertyOptional.h:170
void * MarkSetAndGetInitializedValuePointerToReplace(void *Data) const
Definition PropertyOptional.h:35
const void * GetValuePointerForReadIfSet(const void *Data) const
Definition PropertyOptional.h:95
void * GetValuePointerForReplace(void *Data) const
Definition PropertyOptional.h:86
Definition PropertyTag.h:38
Definition PropertyVisitor.h:268
Definition PropertyVisitor.h:32