UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Class.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 Class.h: UClass definition.
5=============================================================================*/
6
7#pragma once
8
13#include "Containers/Array.h"
16#include "Containers/Map.h"
17#include "Containers/Set.h"
20#include "CoreTypes.h"
21#include "Algo/MaxElement.h"
22#include "Async/Mutex.h"
23#include "Async/SharedLock.h"
24#include "Async/SharedMutex.h"
25#include "Async/UniqueLock.h"
26#include "HAL/CriticalSection.h"
27#include "HAL/PlatformCrt.h"
28#include "HAL/UnrealMemory.h"
30#include "Logging/LogCategory.h"
31#include "Logging/LogMacros.h"
33#include "Math/Box2D.h"
35#include "Math/MathFwd.h"
36#include "Math/Matrix.h"
37#include "Math/Plane.h"
38#include "Math/Quat.h"
39#include "Math/RandomStream.h"
40#include "Math/Rotator.h"
41#include "Math/Transform.h"
42#include "Math/Vector2D.h"
43#include "Math/Vector4.h"
45#include "Misc/CString.h"
46#include "Misc/EnumClassFlags.h"
47#include "Misc/FallbackStruct.h"
48#include "Misc/Guid.h"
49#include "Misc/NotNull.h"
50#include "Misc/Optional.h"
51#include "Misc/ScopeRWLock.h"
55#include "Templates/EnableIf.h"
56#include "Templates/Identity.h"
58#include "Templates/IsEnum.h"
59#include "Templates/IsPODType.h"
61#include "Templates/Models.h"
62#include "Templates/NoDestroy.h"
63#include "Templates/Tuple.h"
68#include "UObject/CoreNative.h"
69#include "UObject/Field.h"
70#include "UObject/FieldPath.h"
72#include "UObject/NameTypes.h"
73#include "UObject/Object.h"
75#include "UObject/PropertyTag.h"
78#include "UObject/Script.h"
82#include "UObject/UnrealNames.h"
83#include "UObject/ObjectPtr.h"
86#include <type_traits>
87#include <atomic>
88
89#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_5
91#endif
92
93#include "Class.generated.h"
94
95class FArchive;
97class FField;
98class FOutputDevice;
99class FProperty;
101class FStructProperty;
103class UObject;
104class UPackageMap;
105class UPropertyWrapper;
106struct CGetTypeHashable;
107struct FArchiveFieldName;
108struct FAssetData;
109struct FBlake3Hash;
110struct FColor;
112struct FDoubleInterval;
113struct FDoubleRange;
114struct FDoubleRangeBound;
115struct FFallbackStruct;
116struct FFloatInterval;
117struct FFloatRange;
118struct FFloatRangeBound;
119struct FFrame;
120struct FInt32Interval;
121struct FInt32Range;
122struct FInt32RangeBound;
123struct FInterpCurveFloat;
125struct FInterpCurveQuat;
128struct FInterpCurveVector;
129struct FLinearColor;
132struct FPropertyTag;
133struct FRandomStream;
135template <typename FuncType> class TFunctionRef;
137
140
141#if UE_WITH_CONSTINIT_UOBJECT
145#elif PLATFORM_FORCE_UE_LOCK_USAGE
149#else
153#endif
154
155
156/*-----------------------------------------------------------------------------
157 FRepRecord.
158-----------------------------------------------------------------------------*/
159
160//
161// Information about a property to replicate.
162//
171
172/*-----------------------------------------------------------------------------
173 UField.
174-----------------------------------------------------------------------------*/
175
176//
177// Base class of reflection data objects.
178//
179UCLASS(MinimalAPI, Abstract, Config = Engine)
181{
183public:
184
187
189 UPROPERTY(SkipSerialization)
191
192 // Constructors.
197
199
200#if UE_WITH_CONSTINIT_UOBJECT
201 consteval UField(
202 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
203 UE::CodeGen::ConstInit::FUFieldParams FieldParams
204 )
205 : Super(ObjectParams)
207 {
208 }
209#endif // UE_WITH_CONSTINIT_UOBJECT
210
211 ~UField() = default;
212
213 // UObject interface.
214 COREUOBJECT_API virtual void Serialize( FArchive& Ar ) override;
215 COREUOBJECT_API virtual void PostLoad() override;
216 COREUOBJECT_API virtual bool NeedsLoadForClient() const override;
217 COREUOBJECT_API virtual bool NeedsLoadForServer() const override;
218
219 // UField interface.
220 COREUOBJECT_API virtual void AddCppProperty(FProperty* Property);
221 COREUOBJECT_API virtual void Bind();
222
224 COREUOBJECT_API UClass* GetOwnerClass() const;
225
227 COREUOBJECT_API UStruct* GetOwnerStruct() const;
228
234 COREUOBJECT_API FString GetAuthoredName() const;
235
236#if WITH_EDITORONLY_DATA
242 COREUOBJECT_API FText GetDisplayNameText() const;
243
251 COREUOBJECT_API FText GetToolTipText(bool bShortTooltip = false) const;
252
260#endif // WITH_EDITORONLY_DATA
261
262#if WITH_METADATA
269 bool HasMetaData(const TCHAR* Key) const { return FindMetaData(Key) != nullptr; }
270 bool HasMetaData(const FName& Key) const { return FindMetaData(Key) != nullptr; }
271
278 COREUOBJECT_API const FString* FindMetaData(const TCHAR* Key) const;
279 COREUOBJECT_API const FString* FindMetaData(const FName& Key) const;
280
287 COREUOBJECT_API const FString& GetMetaData(const TCHAR* Key) const;
288 COREUOBJECT_API const FString& GetMetaData(const FName& Key) const;
289
300
307 COREUOBJECT_API void SetMetaData(const TCHAR* Key, const TCHAR* InValue);
308 COREUOBJECT_API void SetMetaData(const FName& Key, const TCHAR* InValue);
309
316 bool GetBoolMetaData(const TCHAR* Key) const
317 {
318 const FString& BoolString = GetMetaData(Key);
319 // FString == operator does case insensitive comparison
320 return (BoolString == "true");
321 }
322 bool GetBoolMetaData(const FName& Key) const
323 {
324 const FString& BoolString = GetMetaData(Key);
325 // FString == operator does case insensitive comparison
326 return (BoolString == "true");
327 }
328
335 int32 GetIntMetaData(const TCHAR* Key) const
336 {
337 const FString& IntString = GetMetaData(Key);
339 return Value;
340 }
341 int32 GetIntMetaData(const FName& Key) const
342 {
343 const FString& IntString = GetMetaData(Key);
345 return Value;
346 }
347
354 float GetFloatMetaData(const TCHAR* Key) const
355 {
356 const FString& FloatString = GetMetaData(Key);
358 return Value;
359 }
360 float GetFloatMetaData(const FName& Key) const
361 {
362 const FString& FloatString = GetMetaData(Key);
364 return Value;
365 }
366
373 COREUOBJECT_API UClass* GetClassMetaData(const TCHAR* Key) const;
374 COREUOBJECT_API UClass* GetClassMetaData(const FName& Key) const;
375
377 COREUOBJECT_API void RemoveMetaData(const TCHAR* Key);
378 COREUOBJECT_API void RemoveMetaData(const FName& Key);
379#endif // WITH_METADATA
380
381 COREUOBJECT_API bool HasAnyCastFlags(const uint64 InCastFlags) const;
382 COREUOBJECT_API bool HasAllCastFlags(const uint64 InCastFlags) const;
383
384#if WITH_EDITORONLY_DATA
393#endif // WITH_EDITORONLY_DATA
394
396};
397
398#if WITH_EDITORONLY_DATA
402enum class EPropertyValueFlags : uint8
403{
408};
409#endif // WITH_EDITORONLY_DATA
410
412{
413#if USTRUCT_FAST_ISCHILDOF_IMPL == USTRUCT_ISCHILDOF_STRUCTARRAY
414protected:
415 FStructBaseChain() = default;
416public:
419
420#if UE_WITH_CONSTINIT_UOBJECT
422 : StructBaseChainArray(InBases.GetData())
423 , NumStructBasesInChainMinusOne(InBases.Num()-1)
424 {
425 }
426#endif // UE_WITH_CONSTINIT_UOBJECT
427
429
431 {
432 int32 NumParentStructBasesInChainMinusOne = Parent.NumStructBasesInChainMinusOne;
433 return NumParentStructBasesInChainMinusOne <= NumStructBasesInChainMinusOne && StructBaseChainArray[NumParentStructBasesInChainMinusOne] == &Parent;
434 }
435
436private:
437 const FStructBaseChain** StructBaseChainArray = nullptr;
438 int32 NumStructBasesInChainMinusOne = -1;
439
440 friend class UStruct;
441#endif // USTRUCT_FAST_ISCHILDOF_IMPL == USTRUCT_ISCHILDOF_STRUCTARRAY
442};
443
444namespace UE::Private
445{
446consteval FStructBaseChain* AsStructBaseChain(UStruct* Struct);
447
448template<typename... Classes>
449struct TIntrinsicClassBaseChainImpl;
450}
451
452/*-----------------------------------------------------------------------------
453 UStruct.
454-----------------------------------------------------------------------------*/
455enum class EStructStateFlags : uint16;
456
459{
461 None = 0,
462
464 LinkPostConstruct = 1 << 0,
465
467 LinkDestructor = 1 << 1,
468};
470
471
474PLATFORM_EMPTY_BASES // FStructBaseChain may be empty
475UCLASS(MinimalAPI, Config = Engine)
477#if CPP // UHT objects to FStructBaseChain not being public because it assumes it might be a UInterface
478 , private FStructBaseChain
479#endif
480{
482
483 // Variables.
484protected:
485 // For construction of intrinsic class GC schema
486 friend struct Z_Construct_UClass_UStruct_Statics;
487 // For access to struct base chain from internal code
488 friend consteval FStructBaseChain* UE::Private::AsStructBaseChain(UStruct*);
489 // For access to struct base chain from possible non-internal intrinsic classes
490 template<typename... Classes>
491 friend struct UE::Private::TIntrinsicClassBaseChainImpl;
492private:
494 UPROPERTY(SkipSerialization)
495 TObjectPtr<UStruct> SuperStruct;
496
497public:
499 UPROPERTY(SkipSerialization)
501
503 FField* ChildProperties;
504
506 int32 PropertiesSize;
508 int16 MinAlignment;
509
510private:
512 std::atomic<uint16> StructStateFlags = 0;
513
514public:
515
516 union
517 {
520#if UE_WITH_CONSTINIT_UOBJECT && WITH_METADATA
526#endif // UE_WITH_CONSTINIT_UOBJECT && WITH_METADATA
527 };
528
537
539 UPROPERTY(SkipSerialization)
540 TArray<TObjectPtr<UObject>> ScriptAndPropertyObjectReferences;
541
544 FUnresolvedScriptPropertiesArray* UnresolvedScriptProperties;
545
546#if WITH_EDITORONLY_DATA
548 UPROPERTY(SkipSerialization)
552
555#endif // WITH_EDITORONLY_DATA
556
558 mutable std::atomic<const struct FUnversionedStructSchema*> UnversionedGameSchema = nullptr;
559#if WITH_EDITORONLY_DATA
561 mutable std::atomic<const struct FUnversionedStructSchema*> UnversionedEditorSchema = nullptr;
562
564 COREUOBJECT_API const FBlake3Hash& GetSchemaHash(bool bSkipEditorOnly) const;
565
566protected:
569#endif // WITH_EDITORONLY_DATA
570
571public:
574
575 // Constructors.
581 COREUOBJECT_API explicit UStruct(UStruct* InSuperStruct, SIZE_T ParamsSize = 0, SIZE_T Alignment = 0);
583 COREUOBJECT_API virtual ~UStruct();
584#if UE_WITH_CONSTINIT_UOBJECT
585 consteval UStruct(
586 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
587 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
588 UE::CodeGen::ConstInit::FStructParams StructParams
589 )
590 : Super(ObjectParams, FieldParams)
593#endif
594 , SuperStruct(StructParams.Super)
595 , Children(StructParams.FirstChild)
596 , ChildProperties(StructParams.ChildProperties)
597 , PropertiesSize(StructParams.PropertiesSize)
598 , MinAlignment(StructParams.MinAlignment)
601#else
603#endif
604 , PropertyLink(nullptr)
605 , RefLink(nullptr)
606 , DestructorLink(nullptr)
607 , PostConstructLink(nullptr)
608 , ScriptAndPropertyObjectReferences(ConstEval)
609 , UnresolvedScriptProperties(nullptr)
612#endif
616#endif
617 {
618 }
619#endif // UE_WITH_CONSTINIT_UOBJECT
620
621 // UObject interface.
622 COREUOBJECT_API virtual void Serialize(FArchive& Ar) override;
624 COREUOBJECT_API virtual void PostLoad() override;
625 COREUOBJECT_API virtual void FinishDestroy() override;
626#if !UE_WITH_CONSTINIT_UOBJECT
627 COREUOBJECT_API virtual void RegisterDependencies() override;
628#endif // !UE_WITH_CONSTINIT_UOBJECT
629 static COREUOBJECT_API void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector);
630 COREUOBJECT_API virtual void GetPreloadDependencies(TArray<UObject*>& OutDeps) override;
631 COREUOBJECT_API virtual void TagSubobjects(EObjectFlags NewFlags) override;
632
633 // UField interface.
634 COREUOBJECT_API virtual void AddCppProperty(FProperty* Property) override;
635
639 COREUOBJECT_API FTopLevelAssetPath GetStructPathName() const;
640
642 COREUOBJECT_API FProperty* FindPropertyByName(FName InName) const;
643
645 UE_INTERNAL COREUOBJECT_API FProperty* FindPropertyByOffset(int32 Offset) const;
646
656 COREUOBJECT_API void InstanceSubobjectTemplates(TNotNull<void*> Data, const void* DefaultData, const UStruct* DefaultStruct, TNotNull<UObject*> Owner, FObjectInstancingGraph* InstanceGraph);
657
659 virtual UStruct* GetInheritanceSuper() const {return GetSuperStruct();}
660
662 COREUOBJECT_API void StaticLink(bool bRelinkExistingProperties = false);
663
666
678 virtual void SerializeBin(FArchive& Ar, void* Data) const final
679 {
680 SerializeBin(FStructuredArchiveFromArchive(Ar).GetSlot(), Data);
681 }
682
694 COREUOBJECT_API virtual void SerializeBin(FStructuredArchive::FSlot Slot, void* Data) const;
695
709 COREUOBJECT_API void SerializeBinEx( FStructuredArchive::FSlot Slot, void* Data, void const* DefaultData, UStruct* DefaultStruct ) const;
710
712 virtual void SerializeTaggedProperties(FArchive& Ar, uint8* Data, const UStruct* DefaultsStruct, const uint8* Defaults, const UObject* BreakRecursionIfFullyLoad = nullptr) const final
713 {
714 SerializeTaggedProperties(FStructuredArchiveFromArchive(Ar).GetSlot(), Data, DefaultsStruct, Defaults, BreakRecursionIfFullyLoad);
715 }
716
718 COREUOBJECT_API virtual void SerializeTaggedProperties(FStructuredArchive::FSlot Slot, uint8* Data, const UStruct* DefaultsStruct, const uint8* Defaults, const UObject* BreakRecursionIfFullyLoad = nullptr) const;
719
724 COREUOBJECT_API virtual void PreloadChildren(FArchive& Ar);
725
733 COREUOBJECT_API virtual void InitializeStruct(void* Dest, int32 ArrayDim = 1) const;
734
742 COREUOBJECT_API virtual void DestroyStruct(void* Dest, int32 ArrayDim = 1) const;
743
744#if DO_CHECK
746 bool DebugIsPropertyChainReady() const;
747#endif
748
750 virtual FProperty* CustomFindProperty(const FName InName) const { return nullptr; };
751
753 COREUOBJECT_API virtual EExprToken SerializeExpr(int32& iCode, FArchive& Ar);
754
760 virtual const TCHAR* GetPrefixCPP() const { return TEXT("F"); }
761
764 {
765 return PropertiesSize;
766 }
767
770 {
771 return MinAlignment;
772 }
773
776 {
777 return Align(PropertiesSize,MinAlignment);
778 }
779
781 void SetPropertiesSize( int32 NewSize )
782 {
783 PropertiesSize = NewSize;
784 }
785
787 template<class T>
788 bool IsChildOf() const
789 {
791 {
792 return IsChildOf(T::StaticClass());
793 }
794 else if constexpr (TModels_V<CStaticStructProvider, T>)
795 {
796 return IsChildOf(T::StaticStruct());
797 }
798 else
799 {
800 static_assert(sizeof(T) == 0, "Unsupported type - requires StaticClass or StaticStruct.");
801 return false;
802 }
803 }
804
806#if USTRUCT_FAST_ISCHILDOF_COMPARE_WITH_OUTERWALK || USTRUCT_FAST_ISCHILDOF_IMPL == USTRUCT_ISCHILDOF_OUTERWALK
807 COREUOBJECT_API bool IsChildOf( const UStruct* SomeBase ) const;
808#else
809 bool IsChildOf(const UStruct* SomeBase) const
810 {
811 return (SomeBase ? IsChildOfUsingStructArray(*SomeBase) : false);
812 }
813#endif
814
825
828 {
829 return SuperStruct;
830 }
831
836 COREUOBJECT_API virtual void SetSuperStruct(UStruct* NewSuperStruct);
837
839 COREUOBJECT_API virtual FString GetAuthoredNameForField(const UField* Field) const;
840
842 COREUOBJECT_API virtual FString GetAuthoredNameForField(const FField* Field) const;
843
845 virtual bool IsStructTrashed() const
846 {
847 return false;
848 }
849
851 COREUOBJECT_API void DestroyChildPropertiesAndResetPropertyLinks();
852
853#if WITH_METADATA
856
858 COREUOBJECT_API bool GetStringMetaDataHierarchical(const FName& Key, FString* OutValue = nullptr) const;
859
866 COREUOBJECT_API const UStruct* HasMetaDataHierarchical(const FName& Key) const;
867#endif // WITH_METADATA
868
869#if WITH_EDITORONLY_DATA
875 UE_INTERNAL COREUOBJECT_API virtual bool ActivateTrackingPropertyValueFlag(EPropertyValueFlags Flags, void* Data) const;
876
878 UE_INTERNAL COREUOBJECT_API virtual bool IsTrackingPropertyValueFlag(EPropertyValueFlags Flags, const void* Data) const;
879
881 UE_INTERNAL COREUOBJECT_API virtual bool HasPropertyValueFlag(EPropertyValueFlags Flags, const void* Data, const FProperty* Property, int32 ArrayIndex = 0) const;
882
884 UE_INTERNAL COREUOBJECT_API virtual void SetPropertyValueFlag(EPropertyValueFlags Flags, bool bValue, void* Data, const FProperty* Property, int32 ArrayIndex = 0) const;
885
887 UE_INTERNAL COREUOBJECT_API virtual void ResetPropertyValueFlags(EPropertyValueFlags Flags, void* Data) const;
888
890 UE_INTERNAL COREUOBJECT_API virtual void SerializePropertyValueFlags(EPropertyValueFlags Flags, void* Data, FStructuredArchiveRecord Record, FArchiveFieldName Name) const;
891
894
895 /* Returns true if this struct has Asset Registry searchable properties */
897 {
899 }
900#endif // WITH_EDITORONLY_DATA
901
904 {
905 if (!UnresolvedScriptProperties)
906 {
907 UnresolvedScriptProperties = new FUnresolvedScriptPropertiesArray();
908 }
909 *UnresolvedScriptProperties = MoveTemp(InUnresolvedProperties);
910 }
911
914 {
915 if (UnresolvedScriptProperties)
916 {
917 delete UnresolvedScriptProperties;
918 UnresolvedScriptProperties = nullptr;
919 }
920 }
921
926 COREUOBJECT_API void CollectBytecodeReferencedObjects(TArray<UObject*>& OutReferencedObjects);
931 COREUOBJECT_API void CollectPropertyReferencedObjects(TArray<UObject*>& OutReferencedObjects);
935 COREUOBJECT_API void CollectBytecodeAndPropertyReferencedObjects();
939 COREUOBJECT_API void CollectBytecodeAndPropertyReferencedObjectsRecursively();
940
941 UE_DEPRECATED(5.7, "Visit is deprecated, please use Visit with context instead.")
943
953
963
968 COREUOBJECT_API virtual void* ResolveVisitedPathInfo(void* Data, const FPropertyVisitorInfo& Info) const;
969
971
973 virtual FName FindPropertyNameFromGuid(const FGuid& PropertyGuid) const { return NAME_None; }
974
976 virtual FGuid FindPropertyGuidFromName(const FName InName) const { return FGuid(); }
977
979 virtual bool ArePropertyGuidsAvailable() const { return false; }
980
982 COREUOBJECT_API void SerializeProperties(FArchive& Ar);
983
984#if WITH_EDITORONLY_DATA
986#endif // WITH_EDITORONLY_DATA
987
989 COREUOBJECT_API void LoadTaggedPropertiesFromText(FStructuredArchive::FSlot Slot, uint8* Data, const UStruct* DefaultsStruct, const uint8* Defaults, const UObject* BreakRecursionIfFullyLoad) const;
990
991private:
992#if USTRUCT_FAST_ISCHILDOF_IMPL == USTRUCT_ISCHILDOF_STRUCTARRAY
993 // For UObjectBaseUtility
994 friend class UObjectBaseUtility;
997
998 friend class FStructBaseChain;
999 friend class FBlueprintCompileReinstancer;
1000#endif
1001
1003 bool HasAllStructStateFlags(EStructStateFlags TestStructStateFlags) const;
1004
1005 void SerializeVersionedTaggedProperties(FStructuredArchive::FSlot Slot, uint8* Data, const UStruct* DefaultsStruct, const uint8* Defaults, const UObject* BreakRecursionIfFullyLoad) const;
1006};
1007
1008#if UE_WITH_CONSTINIT_UOBJECT
1009// Private access to protected base class for UHT generated code
1010UE_INTERNAL inline consteval FStructBaseChain* UE::Private::AsStructBaseChain(UStruct* Struct)
1011{
1012 return Struct;
1013}
1014#endif // UE_WITH_CONSTINIT_UOBJECT
1015
1023{
1024 // State flags.
1025 STRUCT_NoFlags = 0x00000000,
1026 STRUCT_Native = 0x00000001,
1027
1030
1032
1033 STRUCT_NoExport = 0x00000008,
1034
1036 STRUCT_Atomic = 0x00000010,
1037
1039 STRUCT_Immutable = 0x00000020,
1040
1043
1045 STRUCT_RequiredAPI = 0x00000200,
1046
1049
1052
1054 STRUCT_CopyNative = 0x00001000,
1055
1058
1060 STRUCT_NoDestructor = 0x00004000,
1061
1064
1067
1070
1073
1076
1079
1082
1085
1087 STRUCT_Trashed = 0x00800000,
1088
1091
1094
1096 STRUCT_Visitor = 0x04000000,
1097
1100
1104
1105
1106
1107#if CHECK_PUREVIRTUALS
1108#define DISABLE_ABSTRACT_CONSTRUCT TStructOpsTypeTraits<CPPSTRUCT>::WithPureVirtual
1109#else
1110#define DISABLE_ABSTRACT_CONSTRUCT (false && TStructOpsTypeTraits<CPPSTRUCT>::WithPureVirtual)
1111#endif
1112
1113
1117 template<class CPPSTRUCT>
1119 {
1121 {
1122 ((CPPSTRUCT*)A)->AddStructReferencedObjects(Collector);
1123 }
1124 }
1125
1127{
1128 struct FScriptStructParams;
1129}
1130
1132{
1170
1171 template <typename CppStruct>
1173 {
1174 using TraitsType = TStructOpsTypeTraits<CppStruct>;
1175
1176 constexpr FCapabilities Capabilities {
1179 (std::is_trivially_destructible_v<CppStruct> ? CPF_NoDestructor : CPF_None) |
1182 .HasSerializerObjectReferences = TraitsType::WithSerializerObjectReferences,
1183 .HasNoopConstructor = TraitsType::WithNoInitConstructor,
1184 .HasZeroConstructor = TraitsType::WithZeroConstructor,
1185 .HasDestructor = !(TraitsType::WithNoDestructor || TIsPODType<CppStruct>::Value),
1186 .HasSerializer = TraitsType::WithSerializer,
1187 .HasStructuredSerializer = TraitsType::WithStructuredSerializer,
1188 .HasPostSerialize = TraitsType::WithPostSerialize,
1189 .HasNetSerializer = TraitsType::WithNetSerializer,
1190 .HasNetSharedSerialization = TraitsType::WithNetSharedSerialization,
1191 .HasNetDeltaSerializer = TraitsType::WithNetDeltaSerializer,
1192 .HasPostScriptConstruct = TraitsType::WithPostScriptConstruct,
1193 .IsPlainOldData = TIsPODType<CppStruct>::Value,
1194 .IsUECoreType = TIsUECoreType<CppStruct>::Value,
1195 .IsUECoreVariant = TIsUECoreVariant<CppStruct>::Value,
1196 .HasCopy = TraitsType::WithCopy,
1197 .HasIdentical = TraitsType::WithIdentical || TraitsType::WithIdenticalViaEquality,
1198 .HasExportTextItem = TraitsType::WithExportTextItem,
1199 .HasImportTextItem = TraitsType::WithImportTextItem,
1200 .HasAddStructReferencedObjects = TraitsType::WithAddStructReferencedObjects,
1201 .HasSerializeFromMismatchedTag = TraitsType::WithSerializeFromMismatchedTag,
1202 .HasStructuredSerializeFromMismatchedTag = TraitsType::WithStructuredSerializeFromMismatchedTag,
1204 .HasIntrusiveUnsetOptionalState = ::HasIntrusiveUnsetOptionalState<CppStruct>(),
1205 .IsAbstract = TIsAbstract<CppStruct>::Value,
1206 .HasFindInnerPropertyInstance = TraitsType::WithFindInnerPropertyInstance,
1207 .ClearOnFinishDestroy = TraitsType::WithClearOnFinishDestroy,
1208#if WITH_EDITOR
1209 .HasCanEditChange = TraitsType::WithCanEditChange,
1210#endif
1211 .HasVisitor = TraitsType::WithVisitor,
1212 .HasGetPreloadDependencies = TraitsType::WithGetPreloadDependencies,
1213 .IsIntrusiveOptionalSafeForGC = TraitsType::WithIntrusiveOptionalSafeForGC,
1214 };
1215 return Capabilities;
1216 }
1217
1218 template <typename CppStruct>
1220 void Construct(void* Dest)
1221 {
1222 using TraitsType = TStructOpsTypeTraits<CppStruct>;
1223
1224#if CHECK_PUREVIRTUALS
1225 if constexpr (!TraitsType::WithPureVirtual)
1226#endif
1227 {
1228 if constexpr (TraitsType::WithNoInitConstructor)
1229 {
1230 ::new (Dest) CppStruct(ForceInit);
1231 }
1232 else
1233 {
1234 ::new (Dest) CppStruct();
1235 }
1236 }
1237 }
1238
1239#if !(UE_BUILD_TEST || UE_BUILD_SHIPPING)
1240 template <typename CppStruct>
1242 void ConstructForTests(void* Dest)
1243 {
1244 using TraitsType = TStructOpsTypeTraits<CppStruct>;
1245
1246#if CHECK_PUREVIRTUALS
1247 if constexpr (!TraitsType::WithPureVirtual)
1248#endif
1249 {
1250 if constexpr (TraitsType::WithNoInitConstructor)
1251 {
1252 ::new (Dest) CppStruct(ForceInit);
1253 }
1254 else
1255 {
1256 // NOTE: unlike regular "Construct", no value init here! (missing "()")
1257 ::new (Dest) CppStruct;
1258 }
1259 }
1260 }
1261#endif
1262
1263 template <typename CppStruct>
1265 void Destruct(void* Dest)
1266 {
1267 DestructItem((CppStruct*)Dest);
1268 }
1269
1270 template <typename CppStruct>
1272 bool SerializeArchive(FArchive& Ar, void* Data, UStruct* DefaultsStruct, const void* Defaults)
1273 {
1275 {
1276 return ((CppStruct*)Data)->Serialize(Ar, DefaultsStruct, Defaults);
1277 }
1278 else
1279 {
1280 return ((CppStruct*)Data)->Serialize(Ar);
1281 }
1282 }
1283
1284 template <typename CppStruct>
1286 bool SerializeSlot(FStructuredArchive::FSlot Slot, void* Data, UStruct* DefaultsStruct, const void* Defaults)
1287 {
1289 {
1290 return ((CppStruct*)Data)->Serialize(Slot, DefaultsStruct, Defaults);
1291 }
1292 else
1293 {
1294 return ((CppStruct*)Data)->Serialize(Slot);
1295 }
1296 }
1297
1298 template <typename CppStruct>
1300 void PostSerialize(const FArchive& Ar, void *Data)
1301 {
1302 ((CppStruct*)Data)->PostSerialize(Ar);
1303 }
1304
1305 template <typename CppStruct>
1307 bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess, void* Data)
1308 {
1309 return ((CppStruct*)Data)->NetSerialize(Ar, Map, bOutSuccess);
1310 }
1311
1312 template <typename CppStruct>
1315 {
1316 return ((CppStruct*)Data)->NetDeltaSerialize(DeltaParms);
1317 }
1318
1319 template <typename CppStruct>
1321 void PostScriptConstruct(void* Data)
1322 {
1323 ((CppStruct*)Data)->PostScriptConstruct();
1324 }
1325
1326 template <typename CppStruct>
1329 {
1330 ((CppStruct*)Data)->GetPreloadDependencies(OutDeps);
1331 }
1332
1333 template <typename CppStruct>
1335 bool Copy(void* Dest, void const* Src, int32 ArrayDim)
1336 {
1337 static_assert((!TIsPODType<CppStruct>::Value), "You probably don't want custom copy for a POD type.");
1338
1339 CppStruct* TypedDest = (CppStruct*)Dest;
1340 const CppStruct* TypedSrc = (const CppStruct*)Src;
1341
1342 for (; ArrayDim; --ArrayDim)
1343 {
1344 *TypedDest++ = *TypedSrc++;
1345 }
1346 return true;
1347 }
1348
1349 // If you get an overload resolution error here, it's likely you've specified both WithIdentical and WithIdenticalViaEquality
1350 // in your TStructOpsTypeTraits, which is not supported.
1351 template <typename CppStruct>
1353 bool Identical(const void* A, const void* B, uint32 PortFlags, bool& bOutResult)
1354 {
1355 bOutResult = ((const CppStruct*)A)->Identical((const CppStruct*)B, PortFlags);
1356 return true;
1357 }
1358 template <typename CppStruct>
1360 bool Identical(const void* A, const void* B, uint32 PortFlags, bool& bOutResult)
1361 {
1362 bOutResult = (*(const CppStruct*)A == *(const CppStruct*)B);
1363 return true;
1364 }
1365
1366 template <typename CppStruct>
1368 bool ExportTextItem(FString& ValueStr, const void* PropertyValue, const void* DefaultValue, UObject* Parent, int32 PortFlags, UObject* ExportRootScope)
1369 {
1370 if (DefaultValue)
1371 {
1372 return ((const CppStruct*)PropertyValue)->ExportTextItem(ValueStr, *(const CppStruct*)DefaultValue, Parent, PortFlags, ExportRootScope);
1373 }
1374 else
1375 {
1377 FMemory::Memzero(TmpDefaultValue.GetTypedPtr(), sizeof(CppStruct));
1378 if constexpr (!GetCapabilities<CppStruct>().HasZeroConstructor)
1379 {
1381 }
1382
1383 const bool bResult = ((const CppStruct*)PropertyValue)->ExportTextItem(ValueStr, *(const CppStruct*)TmpDefaultValue.GetTypedPtr(), Parent, PortFlags, ExportRootScope);
1384
1385 if constexpr (GetCapabilities<CppStruct>().HasDestructor)
1386 {
1387 Destruct<CppStruct>(TmpDefaultValue.GetTypedPtr());
1388 }
1389
1390 return bResult;
1391 }
1392 }
1393
1394 template <typename CppStruct>
1396 bool ImportTextItem(const TCHAR*& Buffer, void* Data, int32 PortFlags, UObject* OwnerObject, FOutputDevice* ErrorText)
1397 {
1398 return ((CppStruct*)Data)->ImportTextItem(Buffer, PortFlags, OwnerObject, ErrorText);
1399 }
1400
1401 template <typename CppStruct>
1403 bool FindInnerPropertyInstance(FName PropertyName, const void* Data, const FProperty*& OutProp, const void*& OutData)
1404 {
1405 return ((CppStruct*)Data)->FindInnerPropertyInstance(PropertyName, OutProp, OutData);
1406 }
1407
1408 template <typename CppStruct>
1411 {
1413 }
1414
1415 template <typename CppStruct>
1418 {
1419 if constexpr (TIsUECoreType<CppStruct>::Value)
1420 {
1421 // Custom version of SerializeFromMismatchedTag for core types, which don't have access to FPropertyTag.
1422 FName StructName;
1423 if (Tag.GetType().GetName() == NAME_StructProperty && Tag.GetType().GetParameterCount() >= 1)
1424 {
1425 StructName = Tag.GetType().GetParameterName(0);
1426 }
1427 return ((CppStruct*)Data)->SerializeFromMismatchedTag(StructName, Ar);
1428 }
1429 else
1430 {
1431 return ((CppStruct*)Data)->SerializeFromMismatchedTag(Tag, Ar);
1432 }
1433 }
1434
1435 template <typename CppStruct>
1438 {
1439 if constexpr (TIsUECoreType<CppStruct>::Value)
1440 {
1441 // Custom version of SerializeFromMismatchedTag for core types, which don't understand FPropertyTag.
1442 FName StructName;
1443 if (Tag.GetType().GetName() == NAME_StructProperty && Tag.GetType().GetParameterCount() >= 1)
1444 {
1445 StructName = Tag.GetType().GetParameterName(0);
1446 }
1447 return ((CppStruct*)Data)->SerializeFromMismatchedTag(StructName, Slot);
1448 }
1449 else
1450 {
1451 return ((CppStruct*)Data)->SerializeFromMismatchedTag(Tag, Slot);
1452 }
1453 }
1454
1455 template <typename CppStruct>
1457 uint32 GetStructTypeHash(const void* Src)
1458 {
1459 return GetTypeHashHelper(*(const CppStruct*)Src);
1460 }
1461
1462 template <typename CppStruct>
1465 {
1466 new (Data) TOptional<CppStruct>();
1467 }
1468
1469 template <typename CppStruct>
1471 bool IsIntrusiveOptionalValueSet(const void* Data)
1472 {
1473 return reinterpret_cast<const TOptional<CppStruct>*>(Data)->IsSet();
1474 }
1475
1476 template <typename CppStruct>
1479 {
1480 reinterpret_cast<TOptional<CppStruct>*>(Data)->Reset();
1481 }
1482
1483#if WITH_EDITOR
1484 template <typename CppStruct>
1486 bool CanEditChange(const FEditPropertyChain& PropertyChain, const void* Data)
1487 {
1488 return ((const CppStruct*)Data)->CanEditChange(PropertyChain);
1489 }
1490 #define UE_FOREACH_FAKE_VTABLE_FUNC_EDITOR_ONLY(...) __VA_ARGS__
1491#else
1492 #define UE_FOREACH_FAKE_VTABLE_FUNC_EDITOR_ONLY(...)
1493#endif // WITH_EDITOR
1494
1495#if !(UE_BUILD_TEST || UE_BUILD_SHIPPING)
1496 #define UE_FOREACH_FAKE_VTABLE_FUNC_WITH_TESTS_ONLY(...) __VA_ARGS__
1497#else
1498 #define UE_FOREACH_FAKE_VTABLE_FUNC_WITH_TESTS_ONLY(...)
1499#endif
1500
1501 template <typename CppStruct>
1508
1509 template <typename CppStruct>
1512 {
1513 return ((CppStruct*)Data)->ResolveVisitedPathInfo(Info);
1514 }
1515
1516 #define UE_FOREACH_FAKE_VTABLE_FUNC(IndexNameFunctype) \
1517 IndexNameFunctype(0, Construct, void(void* Address)) \
1518 UE_FOREACH_FAKE_VTABLE_FUNC_WITH_TESTS_ONLY( \
1519 IndexNameFunctype(1, ConstructForTests, void(void* Address)) \
1520 ) \
1521 IndexNameFunctype(2, Destruct, void(void* Address)) \
1522 IndexNameFunctype(3, SerializeArchive, bool(FArchive& Ar, void* Data, UStruct* DefaultsStruct, const void* Defaults)) \
1523 IndexNameFunctype(4, SerializeSlot, bool(FStructuredArchive::FSlot Slot, void* Data, UStruct* DefaultsStruct, const void* Defaults)) \
1524 IndexNameFunctype(5, PostSerialize, void(const FArchive& Ar, void* Data)) \
1525 IndexNameFunctype(6, NetSerialize, bool(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess, void* Data)) \
1526 IndexNameFunctype(7, NetDeltaSerialize, bool(FNetDeltaSerializeInfo& DeltaParms, void* Data)) \
1527 IndexNameFunctype(8, PostScriptConstruct, void(void* Data)) \
1528 IndexNameFunctype(9, GetPreloadDependencies, void(void* Data, TArray<UObject*>& OutDeps)) \
1529 IndexNameFunctype(10, Copy, bool(void* Dest, void const* Src, int32 ArrayDim)) \
1530 IndexNameFunctype(11, Identical, bool(const void* A, const void* B, uint32 PortFlags, bool& bOutResult)) \
1531 IndexNameFunctype(12, ExportTextItem, bool(FString& ValueStr, const void* PropertyValue, const void* DefaultValue, UObject* Parent, int32 PortFlags, UObject* ExportRootScope)) \
1532 IndexNameFunctype(13, ImportTextItem, bool(const TCHAR*& Buffer, void* Data, int32 PortFlags, UObject* OwnerObject, FOutputDevice* ErrorText)) \
1533 IndexNameFunctype(14, FindInnerPropertyInstance, bool(FName PropertyName, const void* Data, const FProperty*& OutProp, const void*& OutData)) \
1534 IndexNameFunctype(15, AddStructReferencedObjects, void(*())(void* A, FReferenceCollector& Collector)) \
1535 IndexNameFunctype(16, SerializeFromMismatchedTag, bool(FPropertyTag const& Tag, FArchive& Ar, void* Data)) \
1536 IndexNameFunctype(17, StructuredSerializeFromMismatchedTag, bool(FPropertyTag const& Tag, FStructuredArchive::FSlot Slot, void* Data)) \
1537 IndexNameFunctype(18, GetStructTypeHash, uint32(const void* Src)) \
1538 IndexNameFunctype(19, InitializeIntrusiveUnsetOptionalValue, void(void* Data)) \
1539 IndexNameFunctype(20, IsIntrusiveOptionalValueSet, bool(const void* Data)) \
1540 IndexNameFunctype(21, ClearIntrusiveOptionalValue, void(void* Data)) \
1541 UE_FOREACH_FAKE_VTABLE_FUNC_EDITOR_ONLY( \
1542 IndexNameFunctype(22, CanEditChange, bool(const FEditPropertyChain& PropertyChain, const void* Data)) \
1543 ) \
1544 IndexNameFunctype(23, Visit, EPropertyVisitorControlFlow(FPropertyVisitorContext& Context, const TFunctionRef<EPropertyVisitorControlFlow(const FPropertyVisitorContext& Context)> InFunc)) \
1545 IndexNameFunctype(24, ResolveVisitedPathInfo, void*(void* Data, const FPropertyVisitorInfo& Info))
1546
1547 // These represent one function per optional function in the fake vtable.
1549 {
1550 None = 0,
1551
1552 #define UE_VTABLE_ENUM(Index, Name, Functype) Name = 1u << Index,
1554 #undef UE_VTABLE_ENUM
1555 };
1557
1558 template <EStructOpsFakeVTableFlags Flag>
1560 template <typename CppStruct, EStructOpsFakeVTableFlags Flag>
1562
1563 #define UE_VTABLE_FUNC(Index, Name, Functype) \
1564 template <> \
1565 struct THandlingFunctionType<EStructOpsFakeVTableFlags::Name> \
1566 { \
1567 using Type = Functype; \
1568 }; \
1569 template <typename CppStruct> \
1570 struct THandlingFunctionPtr<CppStruct, EStructOpsFakeVTableFlags::Name> \
1571 { \
1572 inline static constexpr TIdentity_T<Functype>* Value = &Name<CppStruct>; \
1573 };
1575 #undef UE_VTABLE_FUNC
1576
1577 template <typename CppStruct>
1579 {
1580 using TraitsType = TStructOpsTypeTraits<CppStruct>;
1581
1583
1584 #define UE_VTABLE_SETFLAG(Index, Name, Functype) \
1585 if constexpr (requires(TIdentity_T<Functype>*& PtrRef) { PtrRef = &Name<CppStruct>; }) /* assignment to RefPtr shouldn't be needed, but is a workaround for MSVC bug: https://developercommunity.microsoft.com/t/Compiler-fails-overload-resolution-when/10939568 */ \
1586 { \
1587 Result |= EStructOpsFakeVTableFlags::Name; \
1588 }
1590 #undef UE_VTABLE_SETFLAG
1591
1592 return Result;
1593 }
1594
1596 {
1597 // These flags will indicate which functions are present in the HandlingFunctions array.
1599
1602
1603// MSVC doesn't like zero-sized arrays in the middle of structs
1604#ifndef _MSC_VER
1605 // One function pointer will exist in this array for every corresponding flag in Flags.
1606 // The function pointer types will be different, depending on the required signature, and
1607 // will need to be cast to the right type before being called.
1609#endif
1610
1611 // Retrieves a handling func associated with a particular flag.
1612 template <EStructOpsFakeVTableFlags FuncFlag>
1614 {
1615 // Ensure a single flag is passed
1616 static_assert(EnumNumSetFlags(FuncFlag) == 1);
1617
1618#ifdef _MSC_VER
1619 #pragma warning(push)
1620 #pragma warning(disable : 4191) // unsafe conversion from 'function pointer type A' to 'function pointer type B'
1621#endif
1622 return (typename THandlingFunctionType<FuncFlag>::Type*)this->GetHandlingFuncImpl(FuncFlag);
1623#ifdef _MSC_VER
1624 #pragma warning(pop)
1625#endif
1626 }
1627
1628 private:
1629 void (*GetHandlingFuncImpl(EStructOpsFakeVTableFlags FuncFlag) const)()
1630 {
1631 // Ensure that the fake vtable actually contains an entry for the requested function
1632 check(!!(this->Flags & FuncFlag));
1633
1634 // Mask off all higher flags
1635 uint32 StructFlagsInt = (uint32)this->Flags;
1637
1638 // The number of remaining flags will be the index of the function into the function table.
1639 // Hopefully this turns into a popcnt.
1640 uint32 Index = 0;
1641 while (StructFlagsInt != 0)
1642 {
1644 ++Index;
1645 }
1646
1647#ifdef _MSC_VER
1648 // Ensure that the end of the struct is where the start of the function pointer array in TStructOpsFakeVTable will be.
1649 static_assert(alignof(FStructOpsFakeVTable) == alignof(void(*)()));
1650 return ((void(**)())(this + 1))[Index];
1651#else
1652 return this->HandlingFunctions[Index];
1653#endif
1654 }
1655 };
1656
1657 template <auto... Funcs>
1659 {
1660 TTuple<decltype(Funcs)...> Functions;
1661 };
1662
1663 template <>
1665 {
1666 };
1667
1668 // This represents an array of function pointers to handling functions and a header describing the capabilities
1669 // of the struct. Only one pointer exists per handling function. The index of the handling function is the index
1670 // of the set bit in the capabilities.
1671 //
1672 // Example: a struct S containing HasDestructor and HasIdentical would be laid out like this in memory:
1673 // ComputedPropertyFlags
1674 // HasSerializerObjectReferences
1675 // ...: false
1676 // HasDestructor: true
1677 // ...: false
1678 // HasIdentical: true
1679 // ...: false
1680 // void(*HandlingFunctions[2]): { &Destruct<S>, &Identical<S> }
1681 //
1682 template <typename CppStruct, auto... Funcs>
1684 {
1685 {
1688 },
1689 MakeTuple(Funcs...)
1690 };
1691 template <typename CppStruct>
1699
1700 template <typename CppStruct, EStructOpsFakeVTableFlags Flags, auto... Funcs>
1701 struct TStructOpsFakeVTableForTypeImpl : TStructOpsFakeVTableForTypeImpl<CppStruct, EnumRemoveLowestSetFlag(Flags), Funcs..., THandlingFunctionPtr<CppStruct, EnumLowestSetFlag(Flags)>::Value>
1702 {
1703 };
1704
1705 template <typename CppStruct, auto... Funcs>
1710
1711 template <typename CppStruct>
1713}
1714
1718UCLASS(MinimalAPI, Config = Engine)
1720{
1722public:
1725 {
1727
1729
1735 : Size(InSize)
1736 , Alignment(InAlignment)
1737 {
1738 }
1739
1742 {
1743 return FakeVPtr->Capabilities;
1744 }
1745
1748 {
1749 return GetCapabilities().HasNoopConstructor;
1750 }
1751
1754 {
1755 return GetCapabilities().HasZeroConstructor;
1756 }
1757
1759 void Construct(void *Dest)
1760 {
1761 FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::Construct>()(Dest);
1762 }
1763
1764#if !(UE_BUILD_TEST || UE_BUILD_SHIPPING)
1766 void ConstructForTests(void* Dest)
1767 {
1768 FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::ConstructForTests>()(Dest);
1769 }
1770#endif
1771
1773 bool HasDestructor() const
1774 {
1775 return GetCapabilities().HasDestructor;
1776 }
1777
1779 void Destruct(void *Dest)
1780 {
1781 FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::Destruct>()(Dest);
1782 }
1783
1786 {
1787 return Size;
1788 }
1789
1792 {
1793 return Alignment;
1794 }
1795
1797 bool HasSerializer() const
1798 {
1799 return GetCapabilities().HasSerializer;
1800 }
1801
1804 {
1805 return GetCapabilities().HasStructuredSerializer;
1806 }
1807
1808 UE_DEPRECATED(5.6, "Use the overload of Serialize with defaults.")
1809 bool Serialize(FArchive& Ar, void* Data)
1810 {
1811 return Serialize(Ar, Data, nullptr, nullptr);
1812 }
1813
1814 UE_DEPRECATED(5.6, "Use the overload of Serialize with defaults.")
1815 bool Serialize(FStructuredArchive::FSlot Slot, void* Data)
1816 {
1817 return Serialize(Slot, Data, nullptr, nullptr);
1818 }
1819
1824 bool Serialize(FArchive& Ar, void* Data, UStruct* DefaultsStruct, const void* Defaults)
1825 {
1826 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::SerializeArchive>()(Ar, Data, DefaultsStruct, Defaults);
1827 }
1828 bool Serialize(FStructuredArchive::FSlot Slot, void* Data, UStruct* DefaultsStruct, const void* Defaults)
1829 {
1830 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::SerializeSlot>()(Slot, Data, DefaultsStruct, Defaults);
1831 }
1832
1834 bool HasPostSerialize() const
1835 {
1836 return GetCapabilities().HasPostSerialize;
1837 }
1838
1840 void PostSerialize(const FArchive& Ar, void *Data)
1841 {
1842 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::PostSerialize>()(Ar, Data);
1843 }
1844
1846 bool HasNetSerializer() const
1847 {
1848 return GetCapabilities().HasNetSerializer;
1849 }
1850
1853 {
1854 return GetCapabilities().HasNetSharedSerialization;
1855 }
1856
1861 bool NetSerialize(FArchive& Ar, UPackageMap* Map, bool& bOutSuccess, void *Data)
1862 {
1863 return HasNetSerializer() && FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::NetSerialize>()(Ar, Map, bOutSuccess, Data);
1864 }
1865
1868 {
1869 return GetCapabilities().HasNetDeltaSerializer;
1870 }
1871
1877 {
1878 return HasNetDeltaSerializer() && FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::NetDeltaSerialize>()(DeltaParms, Data);
1879 }
1880
1883 {
1884 return GetCapabilities().HasPostScriptConstruct;
1885 }
1886
1888 void PostScriptConstruct(void *Data)
1889 {
1890 FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::PostScriptConstruct>()(Data);
1891 }
1892
1895 {
1896 return GetCapabilities().HasGetPreloadDependencies;
1897 }
1898
1901 {
1902 if (HasGetPreloadDependencies())
1903 {
1904 FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::GetPreloadDependencies>()(Data, OutDeps);
1905 }
1906 }
1907
1909 bool IsPlainOldData() const
1910 {
1911 return GetCapabilities().IsPlainOldData;
1912 }
1913
1915 bool IsUECoreType() const
1916 {
1917 return GetCapabilities().IsUECoreType;
1918 }
1919
1921 bool IsUECoreVariant() const
1922 {
1923 return GetCapabilities().IsUECoreVariant;
1924 }
1925
1927 bool HasCopy() const
1928 {
1929 return GetCapabilities().HasCopy;
1930 }
1931
1936 bool Copy(void* Dest, void const* Src, int32 ArrayDim)
1937 {
1938 return HasCopy() && FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::Copy>()(Dest, Src, ArrayDim);
1939 }
1940
1942 bool HasIdentical() const
1943 {
1944 return GetCapabilities().HasIdentical;
1945 }
1946
1951 bool Identical(const void* A, const void* B, uint32 PortFlags, bool& bOutResult)
1952 {
1953 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::Identical>()(A, B, PortFlags, bOutResult);
1954 }
1955
1958 {
1959 return GetCapabilities().HasExportTextItem;
1960 }
1961
1966 bool ExportTextItem(FString& ValueStr, const void* PropertyValue, const void* DefaultValue, UObject* Parent, int32 PortFlags, UObject* ExportRootScope)
1967 {
1968 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::ExportTextItem>()(ValueStr, PropertyValue, DefaultValue, Parent, PortFlags, ExportRootScope);
1969 }
1970
1973 {
1974 return GetCapabilities().HasImportTextItem;
1975 }
1976
1981 bool ImportTextItem(const TCHAR*& Buffer, void* Data, int32 PortFlags, UObject* OwnerObject, FOutputDevice* ErrorText)
1982 {
1983 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::ImportTextItem>()(Buffer, Data, PortFlags, OwnerObject, ErrorText);
1984 }
1985
1987 {
1988 return GetCapabilities().HasFindInnerPropertyInstance;
1989 }
1990
1991 bool FindInnerPropertyInstance(FName PropertyName, const void* Data, const FProperty*& OutProp, const void*& OutData) const
1992 {
1993 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::FindInnerPropertyInstance>()(PropertyName, Data, OutProp, OutData);
1994 }
1995
1998 {
1999 return GetCapabilities().HasAddStructReferencedObjects;
2000 }
2001
2004 {
2005 return EnumHasAnyFlags(GetCapabilities().HasSerializerObjectReferences, Type);
2006 }
2007
2013 using TPointerToAddStructReferencedObjects UE_DEPRECATED(5.7, "TPointerToAddStructReferencedObjects has been deprecated, please use PointerToAddStructReferencedObjectsType instead.") = PointerToAddStructReferencedObjectsType;
2014
2016 {
2017 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::AddStructReferencedObjects>()();
2018 }
2019
2022 {
2023 return GetCapabilities().HasSerializeFromMismatchedTag;
2024 }
2025
2027 {
2028 return GetCapabilities().HasStructuredSerializeFromMismatchedTag;
2029 }
2030
2036 {
2037 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::SerializeFromMismatchedTag>()(Tag, Ar, Data);
2038 }
2039
2041 {
2042 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::StructuredSerializeFromMismatchedTag>()(Tag, Slot, Data);
2043 }
2044
2046 bool HasGetTypeHash() const
2047 {
2048 return GetCapabilities().HasGetTypeHash;
2049 }
2050
2052 uint32 GetStructTypeHash(const void* Src)
2053 {
2054 if (HasGetTypeHash())
2055 {
2056 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::GetStructTypeHash>()(Src);
2057 }
2058 else
2059 {
2060 return 0;
2061 }
2062 }
2063
2066 {
2067 return GetCapabilities().ComputedPropertyFlags;
2068 }
2069
2071 bool IsAbstract() const
2072 {
2073 return GetCapabilities().IsAbstract;
2074 }
2075
2078 {
2079 return GetCapabilities().ClearOnFinishDestroy;
2080 }
2081
2084 {
2085 return GetCapabilities().HasIntrusiveUnsetOptionalState;
2086 }
2087
2090 {
2091 FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::InitializeIntrusiveUnsetOptionalValue>()(Data);
2092 }
2093
2095 bool IsIntrusiveOptionalValueSet(const void* Data) const
2096 {
2097 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::IsIntrusiveOptionalValueSet>()(Data);
2098 }
2099
2101 void ClearIntrusiveOptionalValue(void* Data) const
2102 {
2103 FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::ClearIntrusiveOptionalValue>()(Data);
2104 }
2105
2111 {
2112 return GetCapabilities().IsIntrusiveOptionalSafeForGC;
2113 }
2114
2115#if WITH_EDITOR
2117 bool HasCanEditChange() const
2118 {
2119 return GetCapabilities().HasCanEditChange;
2120 }
2121
2123 bool CanEditChange(const FEditPropertyChain& PropertyChain, const void* Data) const
2124 {
2125 return HasCanEditChange() && FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::CanEditChange>()(PropertyChain, Data);
2126 }
2127#endif
2128
2130 bool HasVisitor() const
2131 {
2132 return GetCapabilities().HasVisitor;
2133 }
2134
2137 {
2138 if (HasVisitor())
2139 {
2140 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::Visit>()(Context, InFunc);
2141 }
2142 else
2143 {
2145 }
2146 }
2147
2148 void* ResolveVisitedPathInfo(void* Data, const FPropertyVisitorInfo& Info) const
2149 {
2150 if (HasVisitor())
2151 {
2152 return FakeVPtr->GetHandlingFunc<UE::CoreUObject::Private::EStructOpsFakeVTableFlags::ResolveVisitedPathInfo>()(Data, Info);
2153 }
2154 else
2155 {
2156 return nullptr;
2157 }
2158 }
2159
2160 private:
2162 const int32 Size;
2164 const int32 Alignment;
2165 };
2166
2168 template<class CPPSTRUCT>
2169 struct TCppStructOps final : public ICppStructOps
2170 {
2172 constexpr TCppStructOps()
2174 {
2175 static_assert(!(TTraits::WithAddStructReferencedObjects && alignof(CPPSTRUCT) < alignof(UObject*)), "AddStructReferencedObjects() requires pointer alignment");
2176
2178
2179 // We need some guarantees that TCppStructOps can be deleted via a ICppStructOps, until we fix up uses of TCppStructOps
2180 static_assert(sizeof(TCppStructOps) == sizeof(ICppStructOps));
2181 static_assert(std::is_trivially_destructible_v<TCppStructOps>);
2182 static_assert(!std::is_polymorphic_v<TCppStructOps>);
2183 }
2184
2185 static_assert(!(TTraits::WithSerializeFromMismatchedTag && TTraits::WithStructuredSerializeFromMismatchedTag), "Structs cannot have both WithSerializeFromMismatchedTag and WithStructuredSerializeFromMismatchedTag set");
2186 };
2187
2189 template<class CPPSTRUCT>
2191 {
2193 : Name(InName)
2194 {
2195 DeferCppStructOps(Name,new TCppStructOps<CPPSTRUCT>);
2196 }
2197
2199 {
2200 RemoveDeferredCppStructOps(Name);
2201 }
2203 };
2204 #define IMPLEMENT_STRUCT(BaseName) \
2205 UE_DEPRECATED_MACRO(5.1, "IMPLEMENT_STRUCT has been deprecated. Use UE_IMPLEMENT_STRUCT and provide struct package name as well as struct name") static UScriptStruct::TAutoCppStructOps<F##BaseName> BaseName##_Ops(FTopLevelAssetPath(TEXT("/Script/CoreUObject"), TEXT(#BaseName)));
2206
2207 #define UE_IMPLEMENT_STRUCT(PackageNameText, BaseName) \
2208 static UScriptStruct::TAutoCppStructOps<F##BaseName> BaseName##_Ops(FTopLevelAssetPath(TEXT(PackageNameText), TEXT(#BaseName)));
2209
2213
2214#if UE_WITH_CONSTINIT_UOBJECT
2215 consteval UScriptStruct(
2216 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
2217 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
2218 UE::CodeGen::ConstInit::FStructParams StructParams,
2219 UE::CodeGen::ConstInit::FScriptStructParams Params
2220 );
2221#endif
2222
2223public:
2225
2226protected:
2231
2237 COREUOBJECT_API FTopLevelAssetPath GetFlattenedStructPathName() const;
2238
2239public:
2240
2241 // UObject Interface
2242 virtual COREUOBJECT_API void Serialize(FArchive& Ar) override;
2244
2245 // UStruct interface.
2246 virtual COREUOBJECT_API void Link(FArchive& Ar, bool bRelinkExistingProperties) override;
2247 virtual COREUOBJECT_API void InitializeStruct(void* Dest, int32 ArrayDim = 1) const override;
2248 virtual COREUOBJECT_API void DestroyStruct(void* Dest, int32 ArrayDim = 1) const override;
2249 virtual COREUOBJECT_API bool IsStructTrashed() const override;
2250 // End of UStruct interface.
2251
2253 void COREUOBJECT_API SetStructTrashed(bool bIsTrash);
2254
2260 static COREUOBJECT_API void DeferCppStructOps(FTopLevelAssetPath Target, ICppStructOps* InCppStructOps);
2261
2266 static COREUOBJECT_API void RemoveDeferredCppStructOps(FTopLevelAssetPath Target);
2267
2273 static COREUOBJECT_API void RemoveAllDeferredCppStructOps(FName PackageName);
2274
2275 template<class CPPSTRUCT>
2277 {
2278 if constexpr (DISABLE_ABSTRACT_CONSTRUCT)
2279 {
2280 DeferCppStructOps(Target, nullptr);
2281 }
2282 else
2283 {
2284 DeferCppStructOps(Target, new UScriptStruct::TCppStructOps<CPPSTRUCT>);
2285 }
2286 }
2287
2289 virtual COREUOBJECT_API void PrepareCppStructOps();
2290
2293 {
2294 checkf(bPrepareCppStructOpsCompleted, TEXT("GetCppStructOps: PrepareCppStructOps() has not been called for class %s"), *GetPathName());
2295 return CppStructOps;
2296 }
2297
2300 {
2301 StructFlags = EStructFlags(StructFlags & ~STRUCT_ComputedFlags);
2302 bPrepareCppStructOpsCompleted = false;
2303 CppStructOps = nullptr;
2304 }
2305
2311 {
2312 return !!GetCppStructOps();
2313 }
2314
2320 {
2321 if( (StructFlags&STRUCT_Atomic) != 0)
2322 {
2323 return true;
2324 }
2325 else
2326 {
2327 return false;
2328 }
2329 }
2330
2333 {
2334 if ((StructFlags&(STRUCT_SerializeNative)) != 0)
2335 {
2336 return true;
2337 }
2338 else
2339 {
2340 return false;
2341 }
2342 }
2343
2345 COREUOBJECT_API bool UseBinarySerialization(const FArchive& Ar) const;
2346
2354 COREUOBJECT_API void SerializeItem(FArchive& Ar, void* Value, void const* Defaults);
2355 COREUOBJECT_API void SerializeItem(FStructuredArchive::FSlot Slot, void* Value, void const* Defaults);
2356
2368 COREUOBJECT_API void ExportText(FString& ValueStr, const void* Value, const void* Defaults, UObject* OwnerObject, int32 PortFlags, UObject* ExportRootScope, bool bAllowNativeOverride = true) const;
2369
2382 COREUOBJECT_API const TCHAR* ImportText(const TCHAR* Buffer, void* Value, UObject* OwnerObject, int32 PortFlags, FOutputDevice* ErrorText, const FString& StructName, bool bAllowNativeOverride = true) const;
2383
2396 COREUOBJECT_API const TCHAR* ImportText(const TCHAR* Buffer, void* Value, UObject* OwnerObject, int32 PortFlags, FOutputDevice* ErrorText, const TFunctionRef<FString()>& StructNameGetter, bool bAllowNativeOverride = true) const;
2397
2406 COREUOBJECT_API bool CompareScriptStruct(const void* A, const void* B, uint32 PortFlags) const;
2407
2416 COREUOBJECT_API void CopyScriptStruct(void* Dest, void const* Src, int32 ArrayDim = 1) const;
2417
2425 COREUOBJECT_API void ClearScriptStruct(void* Dest, int32 ArrayDim = 1) const;
2426
2433 virtual COREUOBJECT_API uint32 GetStructTypeHash(const void* Src) const;
2434
2436 virtual COREUOBJECT_API void RecursivelyPreload();
2437
2439 virtual COREUOBJECT_API FGuid GetCustomGuid() const;
2440
2442 virtual COREUOBJECT_API FString GetStructCPPName(uint32 CPPExportFlags = 0) const;
2443
2448 virtual COREUOBJECT_API void InitializeDefaultValue(uint8* InStructData) const;
2449
2459 virtual COREUOBJECT_API bool FindInnerPropertyInstance(FName PropertyName, const void* Data, const FProperty*& OutProp, const void*& OutData) const;
2460
2461 /* Custom visit implementation for structs */
2462 using Super::Visit;
2464 virtual COREUOBJECT_API void* ResolveVisitedPathInfo(void* Data, const FPropertyVisitorInfo& Info) const override;
2465};
2466
2467/*-----------------------------------------------------------------------------
2468 UFunction.
2469-----------------------------------------------------------------------------*/
2470
2471//
2472// Reflection data for a replicated or Kismet callable function.
2473//
2474UCLASS(MinimalAPI, Within=Object, Config = Engine)
2476{
2478public:
2479 // Persistent variables.
2480
2483
2484 // Variables in memory only.
2485
2496
2499
2500#if UE_BLUEPRINT_EVENTGRAPH_FASTCALLS
2503
2505 int32 EventGraphCallOffset;
2506#endif
2507
2508#if WITH_LIVE_CODING
2511#endif
2512
2513private:
2515 FNativeFuncPtr Func;
2516
2517public:
2524 {
2525 return Func;
2526 }
2527
2537
2545 COREUOBJECT_API void Invoke(UObject* Obj, FFrame& Stack, RESULT_DECL);
2546
2547 // Constructors.
2554
2555#if UE_WITH_CONSTINIT_UOBJECT
2556 consteval UFunction(
2557 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
2558 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
2559 UE::CodeGen::ConstInit::FStructParams StructParams,
2560 UE::CodeGen::ConstInit::FFunctionParams Params)
2561 : Super(ObjectParams, FieldParams, StructParams)
2562 , FunctionFlags(Params.FunctionFlags)
2563 , NumParms(0)
2564 , ParmsSize(0)
2565 , ReturnValueOffset(0)
2566 , RPCId(Params.RPCId)
2567 , RPCResponseId(Params.RPCResponseId)
2568 , FirstPropertyToInit(nullptr)
2570 , EventGraphFunction(nullptr)
2571 , EventGraphCallOffset(INDEX_NONE)
2572#endif
2573 , Func(Params.NativeFunction)
2574 {
2575 }
2576#endif // UE_WITH_CONSTINIT_UOBJECT
2577
2579 COREUOBJECT_API void InitializeDerivedMembers();
2580
2581 // UObject interface.
2582 COREUOBJECT_API virtual void Serialize( FArchive& Ar ) override;
2583 COREUOBJECT_API virtual void PostLoad() override;
2584
2585 // UField interface.
2586 COREUOBJECT_API virtual void Bind() override;
2587
2588 // UStruct interface.
2589 virtual UStruct* GetInheritanceSuper() const override { return nullptr;}
2590 COREUOBJECT_API virtual void Link(FArchive& Ar, bool bRelinkExistingProperties) override;
2591
2593 UFunction* GetSuperFunction() const;
2594
2596 COREUOBJECT_API FProperty* GetReturnProperty() const;
2597
2600 {
2601 UObject* Outer = GetOuter();
2602 if (Outer && Outer->IsA<UClass>())
2603 {
2604 return reinterpret_cast<UClass*>(Outer);
2605 }
2606 return nullptr;
2607 }
2608
2611 {
2612 // declaration order mandates reinterpret_cast:
2613 return reinterpret_cast<UClass*>(GetOuter());
2614 }
2615
2625 {
2626 return (FunctionFlags&FlagsToCheck) != 0 || FlagsToCheck == FUNC_AllFlags;
2627 }
2628
2636 {
2637 return ((FunctionFlags & FlagsToCheck) == FlagsToCheck);
2638 }
2639
2644 {
2645 //@TODO: UCREMOVAL: CPF_ConstParm added as a hack to get blueprints compiling with a const DamageType parameter.
2649 return IgnoreFlags;
2650 }
2651
2661 COREUOBJECT_API bool IsSignatureCompatibleWith(const UFunction* OtherFunction) const;
2662
2673 COREUOBJECT_API bool IsSignatureCompatibleWith(const UFunction* OtherFunction, uint64 IgnoreFlags) const;
2674};
2675
2676//
2677// Function definition used by dynamic delegate declarations
2678//
2679UCLASS(MinimalAPI)
2681{
2683
2684public:
2686 : Super(ObjectInitializer)
2687 {
2688 }
2691
2692#if UE_WITH_CONSTINIT_UOBJECT
2693 consteval UDelegateFunction(
2694 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
2695 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
2696 UE::CodeGen::ConstInit::FStructParams StructParams,
2697 UE::CodeGen::ConstInit::FFunctionParams Params
2698 )
2699 : Super(ObjectParams, FieldParams, StructParams, Params)
2700 {
2701 }
2702#endif // UE_WITH_CONSTINIT_UOBJECT
2703};
2704
2705//
2706// Function definition used by sparse dynamic delegate declarations
2707//
2708UCLASS(MinimalAPI)
2710{
2712
2713public:
2720
2721#if UE_WITH_CONSTINIT_UOBJECT
2722 consteval USparseDelegateFunction(
2723 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
2724 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
2725 UE::CodeGen::ConstInit::FStructParams StructParams,
2726 UE::CodeGen::ConstInit::FFunctionParams FunctionParams,
2727 UE::CodeGen::ConstInit::FSparseDelegateParams Params
2728 )
2729 : Super(ObjectParams, FieldParams, StructParams, FunctionParams)
2732 {
2733 }
2734#endif // UE_WITH_CONSTINIT_UOBJECT
2735
2736 COREUOBJECT_API virtual void Serialize(FArchive& Ar) override;
2737
2738 // CONSTINIT_UOBJECT_TODO: Size increase
2739 union
2740 {
2741 FName OwningClassName = {};
2742#if UE_WITH_CONSTINIT_UOBJECT
2748#endif // UE_WITH_CONSTINIT_UOBJECT
2749 };
2750 union
2751 {
2752 FName DelegateName = {};
2753#if UE_WITH_CONSTINIT_UOBJECT
2759#endif // UE_WITH_CONSTINIT_UOBJECT
2760 };
2761};
2762
2763/*-----------------------------------------------------------------------------
2764 UEnum.
2765-----------------------------------------------------------------------------*/
2766
2768
2771{
2772 None = 0,
2773
2775 ErrorIfNotFound = 0x01,
2776
2778 CaseSensitive = 0x02,
2779
2781 CheckAuthoredName = 0x04,
2782};
2783
2785
2786//
2787// Reflection data for an enumeration.
2788//
2789UCLASS(MinimalAPI, Config = Engine)
2791{
2793
2794public:
2796
2798 enum class ECppForm : uint8
2799 {
2800 Regular,
2801 Namespaced,
2802 EnumClass
2803 };
2804
2805#if UE_WITH_CONSTINIT_UOBJECT
2806 consteval UEnum(
2807 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
2808 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
2809 UE::CodeGen::ConstInit::FEnumParams EnumParams
2810 )
2811 : Super(ObjectParams, FieldParams)
2814 , CppForm((ECppForm)EnumParams.CppForm)
2815 , EnumFlags(EnumParams.EnumFlags)
2816 , EnumDisplayNameFn(EnumParams.DisplayNameFn)
2817 {
2818 check(EnumParams.StaticNamesUTF8.Num() == EnumParams.EnumValues.Num());
2819 }
2820#endif // UE_WITH_CONSTINIT_UOBJECT
2821
2822 union
2823 {
2825 FString CppType = {};
2826#if UE_WITH_CONSTINIT_UOBJECT
2832#endif // UE_WITH_CONSTINIT_UOBJECT
2833 };
2834
2835#if WITH_METADATA && UE_WITH_CONSTINIT_UOBJECT
2836 // Nothing to alias with here to save space, but builds with metadata enabled are less space constrained
2838#endif // WITH_METADATA && UE_WITH_CONSTINIT_UOBJECT
2839
2840 // Index is the internal index into the Enum array, and is not useful outside of the Enum system
2841 // Value is the value set in the Enum Class in C++ or Blueprint
2842 // Enums can be sparse, which means that not every valid Index is a proper Value, and they are not necessarily equal
2843 // It is not safe to cast an Index to a Enum Class, always do that with a Value instead
2844
2847 {
2848 for (int32 i = 0; i < Names.Num(); ++i)
2849 {
2850 if (Names[i].Value == InValue)
2851 {
2852 return i;
2853 }
2854 }
2855 return INDEX_NONE;
2856 }
2857
2860 {
2861 check(Names.IsValidIndex(Index));
2862 return Names[Index].Value;
2863 }
2864
2866 COREUOBJECT_API FName GetNameByIndex(int32 Index) const;
2867
2869 COREUOBJECT_API int32 GetIndexByName(FName InName, EGetByNameFlags Flags = EGetByNameFlags::None) const;
2870
2872 COREUOBJECT_API FName GetNameByValue(int64 InValue) const;
2873
2875 COREUOBJECT_API int64 GetValueByName(FName InName, EGetByNameFlags Flags = EGetByNameFlags::None) const;
2876
2879
2881 COREUOBJECT_API FString GetNameStringByIndex(int32 InIndex) const;
2882
2884 COREUOBJECT_API int32 GetIndexByNameString(const FString& SearchString, EGetByNameFlags Flags = EGetByNameFlags::None) const;
2885
2887 COREUOBJECT_API FString GetNameStringByValue(int64 InValue) const;
2888
2890 COREUOBJECT_API FString GetValueOrBitfieldAsString(int64 InValue) const;
2891
2893 COREUOBJECT_API FString GetValueOrBitfieldAsAuthoredNameString(int64 InValue) const;
2894
2896 COREUOBJECT_API FText GetValueOrBitfieldAsDisplayNameText(int64 InValue) const;
2897
2899 COREUOBJECT_API bool FindNameStringByValue(FString& Out, int64 InValue) const;
2900
2902 COREUOBJECT_API int64 GetValueByNameString(const FString& SearchString, EGetByNameFlags Flags = EGetByNameFlags::None) const;
2903
2912 COREUOBJECT_API virtual FText GetDisplayNameTextByIndex(int32 InIndex) const;
2913
2915 COREUOBJECT_API FText GetDisplayNameTextByValue(int64 InValue) const;
2916
2918 COREUOBJECT_API bool FindDisplayNameTextByValue(FText& Out, int64 InValue) const;
2919
2929 COREUOBJECT_API virtual FString GetAuthoredNameStringByIndex(int32 InIndex) const;
2930
2932 COREUOBJECT_API FString GetAuthoredNameStringByValue(int64 InValue) const;
2933
2935 COREUOBJECT_API bool FindAuthoredNameStringByValue(FString& Out, int64 InValue) const;
2936
2938 COREUOBJECT_API int64 GetMaxEnumValue() const;
2939
2941 COREUOBJECT_API bool IsValidEnumValue(int64 InValue) const;
2942
2944 COREUOBJECT_API bool IsValidEnumValueOrBitfield(int64 InValue) const;
2945
2947 COREUOBJECT_API bool IsValidEnumName(FName InName) const;
2948
2950 UE_DEPRECATED(5.1, "RemoveNamesFromMasterList is deprecated, please use RemoveNamesFromPrimaryList instead.")
2951 void RemoveNamesFromMasterList()
2952 {
2953 RemoveNamesFromPrimaryList();
2954 }
2955
2957 COREUOBJECT_API void RemoveNamesFromPrimaryList();
2958
2960 COREUOBJECT_API virtual int64 ResolveEnumerator(FArchive& Ar, int64 EnumeratorIndex) const;
2961
2967
2974 {
2975 return CppForm;
2976 }
2977
2979 {
2980 EnumFlags |= FlagsToSet;
2981 }
2982
2984 {
2985 return EnumHasAnyFlags(EnumFlags, InFlags);
2986 }
2987
2994 static bool IsFullEnumName(const TCHAR* InEnumName)
2995 {
2996 return !!FCString::Strstr(InEnumName, TEXT("::"));
2997 }
2998
3005 COREUOBJECT_API virtual FString GenerateFullEnumName(const TCHAR* InEnumName) const;
3006
3015 COREUOBJECT_API static int64 LookupEnumName(FName PackageName, FName TestName, EFindFirstObjectOptions Options = EFindFirstObjectOptions::None, UEnum** OutFoundEnum = nullptr);
3016
3020 UE_DEPRECATED(5.1, "LookupEnumName that takes only enum name is deprecated. Please use the version of this function that also takes enum package name.")
3021 static int64 LookupEnumName(FName TestName, UEnum** FoundEnum = nullptr)
3022 {
3023 return LookupEnumName(FName(), TestName, EFindFirstObjectOptions::None, FoundEnum);
3024 }
3025
3034 COREUOBJECT_API static int64 LookupEnumNameSlow(FName PackageName, const TCHAR* InTestShortName, EFindFirstObjectOptions Options = EFindFirstObjectOptions::None, UEnum** OutFoundEnum = nullptr);
3035
3039 UE_DEPRECATED(5.1, "LookupEnumNameSlow that takes only enum name is deprecated. Please use the version of this function that also takes enum package name.")
3040 static int64 LookupEnumNameSlow(const TCHAR* InTestShortName, UEnum** FoundEnum = nullptr)
3041 {
3042 return LookupEnumNameSlow(FName(), InTestShortName, EFindFirstObjectOptions::None, FoundEnum);
3043 }
3044
3049 COREUOBJECT_API static int64 ParseEnum(const TCHAR*& Str);
3050
3056 COREUOBJECT_API bool ContainsExistingMax() const;
3057
3067
3068#if UE_WITH_CONSTINIT_UOBJECT
3075#endif // UE_WITH_CONSTINIT_UOBJECT
3076
3081 {
3082 return Names.Num();
3083 }
3084
3091 COREUOBJECT_API FString GenerateEnumPrefix() const;
3092
3100
3101#if WITH_EDITOR
3110#endif
3111
3112#if WITH_METADATA
3121 COREUOBJECT_API bool HasMetaData( const TCHAR* Key, int32 NameIndex=INDEX_NONE ) const;
3122
3132 COREUOBJECT_API FString GetMetaData( const TCHAR* Key, int32 NameIndex=INDEX_NONE, bool bAllowRemap=true ) const;
3133
3142 COREUOBJECT_API void SetMetaData( const TCHAR* Key, const TCHAR* InValue, int32 NameIndex=INDEX_NONE) const;
3143
3151 COREUOBJECT_API void RemoveMetaData( const TCHAR* Key, int32 NameIndex=INDEX_NONE ) const;
3152#endif // WITH_METADATA
3153
3160 template <typename T>
3161 inline static FString GetValueAsString( const TCHAR* EnumPath, const T EnumeratorValue)
3162 {
3163 // For the C++ enum.
3164 static_assert(TIsEnum<T>::Value, "Should only call this with enum types");
3165 return GetValueAsString_Internal(EnumPath, (int64)EnumeratorValue);
3166 }
3167
3168 template <typename T>
3170 {
3171 return GetValueAsString_Internal(EnumPath, (int64)EnumeratorValue.GetValue());
3172 }
3173
3174 template< class T >
3176 {
3177 out_StringValue = GetValueAsString( EnumPath, EnumeratorValue );
3178 }
3179
3180 template <typename T>
3181 inline static FString GetValueOrBitfieldAsString(const TCHAR* EnumPath, const T EnumeratorValue)
3182 {
3183 // For the C++ enum.
3184 static_assert(TIsEnum<T>::Value, "Should only call this with enum types");
3185 return GetValueOrBitfieldAsString_Internal(EnumPath, (int64)EnumeratorValue);
3186 }
3187
3188 template <typename T>
3190 {
3191 return GetValueOrBitfieldAsString_Internal(EnumPath, (int64)EnumeratorValue.GetValue());
3192 }
3193
3194 template< class T >
3196 {
3197 out_StringValue = GetValueOrBitfieldAsString( EnumPath, EnumeratorValue );
3198 }
3205 template <typename T>
3207 {
3208 // For the C++ enum.
3209 static_assert(TIsEnum<T>::Value, "Should only call this with enum types");
3210 return GetDisplayValueAsText_Internal(EnumPath, (int64)EnumeratorValue);
3211 }
3212
3213 template <typename T>
3215 {
3216 return GetDisplayValueAsText_Internal(EnumPath, (int64)EnumeratorValue.GetValue());
3217 }
3218
3219 template< class T >
3221 {
3222 out_TextValue = GetDisplayValueAsText( EnumPath, EnumeratorValue);
3223 }
3224
3230 template<typename EnumType>
3231 inline static FName GetValueAsName(const EnumType EnumeratorValue)
3232 {
3233 // For the C++ enum.
3234 static_assert(TIsEnum<EnumType>::Value, "Should only call this with enum types");
3235 UEnum* EnumClass = StaticEnum<EnumType>();
3236 check(EnumClass != nullptr);
3237 return EnumClass->GetNameByValue((int64)EnumeratorValue);
3238 }
3239
3240 template<typename EnumType>
3242 {
3243 return GetValueAsName(EnumeratorValue.GetValue());
3244 }
3245
3246 template<typename EnumType>
3248 {
3249 out_NameValue = GetValueAsName(EnumeratorValue);
3250 }
3251
3257 template<typename EnumType>
3258 inline static FString GetValueAsString(const EnumType EnumeratorValue)
3259 {
3260 // For the C++ enum.
3261 static_assert(TIsEnum<EnumType>::Value, "Should only call this with enum types");
3262 return GetValueAsName(EnumeratorValue).ToString();
3263 }
3264
3265 template<typename EnumType>
3267 {
3268 return GetValueAsString(EnumeratorValue.GetValue());
3269 }
3270
3271 template<typename EnumType>
3273 {
3274 out_StringValue = GetValueAsString(EnumeratorValue );
3275 }
3276
3282 template<
3283 typename EnumType
3285 >
3286 inline static FString GetValueOrBitfieldAsString(const EnumType EnumeratorValue)
3287 {
3288 // For the C++ enum.
3289 static_assert(TIsEnum<EnumType>::Value, "Should only call this with enum types");
3290 UEnum* EnumClass = StaticEnum<EnumType>();
3291 check(EnumClass != nullptr);
3293 }
3294
3295 // TEnumAsByte produces a warning if you use it with EnumClass, so this UE_REQUIRES keeps this overload
3296 // from being matched in that case
3297 template<
3298 typename EnumType
3300 >
3302 {
3303 return GetValueOrBitfieldAsString(EnumeratorValue.GetValue());
3304 }
3305
3306 template<
3307 typename EnumType,
3308 typename IntegralType
3309 UE_REQUIRES(TIsEnum<EnumType>::Value && std::is_integral_v<IntegralType>)
3310 >
3312 {
3313 // For the C++ enum.
3314 static_assert(TIsEnum<EnumType>::Value, "Should only call this with enum types");
3315 UEnum* EnumClass = StaticEnum<EnumType>();
3316 check(EnumClass != nullptr);
3318 }
3319
3320 template<typename EnumType>
3322 {
3323 out_StringValue = GetValueOrBitfieldAsString(EnumeratorValue);
3324 }
3325
3326 template<
3327 typename EnumType,
3328 typename IntegralType
3329 UE_REQUIRES(TIsEnum<EnumType>::Value && std::is_integral_v<IntegralType>)
3330 >
3335
3341 template<typename EnumType>
3342 inline static FText GetDisplayValueAsText(const EnumType EnumeratorValue )
3343 {
3344 // For the C++ enum.
3345 static_assert(TIsEnum<EnumType>::Value, "Should only call this with enum types");
3346 UEnum* EnumClass = StaticEnum<EnumType>();
3347 check(EnumClass != nullptr);
3349 }
3350
3351 template<typename EnumType>
3353 {
3354 return GetDisplayValueAsText(EnumeratorValue.GetValue());
3355 }
3356
3357 template<typename EnumType>
3359 {
3360 out_TextValue = GetDisplayValueAsText(EnumeratorValue);
3361 }
3362
3363 // UObject interface.
3364 COREUOBJECT_API virtual void Serialize(FArchive& Ar) override;
3365 COREUOBJECT_API virtual void BeginDestroy() override;
3366 // End of UObject interface.
3367
3369
3370 // Helper function for UHT - calculate max enum value when UHT was not able to parse all enum values
3371 consteval static inline int64 CalculateMaxEnumValue(std::initializer_list<int64> Values, EEnumFlags InFlags)
3372 {
3373 check(Values.size() != 0); // UHT should only generate a call to this when there are values
3375 {
3376 int64 CombinedFlags = 0;
3377 for (int64 Val : Values)
3378 {
3380 {
3381 CombinedFlags |= Val;
3382 }
3383 }
3384 return 1 + CombinedFlags;
3385 }
3386 return 1 + *Algo::MaxElement(Values);
3387 }
3388
3389protected:
3391 {
3392 // Tag bit to show wehther a pointer is dynamically allocated, or points to a static allocation
3393 static inline constexpr UPTRINT TagDynamic = 0x1;
3394 // Mask to retrieve a readable pointer from the tagged pointer regardless of whether it is static or dynamic
3395 static inline constexpr UPTRINT MaskPointer = ~0x1;
3396 union
3397 {
3398#if UE_WITH_CONSTINIT_UOBJECT
3399 // Immutable array of string constants from UHT. This union member is active until full compiled-in UObject construction in ProcessNewlyLoadedUObjects
3400 const UTF8CHAR* const* StaticNamesUTF8;
3401#endif // UE_WITH_CONSTINIT_UOBJECT
3402 // Tagged FName* pointer, noting whether array is dynamically allocated
3403 UPTRINT TaggedNames = 0;
3404 };
3405 union
3406 {
3407#if UE_WITH_CONSTINIT_UOBJECT
3408 // Immutable array of values from UHT. This union member may be active for the entire process lifetime.
3409 const int64* StaticValues;
3410#endif // UE_WITH_CONSTINIT_UOBJECT
3411 // Tagged int64* pointer noting whether array is dynamically allocated
3412 UPTRINT TaggedValues = 0;
3413 };
3414 // Both arrays contain same number of values
3415 int32 NumValues = 0;
3416
3417 void DeleteNames();
3418 void DeleteValues();
3419
3420 FName* AllocateNames(int32 InNum);
3421 int64* AllocateValues(int32 InNum);
3422
3423 public:
3426#if UE_WITH_CONSTINIT_UOBJECT
3427 consteval FNameData(int32 InNum, const UTF8CHAR* const* InStaticNamesUTF8, const int64* InValues)
3430 , NumValues(InNum)
3431 {
3432 }
3433#endif // UE_WITH_CONSTINIT_UOBJECT
3434 ~FNameData();
3435
3436 [[nodiscard]] inline int32 Num() const
3437 {
3438 return NumValues;
3439 }
3440
3441 [[nodiscard]] inline bool IsValidIndex(int32 Index) const
3442 {
3443 return Index >= 0 && Index < NumValues;
3444 }
3445
3447 {
3448 check(IsValidIndex(Index));
3449 return { GetNames()[Index], GetValues()[Index] };
3450 }
3451
3452#if UE_WITH_CONSTINIT_UOBJECT
3453 // Initialize from constinit data
3455#endif //UE_WITH_CONSTINIT_UOBJECT
3456 // Initialize from legacy serialization of names without values
3457 void Initialize(const TArray<FName>& InNames);
3458 // Initialize from legacy serialization of names with byte values
3460 // Initialize from names and int64 values
3462 // Initialize from names and int64 values with a placeholder to generate a max element
3463 COREUOBJECT_API void InitializeWithPlaceholder(const TArray<TPair<FName, int64>>& InNames, int64 MaxValue);
3464 // If necessary, replace values with sequential values counting up from zero
3465 COREUOBJECT_API void MakeValuesSequentialFromZero();
3466 // Deallocate arrays - ConstInit objects should not delete the values as they are a static array created by UHT.
3467 COREUOBJECT_API void Empty();
3468
3469 COREUOBJECT_API void UsePlaceholder(FName InName, int64 InValue);
3470 COREUOBJECT_API void DiscardPlaceholder();
3471
3472 // Get a mutable view over the names
3474 {
3475 checkfSlow(!!(TaggedNames & TagDynamic), TEXT("This function should only be used after compiled-in enums have copied their static string names into FNames"));
3476 return MakeArrayView(reinterpret_cast<FName*>(TaggedNames & MaskPointer), NumValues);
3477 }
3478
3479 // Get an immutable view over the names
3481 {
3482 checkfSlow(!!(TaggedNames & TagDynamic), TEXT("This function should only be used after compiled-in enums have copied their static string names into FNames"));
3483 return MakeConstArrayView(reinterpret_cast<const FName*>(TaggedNames & MaskPointer), NumValues);
3484 }
3485
3486 // Get an immutable view over the values
3488 {
3489 return MakeConstArrayView(reinterpret_cast<int64*>(TaggedValues & MaskPointer), NumValues);
3490 }
3491
3492 // Read-only ranged-for support.
3494 {
3495 };
3497 {
3499 {
3500 ++Index;
3501 }
3502
3504 {
3505 return Index >= Num;
3506 }
3507
3508#if !PLATFORM_COMPILER_HAS_GENERATED_COMPARISON_OPERATORS
3510 {
3511 return Index < Num;
3512 }
3513#endif
3514
3516 {
3517 return { Names[Index], Values[Index] };
3518 }
3519
3522 const FName* Names;
3524 };
3525
3526 inline FIterator begin() const
3527 {
3528 return FIterator{
3529 .Num = Num(),
3530 .Names = reinterpret_cast<FName*>(TaggedNames & MaskPointer),
3531 .Values = reinterpret_cast<int64*>(TaggedValues & MaskPointer)
3532 };
3533 }
3534 inline FIteratorEnd end() const
3535 {
3536 return FIteratorEnd();
3537 }
3539
3542
3545
3548
3551
3554
3557
3559 UE_DEPRECATED(5.1, "AddNamesToMasterList is deprecated, please use AddNamesToPrimaryList instead.")
3560 void AddNamesToMasterList()
3561 {
3562 AddNamesToPrimaryList();
3563 }
3564
3566 COREUOBJECT_API void AddNamesToPrimaryList();
3567
3569 COREUOBJECT_API static int64 GetMaxEnumValue(const TArray<TPair<FName, int64>>& InNames, EEnumFlags InFlags);
3570
3571private:
3572
3580 static UEnum* LookupAllEnumNamesWithOptions(FName PackageName, EFindFirstObjectOptions Options, TFunctionRef<bool(FName)> CompareNameFunction);
3581
3582 inline static FString GetValueAsString_Internal( const TCHAR* EnumPath, const int64 EnumeratorValue)
3583 {
3584 UEnum* EnumClass = FindObject<UEnum>( nullptr, EnumPath );
3585 UE_CLOG( !EnumClass, LogClass, Fatal, TEXT("Couldn't find enum '%s'"), EnumPath );
3586 return EnumClass->GetNameStringByValue(EnumeratorValue);
3587 }
3588
3589 inline static FString GetValueOrBitfieldAsString_Internal(const TCHAR* EnumPath, const int64 EnumeratorValue)
3590 {
3591 UEnum* EnumClass = FindObject<UEnum>(nullptr, EnumPath);
3592 UE_CLOG(!EnumClass, LogClass, Fatal, TEXT("Couldn't find enum '%s'"), EnumPath);
3594 }
3595
3596 inline static FText GetDisplayValueAsText_Internal( const TCHAR* EnumPath, const int64 EnumeratorValue )
3597 {
3598 UEnum* EnumClass = FindObject<UEnum>(nullptr, EnumPath);
3599 UE_CLOG(!EnumClass, LogClass, Fatal, TEXT("Couldn't find enum '%s'"), EnumPath);
3600 return EnumClass->GetDisplayNameTextByValue(EnumeratorValue);
3601 }
3602
3614 void RenameNamesAfterDuplication();
3615
3617 FString GetBaseEnumNameOnDuplication() const;
3618};
3619
3620/*-----------------------------------------------------------------------------
3621 UClass.
3622-----------------------------------------------------------------------------*/
3623
3626{
3627 enum
3628 {
3629 IsAbstract = false
3631};
3632
3633
3635template<class CPPCLASS>
3637{
3638 enum
3639 {
3642};
3643
3644
3647{
3649 virtual bool IsAbstract() const = 0;
3650};
3651
3652
3657
3658
3661{
3663 : Info(InInfo)
3664 {
3665 }
3666
3667 // Non-copyable
3670
3671 // ICppClassTypeInfo implementation
3672 virtual bool IsAbstract() const override
3673 {
3674 return Info->bIsAbstract;
3675 }
3676
3677private:
3678 const FCppClassTypeInfoStatic* Info;
3679};
3680
3681
3684{
3691
3693 : Class(nullptr)
3694 , PointerOffset(0)
3696 {}
3702
3703#if UE_WITH_CONSTINIT_UOBJECT
3704 explicit FImplementedInterface(UE::CodeGen::ConstInit::FClassImplementedInterface InCompiledIn);
3705#endif // UE_WITH_CONSTINIT_UOBJECT
3706
3708};
3709
3710
3713{
3716
3717#if UE_WITH_CONSTINIT_UOBJECT
3719 : Name(InCompiledIn.NameUTF8)
3721 {}
3722#endif // UE_WITH_CONSTINIT_UOBJECT
3723
3728};
3729
3730
3732{
3738}
3739
3741{
3742 UFunction* (*CreateFuncPtr)();
3743 const char* FuncNameUTF8;
3744};
3745
3746
3781
3782template<class T>
3784
3785template<class T>
3787
3791UCLASS(MinimalAPI, Within=Package, Config = Engine)
3793{
3795
3796public:
3797 friend class FRestoreClassInfo;
3798 friend class FBlueprintEditorUtils;
3799 friend class FBlueprintCompileReinstancer;
3800 friend struct FBlueprintCompilationManagerImpl;
3801
3802 typedef void (*ClassConstructorType) (const FObjectInitializer&);
3803 typedef UObject* (*ClassVTableHelperCtorCallerType) (FVTableHelper& Helper);
3804 typedef UClass* (*StaticClassFunctionType)();
3805
3806 ClassConstructorType ClassConstructor;
3807 ClassVTableHelperCtorCallerType ClassVTableHelperCtorCaller;
3809
3812
3814 int32 FirstOwnedClassRep = 0;
3815
3818
3821
3824
3827
3829 UPROPERTY(SkipSerialization)
3830 TObjectPtr<UClass> ClassWithin;
3831
3832#if WITH_EDITORONLY_DATA
3834 UPROPERTY(SkipSerialization)
3836
3839
3842#endif
3843
3844#if WITH_EDITOR
3850 virtual void FlushCompilationQueueForLevel() {}
3851#endif //WITH_EDITOR
3852
3853 union
3854 {
3856 FName ClassConfigName = {};
3857#if UE_WITH_CONSTINIT_UOBJECT
3858 // CONSTINIT_UOBJECT_TODO: Size increase
3864#endif // UE_WITH_CONSTINIT_UOBJECT
3865 };
3866
3869
3871 UPROPERTY(SkipSerialization)
3873
3874#if WITH_EDITOR
3875 // Editor only properties
3886#endif
3893 inline void CallAddReferencedObjects(UObject* This, FReferenceCollector& Collector) const
3894 {
3895 // The object must of this class type.
3896 check(This->IsA(this));
3897 // This should always be set to something, at the very least to UObject::ARO
3898 check(CppClassStaticFunctions.GetAddReferencedObjects() != nullptr);
3899 CppClassStaticFunctions.GetAddReferencedObjects()(This, Collector);
3900 }
3901
3902#if WITH_EDITORONLY_DATA
3904 void CallDeclareCustomVersions(FArchive& Ar) const
3905 {
3906 check(CppClassStaticFunctions.GetDeclareCustomVersions());
3907 CppClassStaticFunctions.GetDeclareCustomVersions()(Ar, this);
3908 }
3909
3912 {
3913 check(CppClassStaticFunctions.GetAppendToClassSchema());
3914 CppClassStaticFunctions.GetAppendToClassSchema()(Context);
3915 }
3916
3919 {
3920 check(CppClassStaticFunctions.GetDeclareConstructClasses());
3921 CppClassStaticFunctions.GetDeclareConstructClasses()(OutConstructClasses, this);
3922 }
3923#endif
3924
3926 UE_DEPRECATED(5.6, "ClassDefaultObject will be made private in the next release. For general purpose access to the CDO consider using the global GetDefault<>() or GetMutableDefault<>() functions.")
3927 UPROPERTY(SkipSerialization)
3929
3930protected:
3931#if UE_WITH_REMOTE_OBJECT_HANDLE
3933#endif
3934
3937
3940
3942 bool bNeedsDynamicSubobjectInstancing = false;
3943
3944public:
3949 COREUOBJECT_API const void* GetSparseClassData(const EGetSparseClassDataMethod GetMethod);
3950
3954 void* GetOrCreateSparseClassData() { return const_cast<void*>(GetSparseClassData(EGetSparseClassDataMethod::CreateIfNull)); }
3955
3959 COREUOBJECT_API UScriptStruct* GetSparseClassDataStruct() const;
3960
3961 COREUOBJECT_API void SetSparseClassDataStruct(UScriptStruct* InSparseClassDataStruct);
3962
3967 COREUOBJECT_API void ClearSparseClassDataStruct(bool bInRecomplingOnLoad);
3968
3970 static COREUOBJECT_API void AssembleReferenceTokenStreams();
3971
3972#if WITH_EDITOR
3974 {
3976 FuncMap.GenerateKeyArray(OutArray);
3977 }
3978#endif // WITH_EDITOR
3979
3980protected:
3981 COREUOBJECT_API void* CreateSparseClassData();
3982
3983 COREUOBJECT_API void CleanupSparseClassData();
3984
3985private:
3986#if WITH_EDITOR
3989#endif
3990
3993
3995 mutable FUClassFuncLock FuncMapLock;
3996
3998 mutable TMap<FName, UFunction*> AllFunctionsCache;
3999
4001 mutable FUClassFuncLock AllFunctionsCacheLock;
4002
4003public:
4004 union
4005 {
4011
4012#if UE_WITH_CONSTINIT_UOBJECT
4018#endif // UE_WITH_CONSTINIT_UOBJECT
4019 };
4020
4023
4024 union
4025 {
4027 TArray<FNativeFunctionLookup> NativeFunctionLookupTable = {};
4028
4029#if UE_WITH_CONSTINIT_UOBJECT
4035#endif // UE_WITH_CONSTINIT_UOBJECT
4036 };
4037
4038public:
4039 // Constructors
4043 const TCHAR* InClassConfigName, EObjectFlags InFlags, ClassConstructorType InClassConstructor,
4044 ClassVTableHelperCtorCallerType InClassVTableHelperCtorCaller,
4046#if UE_WITH_CONSTINIT_UOBJECT
4047 consteval UClass(
4048 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
4049 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
4050 UE::CodeGen::ConstInit::FStructParams StructParams,
4051 UE::CodeGen::ConstInit::FClassParams Params
4052 );
4053#endif
4054
4055 // Destructor
4057
4058#if WITH_RELOAD
4070 uint32 InSize,
4073 const TCHAR* InConfigName,
4074 ClassConstructorType InClassConstructor,
4075 ClassVTableHelperCtorCallerType InClassVTableHelperCtorCaller,
4079 );
4080
4081
4092#endif
4093
4099 COREUOBJECT_API virtual UClass* GetAuthoritativeClass();
4100 const UClass* GetAuthoritativeClass() const { return const_cast<UClass*>(this)->GetAuthoritativeClass(); }
4101
4107 COREUOBJECT_API void AddNativeFunction(const ANSICHAR* InName, FNativeFuncPtr InPointer);
4108
4115 COREUOBJECT_API void AddNativeFunction(const WIDECHAR* InName, FNativeFuncPtr InPointer);
4116
4119 {
4120 {
4122 FuncMap.Add(FuncName, Function);
4123 }
4124 {
4125 // Remove from the function cache if it exists
4126 FUClassFuncScopeWriteLock ScopeLock(AllFunctionsCacheLock);
4127 AllFunctionsCache.Remove(FuncName);
4128 }
4129 }
4130
4131#if UE_WITH_CONSTINIT_UOBJECT
4133 void InitFuncMap();
4134#else
4135 COREUOBJECT_API void CreateLinkAndAddChildFunctionsToMap(const FClassFunctionLinkInfo* Functions, uint32 NumFunctions);
4136#endif // UE_WITH_CONSTINIT_UOBJECT
4137
4140 {
4141 {
4143 FuncMap.Remove(Function->GetFName());
4144 }
4145 {
4146 // Remove from the function cache if it exists
4147 FUClassFuncScopeWriteLock ScopeLock(AllFunctionsCacheLock);
4148 AllFunctionsCache.Remove(Function->GetFName());
4149 }
4150 }
4151
4153 COREUOBJECT_API void ClearFunctionMapsCaches();
4154
4157
4158 // UObject interface.
4159 COREUOBJECT_API virtual void Serialize(FArchive& Ar) override;
4160 COREUOBJECT_API virtual void PostLoad() override;
4161 COREUOBJECT_API virtual void FinishDestroy() override;
4162 COREUOBJECT_API virtual void DeferredRegister(UClass* UClassStaticClass, const TCHAR* PackageName, const TCHAR* InName
4164 , FRemoteObjectId RemoteId
4165#endif // UE_WITH_REMOTE_OBJECT_HANDLE
4166 ) override;
4167 COREUOBJECT_API virtual bool Rename(const TCHAR* NewName = nullptr, UObject* NewOuter = nullptr, ERenameFlags Flags = REN_None) override;
4168 COREUOBJECT_API virtual void TagSubobjects(EObjectFlags NewFlags) override;
4169 COREUOBJECT_API virtual void PostInitProperties() override;
4170 static COREUOBJECT_API void AddReferencedObjects(UObject* InThis, FReferenceCollector& Collector);
4171 COREUOBJECT_API virtual FRestoreForUObjectOverwrite* GetRestoreForUObjectOverwrite() override;
4172 COREUOBJECT_API virtual FString GetDesc() override;
4173 COREUOBJECT_API virtual void GetAssetRegistryTags(FAssetRegistryTagsContext Context) const override;
4174 UE_DEPRECATED(5.4, "Implement the version that takes FAssetRegistryTagsContext instead.")
4175 COREUOBJECT_API virtual void GetAssetRegistryTags(TArray<FAssetRegistryTag>& OutTags) const override;
4176
4177#if WITH_EDITOR
4178protected:
4180public:
4181#endif // WITH_EDITOR
4182
4183 virtual bool IsAsset() const override { return false; }
4184 virtual bool IsNameStableForNetworking() const override { return true; } // For now, assume all classes have stable net names
4185 COREUOBJECT_API virtual void GetPreloadDependencies(TArray<UObject*>& OutDeps) override;
4186 // End of UObject interface.
4187
4188 // UField interface.
4189 COREUOBJECT_API virtual void Bind() override;
4190 COREUOBJECT_API virtual const TCHAR* GetPrefixCPP() const override;
4191 // End of UField interface.
4192
4193 // UStruct interface.
4194 COREUOBJECT_API virtual void Link(FArchive& Ar, bool bRelinkExistingProperties) override;
4195 COREUOBJECT_API virtual void SetSuperStruct(UStruct* NewSuperStruct) override;
4196 COREUOBJECT_API virtual bool IsStructTrashed() const override;
4198 // End of UStruct interface.
4199
4200#if WITH_EDITORONLY_DATA
4201 UE_INTERNAL COREUOBJECT_API virtual bool ActivateTrackingPropertyValueFlag(EPropertyValueFlags Flags, void* Data) const override;
4202 UE_INTERNAL COREUOBJECT_API virtual bool IsTrackingPropertyValueFlag(EPropertyValueFlags Flags, const void* Data) const override;
4203 UE_INTERNAL COREUOBJECT_API virtual bool HasPropertyValueFlag(EPropertyValueFlags Flags, const void* Data, const FProperty* Property, int32 ArrayIndex = 0) const override;
4204 UE_INTERNAL COREUOBJECT_API virtual void SetPropertyValueFlag(EPropertyValueFlags Flags, bool bValue, void* Data, const FProperty* Property, int32 ArrayIndex = 0) const override;
4205 UE_INTERNAL COREUOBJECT_API virtual void ResetPropertyValueFlags(EPropertyValueFlags Flags, void* Data) const override;
4206 UE_INTERNAL COREUOBJECT_API virtual void SerializePropertyValueFlags(EPropertyValueFlags Flags, void* Data, FStructuredArchiveRecord Record, FArchiveFieldName Name) const override;
4207#endif // WITH_EDITORONLY_DATA
4208
4213 {
4214 return GetStructPathName();
4215 }
4216
4226
4234 template <typename T>
4239
4250
4259 template <typename T>
4264
4275
4283 template <typename T>
4288
4300 static COREUOBJECT_API bool TryFixShortClassNameExportPath(FString& InOutExportPathToFix,
4302 const TCHAR* AmbiguousClassMessage = nullptr, bool bClearOnError = false);
4303
4308 static COREUOBJECT_API FString ConvertPathNameToShortTypeName(FStringView InClassPathOrShortTypeName);
4309
4316 static COREUOBJECT_API FString ConvertFullNameToShortTypeFullName(FStringView InFullName);
4317
4322 static COREUOBJECT_API bool IsShortTypeName(FStringView ClassPathOrShortTypeName);
4323
4324#if WITH_EDITOR
4326 const ICppClassTypeInfo* GetCppTypeInfo() const
4327 {
4328 return CppTypeInfo ? &CppTypeInfo.GetValue() : nullptr;
4329 }
4330#endif
4331
4334 {
4335#if WITH_EDITOR
4338#endif
4339 }
4340
4349 COREUOBJECT_API const FString GetConfigName() const;
4350
4353 {
4354 return (UClass*)GetSuperStruct();
4355 }
4356
4358 static COREUOBJECT_API class FFeedbackContext& GetDefaultPropertiesFeedbackContext();
4359
4362 {
4364 return ClassDefaultObject != nullptr ? GetPropertiesSize() : 0;
4366 }
4367
4374 {
4376 if (ClassDefaultObject == nullptr && bCreateIfNeeded)
4377 {
4378 InternalCreateDefaultObjectWrapper();
4379 }
4380
4381 return ClassDefaultObject;
4383 }
4384
4390#if UE_WITH_REMOTE_OBJECT_HANDLE
4391 const UObject* GetImmutableDefaultObject(bool bCreateIfNeeded = true) const
4392 {
4393 if (ImmutableDefaultObject == nullptr && bCreateIfNeeded)
4394 {
4396 }
4398 }
4399#endif
4400
4405 COREUOBJECT_API void SetDefaultObject(UObject* InClassDefaultObject);
4406
4418
4422 virtual void PostInitInstance(UObject* InObj, FObjectInstancingGraph* InstanceGraph) {}
4423
4427 virtual void PostLoadInstance(UObject* InObj) {}
4428
4436 virtual void InitPropertiesFromCustomList(uint8* DataPtr, const uint8* DefaultDataPtr) {}
4437
4442
4446 virtual bool CanCreateAssetOfClass() const
4447 {
4448 return true;
4449 }
4450
4455 COREUOBJECT_API FName GetDefaultObjectName() const;
4456
4459 {
4460 return nullptr;
4461 }
4462
4464 virtual void CreatePersistentUberGraphFrame(UObject* Obj, bool bCreateOnlyIfEmpty = false, bool bSkipSuperClass = false, UClass* OldClass = nullptr) const
4465 {
4466 }
4467
4469 virtual void DestroyPersistentUberGraphFrame(UObject* Obj, bool bSkipSuperClass = false) const
4470 {
4471 }
4472
4477 template<class T>
4479 {
4480 UObject *Ret = GetDefaultObject();
4481 check(Ret->IsA(T::StaticClass()));
4482 return (T*)Ret;
4483 }
4484
4486 COREUOBJECT_API UObject* GetDefaultSubobjectByName(FName ToFind);
4487
4490 {
4491 // this component must be a derived class of the base class
4492 check(NewSubobject->IsA(BaseClass));
4493 // the outer of the component must be of my class or some superclass of me
4494 check(IsChildOf(NewSubobject->GetOuter()->GetClass()));
4495 }
4496
4502 COREUOBJECT_API void GetDefaultObjectSubobjects(TArray<UObject*>& OutDefaultSubobjects);
4503
4513 {
4514 return EnumHasAnyFlags(ClassFlags, FlagsToCheck) != 0;
4515 }
4516
4524 {
4525 return EnumHasAllFlags(ClassFlags, FlagsToCheck);
4526 }
4527
4534 {
4535 return ClassFlags;
4536 }
4537
4547 {
4548 return (ClassCastFlags&FlagToCheck) != 0;
4549 }
4551 {
4552 return (ClassCastFlags&FlagsToCheck) == FlagsToCheck;
4553 }
4554
4555 COREUOBJECT_API FString GetDescription() const;
4556
4563 COREUOBJECT_API void AssembleReferenceTokenStream(bool bForce = false);
4564
4570 COREUOBJECT_API bool ImplementsInterface(const class UClass* SomeInterface) const;
4571
4576 COREUOBJECT_API virtual void SerializeDefaultObject(UObject* Object, FStructuredArchive::FSlot Slot);
4577
4583 {
4584 SerializeDefaultObject(Object, FStructuredArchiveFromArchive(Ar).GetSlot());
4585 }
4586
4590 COREUOBJECT_API void SerializeSparseClassData(FStructuredArchive::FSlot Slot);
4591
4595 COREUOBJECT_API virtual void PostLoadDefaultObject(UObject* Object);
4596
4603 COREUOBJECT_API virtual void PurgeClass(bool bRecompilingOnLoad);
4604
4612 static COREUOBJECT_API UClass* FindCommonBase(UClass* InClassA, UClass* InClassB);
4613
4620 static COREUOBJECT_API UClass* FindCommonBase(const TArray<UClass*>& InClasses);
4621
4628 COREUOBJECT_API virtual bool IsFunctionImplementedInScript(FName InFunctionName) const;
4629
4635 COREUOBJECT_API virtual bool HasProperty(const FProperty* InProperty) const;
4636
4638 virtual UObject* FindArchetype(const UClass* ArchetypeClass, const FName ArchetypeName) const { return nullptr; }
4639
4641 COREUOBJECT_API virtual UObject* GetArchetypeForCDO() const;
4642
4644 COREUOBJECT_API const void* GetArchetypeForSparseClassData(
4646
4648 COREUOBJECT_API UScriptStruct* GetSparseClassDataArchetypeStruct() const;
4649
4651 UE_DEPRECATED(5.5, "Replace with UE::Reflection::DoesSparseClassDataOverrideArchetype(Class, [](const FProperty*){return true;})")
4653
4659 virtual void GetDefaultObjectPreloadDependencies(TArray<UObject*>& OutDeps) {}
4660
4669 COREUOBJECT_API void SetUpRuntimeReplicationData();
4670
4674 static COREUOBJECT_API bool IsSafeToSerializeToStructuredArchives(UClass* InClass);
4675
4676#if WITH_EDITORONLY_DATA
4679#endif
4680
4681#if WITH_EDITOR
4687#endif
4688
4694 {
4695 return bNeedsDynamicSubobjectInstancing;
4696 }
4697
4698private:
4703 bool IsA(const UClass* Parent) const
4704 {
4705 return UObject::IsA(Parent);
4706 }
4707
4712 template <typename T>
4713 bool Implements() const
4714 {
4715 return UObject::Implements<T>();
4716 }
4717
4722 UFunction* FindFunction(FName InName) const
4723 {
4724 return UObject::FindFunction(InName);
4725 }
4726
4731 UFunction* FindFunctionChecked(FName InName) const
4732 {
4733 return UObject::FindFunctionChecked(InName);
4734 }
4735
4739 COREUOBJECT_API void AssembleReferenceTokenStreamInternal(bool bForce = false);
4740 COREUOBJECT_API void InternalCreateDefaultObjectWrapper() const;
4741#if UE_WITH_REMOTE_OBJECT_HANDLE
4743#endif
4744protected:
4749 COREUOBJECT_API virtual UObject* CreateDefaultObject();
4750
4751#if WITH_EDITOR
4756 virtual FTopLevelAssetPath GetReinstancedClassPathName_Impl() const { return nullptr; }
4757#endif
4758};
4759
4760#if UE_WITH_CONSTINIT_UOBJECT
4763consteval UClass::UClass(
4764 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
4765 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
4766 UE::CodeGen::ConstInit::FStructParams StructParams,
4767 UE::CodeGen::ConstInit::FClassParams Params
4768)
4769 // Initialization of class for UClass passes null because of constexpr evaluation order and TNoDestroy wrapper
4771 , ClassConstructor(Params.ClassConstructor)
4772 , ClassVTableHelperCtorCaller(Params.ClassVTableHelperCtorCaller)
4773 , CppClassStaticFunctions(Params.CppClassStaticFunctions)
4774 , ClassUnique(0)
4775 , bCooked(false)
4776 , bLayoutChanging(false)
4777 , ClassFlags(Params.ClassFlags | CLASS_Native)
4778 , ClassCastFlags(Params.ClassCastFlags)
4779 , ClassWithin(ConstEval, Params.ClassWithin ? Params.ClassWithin : &Z_ConstInit_UClass_UObject)
4782#endif
4783 , CompiledInClassConfigName(Params.ConfigName)
4784 , ClassReps(ConstEval)
4785 , NetFields(ConstEval)
4786 , SparseClassData(nullptr)
4787 , SparseClassDataStruct(Params.SparseClassDataStruct)
4790#endif
4791 , FuncMap(ConstEval)
4792 , FuncMapLock()
4793 , AllFunctionsCache(ConstEval)
4794 , AllFunctionsCacheLock()
4795 , CompiledInInterfaces(Params.Interfaces)
4797{
4798 if (StructParams.Super == nullptr)
4799 {
4800 checkf(Params.NativeFunctions.Num() == 0, TEXT("UObject must have no native functions because ScriptCore will try and override it"));
4801 }
4802}
4803
4804inline FImplementedInterface::FImplementedInterface(UE::CodeGen::ConstInit::FClassImplementedInterface InCompiledIn)
4806 , PointerOffset(InCompiledIn.PointerOffset)
4807 , bImplementedByK2(InCompiledIn.bImplementedByK2)
4808{
4809}
4810#endif // UE_WITH_CONSTINIT_UOBJECT
4811
4815template<class T>
4817{
4818 T::__DefaultConstructor(X);
4819}
4820
4821
4825template<class T>
4827{
4828 return T::__VTableCtorCaller(Helper);
4829}
4830
4832 class UClass* (*TClass_StaticClassFn)(),
4836 const TCHAR* PackageName,
4837 const TCHAR* Name
4838);
4839
4840UE_DEPRECATED(5.6, "Use the new method above and specify UClass::StaticClass as the first argument")
4845 const TCHAR* PackageName,
4846 const TCHAR* Name
4847 );
4848
4868 const TCHAR* PackageName,
4869 const TCHAR* Name,
4871 void(*RegisterNativeFunc)(),
4872 uint32 InSize,
4876 const TCHAR* InConfigName,
4877 UClass::ClassConstructorType InClassConstructor,
4878 UClass::ClassVTableHelperCtorCallerType InClassVTableHelperCtorCaller,
4880 UClass::StaticClassFunctionType InSuperClassFn,
4881 UClass::StaticClassFunctionType InWithinClassFn);
4882
4883#if UE_WITH_CONSTINIT_UOBJECT
4884namespace UE::CodeGen::ConstInit
4885{
4886 struct FScriptStructParams
4887 {
4888 EStructFlags StructFlags;
4890 };
4891}
4892
4894 UE::CodeGen::ConstInit::FObjectParams ObjectParams,
4895 UE::CodeGen::ConstInit::FUFieldParams FieldParams,
4896 UE::CodeGen::ConstInit::FStructParams StructParams,
4897 UE::CodeGen::ConstInit::FScriptStructParams Params
4898)
4899 : UStruct(ObjectParams, FieldParams, StructParams)
4900 , StructFlags(Params.StructFlags)
4901 , bPrepareCppStructOpsCompleted(false)
4902 , CppStructOps(Params.StructOps)
4903{
4904}
4905#endif // UE_WITH_CONSTINIT_UOBJECT
4906
4907/*-----------------------------------------------------------------------------
4908 FObjectInstancingGraph.
4909-----------------------------------------------------------------------------*/
4910
4912{
4913 None = 0x00,
4914
4915 // if set, then this property causes an instance to be created, otherwise this is just a pointer to a uobject that should be remapped if the object is instanced for some other property
4916 CausesInstancing = 0x01,
4917
4918 // if set, instance the reference to the subobjectroot, so far only delegates remap a self reference
4919 AllowSelfReference = 0x02,
4920
4921 // if set, then we do not create a new instance, but we will reassign one if there is already a mapping in the table
4923};
4924
4926
4928{
4929 None = 0x00,
4930
4931 // if set, start with component instancing disabled
4932 DisableInstancing = 0x01,
4933
4934 // if set, instance only subobject template values
4935 InstanceTemplatesOnly = 0x02,
4936};
4937
4939
4941{
4942public:
4943
4949
4955
4963
4968 {
4969 return GetDestinationRoot() != nullptr;
4970 }
4971
4976 {
4977 return DestinationRoot;
4978 }
4979
4986 COREUOBJECT_API void SetDestinationRoot( class UObject* DestinationSubobjectRoot, class UObject* InSourceRoot = nullptr );
4987
4993 COREUOBJECT_API class UObject* GetDestinationObject(class UObject* SourceObject);
4994
5009
5015 COREUOBJECT_API void AddNewObject(class UObject* ObjectInstance, class UObject* InArchetype = nullptr);
5016
5024 COREUOBJECT_API void AddNewInstance(class UObject* ObjectInstance, class UObject* InArchetype = nullptr);
5025
5032 COREUOBJECT_API void RetrieveObjectInstances( class UObject* SearchOuter, TArray<class UObject*>& out_Objects );
5033
5039 template <typename Predicate>
5041 {
5042 for (TMap<UObject*, UObject*>::TIterator It(SourceToDestinationMap); It; ++It)
5043 {
5044 UObject* InstancedObject = It.Value();
5046 }
5047 }
5048
5052 void EnableSubobjectInstancing( bool bEnabled )
5053 {
5054 if (bEnabled)
5055 {
5057 }
5058 else
5059 {
5061 }
5062 }
5063
5068 {
5069 return !(InstancingOptions & EObjectInstancingGraphOptions::DisableInstancing);
5070 }
5071
5075 void SetLoadingObject( bool bIsLoading )
5076 {
5077 bLoadingObject = bIsLoading;
5078 }
5079
5084 {
5085 SubobjectInstantiationExclusionList.Add(Property);
5086 }
5087
5092 {
5093 return SubobjectInstantiationExclusionList.Contains(Property);
5094 }
5095
5096private:
5103 bool IsCreatingArchetype( bool bUserGeneratedOnly=true ) const
5104 {
5105 // if we only want cases where we are creating an archetype in response to user input, return false if we are in fact just loading the object from disk
5106 return bCreatingArchetype && (!bUserGeneratedOnly || !bLoadingObject);
5107 }
5108
5112 bool IsLoadingObject() const
5113 {
5114 return bLoadingObject;
5115 }
5116
5134 COREUOBJECT_API class UObject* GetInstancedSubobject( class UObject* SourceSubobject, class UObject* CurrentValue, class UObject* CurrentObject, EInstancePropertyValueFlags Flags );
5135
5143 class UObject* SourceRoot = nullptr;
5144
5153 class UObject* DestinationRoot = nullptr;
5154
5157
5161 bool bCreatingArchetype = false;
5162
5166 bool bLoadingObject = false;
5167
5171 TMap<class UObject*,class UObject*> SourceToDestinationMap;
5172
5176 TMap<class UObject*, class UObject*> DestinationToSourceMap;
5177
5179 TSet<const FProperty*> SubobjectInstantiationExclusionList;
5180};
5181
5183
5185
5186// UFunction interface.
5187
5189{
5190 UStruct* Result = GetSuperStruct();
5191 checkSlow(!Result || Result->IsA<UFunction>());
5192 return (UFunction*)Result;
5193}
5194
5195
5196// UObject.h
5197
5201template<class T>
5202inline bool UObject::Implements() const
5203{
5204 UClass const* const MyClass = GetClass();
5205 return MyClass && MyClass->ImplementsInterface(T::StaticClass());
5206}
5207
5208// UObjectGlobals.h
5209
5222template< class T >
5223inline const T* GetDefault(const UClass* Class)
5224{
5225 check(Class->GetDefaultObject()->IsA(T::StaticClass()));
5226 return (const T*)Class->GetDefaultObject();
5227}
5228
5238template< class T >
5240{
5241 check(Class->GetDefaultObject()->IsA(T::StaticClass()));
5242 return (T*)Class->GetDefaultObject();
5243}
5244
5246{
5248
5250 COREUOBJECT_API static bool TheSameLayout(const UStruct* StructA, const UStruct* StructB, bool bCheckPropertiesNames = false);
5251
5253 COREUOBJECT_API static UStruct* FindStructureInPackageChecked(const TCHAR* StructName, const TCHAR* PackageName);
5254
5255#if !(UE_BUILD_TEST || UE_BUILD_SHIPPING)
5258
5259#if WITH_METADATA
5262#endif // WITH_METADATA
5263#endif // !(UE_BUILD_TEST || UE_BUILD_SHIPPING)
5264};
5265
5266/*-----------------------------------------------------------------------------
5267 Mirrors of mirror structures in Object.h. These are used by generated code
5268 to facilitate correct offsets and alignments for structures containing these
5269 odd types.
5270-----------------------------------------------------------------------------*/
5271
5272template <typename T, bool bHasStaticStruct = TModels_V<CStaticStructProvider, T>>
5274{
5276 {
5277 return T::StaticStruct();
5278 }
5279};
5280
5281template <typename T>
5283{
5284};
5285
5286template <typename T>
5288{
5289};
5290
5291template<> struct TBaseStructure<FIntPoint>
5292{
5294};
5295
5296template<> struct TBaseStructure<FIntVector>
5297{
5299};
5300
5302{
5304};
5305
5306template<> struct TBaseStructure<FIntVector4>
5307{
5309};
5310
5312{
5314};
5315
5316template<> struct TBaseStructure<FColor>
5317{
5319};
5320
5322{
5324};
5325
5326template<> struct TBaseStructure<FGuid>
5327{
5329};
5330
5332{
5334};
5335
5337{
5339};
5340
5342{
5344};
5345
5347{
5349};
5350
5352{
5354};
5355
5357{
5359};
5360
5362{
5364};
5365
5367{
5369};
5370
5372{
5374};
5375
5377{
5379};
5380
5382{
5384};
5385
5387{
5389};
5390
5392{
5394};
5395
5397{
5399};
5400
5401template<> struct TBaseStructure<FFloatRange>
5402{
5404};
5405
5407{
5409};
5410
5412{
5414};
5415
5417{
5419};
5420
5421template<> struct TBaseStructure<FInt32Range>
5422{
5424};
5425
5427{
5429};
5430
5432{
5434};
5435
5437{
5439};
5440
5441struct FFrameNumber;
5442
5444{
5446};
5447
5448struct FFrameTime;
5449
5450template<> struct TBaseStructure<FFrameTime>
5451{
5453};
5454
5455struct FFrameRate;
5456
5457template<> struct TBaseStructure<FFrameRate>
5458{
5460};
5461
5462struct FSoftObjectPath;
5463struct FSoftClassPath;
5464
5465struct FPrimaryAssetType;
5466struct FPrimaryAssetId;
5467
5468struct FDateTime;
5469
5470template<> struct TBaseStructure<FDateTime>
5471{
5473};
5474
5475struct FPolyglotTextData;
5476
5478{
5480};
5481
5482struct FAssetBundleData;
5483struct FTopLevelAssetPath;
5484
5486{
5488};
5489
5490template<>
5492{
5493 enum
5494 {
5497 };
5498};
5499
5500struct FRemoteObjectTables;
5502{
5504};
5505
5508{
5510};
5511
5514{
5516};
5517
5518struct FRemoteObjectBytes;
5520{
5522};
5523
5524struct FRemoteObjectData;
5526{
5528};
5529
5531{
5533};
5534
5535template<>
5537{
5538 enum
5539 {
5542 };
5543};
5544
5547{
5549};
5550
5551// TBaseStructure for explicit core variant types only. e.g. FVector3d returns "Vector3d" struct.
5552template< class T > struct TVariantStructure
5553{
5554 static_assert(sizeof(T) == 0, "Unsupported for this type. Did you mean to use TBaseStructure?");
5555};
5556
5557#define UE_DECLARE_CORE_VARIANT_TYPE(VARIANT, CORE) \
5558template<> struct TBaseStructure<::F##CORE> { COREUOBJECT_API static UScriptStruct* Get(); }; \
5559template<> struct TVariantStructure<::F##VARIANT##f> { COREUOBJECT_API static UScriptStruct* Get(); }; \
5560template<> struct TVariantStructure<::F##VARIANT##d> { COREUOBJECT_API static UScriptStruct* Get(); };
5561
5573
5574#undef UE_DECLARE_CORE_VARIANT_TYPE
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
constexpr auto MakeConstArrayView(OtherRangeType &&Other)
Definition ArrayView.h:904
#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 UE_BLUEPRINT_EVENTGRAPH_FASTCALLS
Definition Build.h:388
#define WITH_EDITOR
Definition Build.h:67
EStructStateFlags
Definition Class.cpp:106
EGetSparseClassDataMethod
Definition Class.h:3753
#define UE_FOREACH_FAKE_VTABLE_FUNC(IndexNameFunctype)
Definition Class.h:1516
EGetByNameFlags
Definition Class.h:2771
#define DISABLE_ABSTRACT_CONSTRUCT
Definition Class.h:1110
COREUOBJECT_API void InitializePrivateStaticClass(class UClass *(*TClass_StaticClassFn)(), class UClass *TClass_Super_StaticClass, class UClass *TClass_PrivateStaticClass, class UClass *TClass_WithinClass_StaticClass, const TCHAR *PackageName, const TCHAR *Name)
Definition Class.cpp:127
COREUOBJECT_API void GetPrivateStaticClassBody(const TCHAR *PackageName, const TCHAR *Name, UClass *&ReturnClass, void(*RegisterNativeFunc)(), uint32 InSize, uint32 InAlignment, EClassFlags InClassFlags, EClassCastFlags InClassCastFlags, const TCHAR *InConfigName, UClass::ClassConstructorType InClassConstructor, UClass::ClassVTableHelperCtorCallerType InClassVTableHelperCtorCaller, FUObjectCppClassStaticFunctions &&InCppClassStaticFunctions, UClass::StaticClassFunctionType InSuperClassFn, UClass::StaticClassFunctionType InWithinClassFn)
Definition Class.cpp:7459
UObject * InternalVTableHelperCtorCaller(FVTableHelper &Helper)
Definition Class.h:4826
FText(* FEnumDisplayNameFn)(int32)
Definition Class.h:2767
EStructPropertyLinkFlags
Definition Class.h:459
EStructFlags
Definition Class.h:1023
@ STRUCT_Native
Definition Class.h:1026
@ STRUCT_Atomic
Definition Class.h:1036
@ STRUCT_HasInstancedReference
Definition Class.h:1031
@ STRUCT_ComputedFlags
Definition Class.h:1102
@ STRUCT_Immutable
Definition Class.h:1039
@ STRUCT_CopyNative
Definition Class.h:1054
@ STRUCT_PostScriptConstruct
Definition Class.h:1081
@ STRUCT_PostSerializeNative
Definition Class.h:1072
@ STRUCT_NetDeltaSerializeNative
Definition Class.h:1078
@ STRUCT_CanEditChange
Definition Class.h:1093
@ STRUCT_RequiredAPI
Definition Class.h:1045
@ STRUCT_NoFlags
Definition Class.h:1025
@ STRUCT_NewerVersionExists
Definition Class.h:1090
@ STRUCT_NetSharedSerialization
Definition Class.h:1084
@ STRUCT_ImportTextItemNative
Definition Class.h:1069
@ STRUCT_IdenticalNative
Definition Class.h:1029
@ STRUCT_SerializeNative
Definition Class.h:1051
@ STRUCT_NoDestructor
Definition Class.h:1060
@ STRUCT_IsPlainOldData
Definition Class.h:1057
@ STRUCT_AddStructReferencedObjects
Definition Class.h:1042
@ STRUCT_ExportTextItemNative
Definition Class.h:1066
@ STRUCT_NoExport
Definition Class.h:1033
@ STRUCT_SerializeFromMismatchedTag
Definition Class.h:1075
@ STRUCT_Inherit
Definition Class.h:1099
@ STRUCT_ZeroConstructor
Definition Class.h:1063
@ STRUCT_Visitor
Definition Class.h:1096
@ STRUCT_NetSerializeNative
Definition Class.h:1048
@ STRUCT_Trashed
Definition Class.h:1087
FWriteScopeLock FUClassFuncScopeWriteLock
Definition Class.h:151
FReadScopeLock FUClassFuncScopeReadLock
Definition Class.h:150
#define UE_VTABLE_FUNC(Index, Name, Functype)
Definition Class.h:1563
EInstancePropertyValueFlags
Definition Class.h:4912
FRWLock FUClassFuncLock
Definition Class.h:152
void InternalConstructor(const FObjectInitializer &X)
Definition Class.h:4816
#define UE_VTABLE_SETFLAG(Index, Name, Functype)
void AddStructReferencedObjectsOrNot(void *A, FReferenceCollector &Collector)
Definition Class.h:1118
EObjectInstancingGraphOptions
Definition Class.h:4928
#define UE_DECLARE_CORE_VARIANT_TYPE(VARIANT, CORE)
Definition Class.h:5557
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_INTERNAL
Definition CoreMiscDefines.h:345
#define UE_WITH_REMOTE_OBJECT_HANDLE
Definition CoreMiscDefines.h:620
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
#define WITH_EDITORONLY_DATA
Definition CoreMiscDefines.h:24
@ ForceInit
Definition CoreMiscDefines.h:155
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define WITH_METADATA
Definition CoreMiscDefines.h:32
@ ConstEval
Definition CoreMiscDefines.h:161
void(* FNativeFuncPtr)(UObject *Context, FFrame &TheStack, RESULT_DECL)
Definition CoreNative.h:17
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::WIDECHAR WIDECHAR
A wide character. Normally a signed type.
Definition Platform.h:1133
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::UPTRINT UPTRINT
An unsigned integer the same size as a pointer.
Definition Platform.h:1146
FPlatformTypes::UTF8CHAR UTF8CHAR
An 8-bit character containing a UTF8 (Unicode, 8-bit, variable-width) code unit.
Definition Platform.h:1137
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
#define UE_REWRITE
Definition Platform.h:747
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
AUTORTFM_INFER UE_FORCEINLINE_HINT constexpr auto Invoke(FuncType &&Func, ArgTypes &&... Args) -> decltype(((FuncType &&) Func)((ArgTypes &&) Args...))
Definition Invoke.h:44
FORCEINLINE constexpr void DestructItem(ElementType *Element)
Definition MemoryOps.h:56
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:28
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
constexpr int EnumNumSetFlags(Enum Flags)
Definition EnumClassFlags.h:126
#define X(Name, Desc)
Definition FormatStringSan.h:47
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
#define UE_CLOG(Condition, CategoryName, Verbosity, Format,...)
Definition LogMacros.h:298
const T * GetDefault()
Definition UObjectGlobals.h:2155
@ Num
Definition MetalRHIPrivate.h:234
T TNotNull
Definition NotNull.h:307
const bool
Definition NetworkReplayStreaming.h:178
EClassCastFlags
Definition ObjectMacros.h:333
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
EPropertyFlags
Definition ObjectMacros.h:416
@ CPF_PersistentInstance
A object referenced by the property is duplicated like a component. (Each actor should have an own in...
Definition ObjectMacros.h:468
@ CPF_ExportObject
Object can be exported with actor.
Definition ObjectMacros.h:422
@ CPF_BlueprintVisible
This property can be read by blueprint code.
Definition ObjectMacros.h:421
@ CPF_BlueprintReadOnly
This property cannot be modified by blueprint code.
Definition ObjectMacros.h:423
@ CPF_ContainsInstancedReference
Property contains component references.
Definition ObjectMacros.h:458
@ CPF_ZeroConstructor
memset is fine for construction
Definition ObjectMacros.h:428
@ CPF_NoDestructor
No destructor.
Definition ObjectMacros.h:455
@ CPF_InstancedReference
Property is a component references.
Definition ObjectMacros.h:438
@ CPF_UObjectWrapper
Property was parsed as a wrapper class like TSubclassOf<T>, FScriptInterface etc.,...
Definition ObjectMacros.h:469
@ CPF_HasGetValueTypeHash
This property can generate a meaningful hash value.
Definition ObjectMacros.h:470
@ CPF_ConstParm
This is a constant function parameter.
Definition ObjectMacros.h:420
@ CPF_IsPlainOldData
If this is set, then the property can be memcopied instead of CopyCompleteValue / CopySingleValue.
Definition ObjectMacros.h:449
@ CPF_AdvancedDisplay
The property is advanced and not visible by default in the editor details view.
Definition ObjectMacros.h:461
@ CPF_TObjectPtr
Property is a TObjectPtr<T> instead of a USomething*. Need to differentiate between TObjectclassOf an...
Definition ObjectMacros.h:475
@ CPF_None
Definition ObjectMacros.h:417
uint32 ERenameFlags
Definition ObjectMacros.h:2302
EClassFlags
Definition ObjectMacros.h:199
@ CLASS_Native
Definition ObjectMacros.h:217
#define CPF_ComputedFlags
Definition ObjectMacros.h:502
EStaticConstructor
Definition ObjectMacros.h:174
#define REN_None
Definition ObjectMacros.h:2305
#define USTRUCT_ISCHILDOF_STRUCTARRAY
Definition ObjectMacros.h:37
#define CPF_NativeAccessSpecifiers
Definition ObjectMacros.h:483
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define USTRUCT_FAST_ISCHILDOF_IMPL
Definition ObjectMacros.h:45
EObjectFlags
Definition ObjectMacros.h:552
EEnumFlags
Definition ObjectMacros.h:690
#define UCLASS(...)
Definition ObjectMacros.h:776
EPropertyObjectReferenceType
Definition ObjectMacros.h:533
#define PLATFORM_EMPTY_BASES
Definition PlatformMisc.h:28
EPropertyVisitorControlFlow
Definition PropertyVisitor.h:15
#define UE_REQUIRES(...)
Definition Requires.h:86
#define RESULT_DECL
Definition Script.h:92
EFunctionFlags
Definition Script.h:132
@ FUNC_None
Definition Script.h:134
@ FUNC_AllFlags
Definition Script.h:169
EExprToken
Definition Script.h:190
auto GetData(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Get())
Definition StringConv.h:802
decltype(auto) Visit(Func &&Callable, Variants &&... Args)
Definition TVariant.h:271
constexpr TTuple< std::decay_t< Types >... > MakeTuple(Types &&... Args)
Definition Tuple.h:794
UE_FORCEINLINE_HINT uint32 GetTypeHashHelper(const T &V)
Definition TypeHash.h:215
T * GetMutableDefault()
Definition UObjectGlobals.h:2169
EFindFirstObjectOptions
Definition UObjectGlobals.h:496
float Val(const FString &Value)
Definition UnrealMath.cpp:3163
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
#define Expose_TNameOf(type)
Definition UnrealTypeTraits.h:199
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
if(Failed) console_printf("Failed.\n")
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Engine.Build.cs:7
Definition Archive.h:1208
Definition AssetRegistryTagsContext.h:98
Definition UnrealType.h:6738
Definition FeedbackContext.h:30
Definition Field.h:556
Definition InterpCurvePoint.h:51
Definition NameTypes.h:617
Definition UObjectGlobals.h:1292
static COREUOBJECT_API FObjectInitializer & Get()
Definition UObjectGlobals.cpp:5001
Definition OutputDevice.h:133
Definition UnrealType.h:174
Definition ScopeRWLock.h:93
Definition UObjectGlobals.h:2492
Definition Class.cpp:4975
Definition ObjectMacros.h:2402
Definition Class.h:412
UE_NONCOPYABLE(FStructBaseChain)
FStructBaseChain()=default
COREUOBJECT_API void ReinitializeBaseChainArray()
Definition Class.cpp:5800
COREUOBJECT_API ~FStructBaseChain()
Definition Class.cpp:5795
bool IsChildOfUsingStructArray(const FStructBaseChain &Parent) const
Definition Class.h:430
Definition UnrealType.h:6306
Definition StructuredArchiveAdapters.h:13
Definition StructuredArchiveSlots.h:144
Definition StructuredArchiveSlots.h:52
Definition StructuredArchive.h:57
Definition TextKey.h:75
Definition Text.h:385
Definition ObjectMacros.h:180
Definition ScopeRWLock.h:114
Definition ArrayView.h:139
Definition Array.h:670
Definition EnumAsByte.h:22
Definition AssetRegistryState.h:50
Definition UnrealString.h.inl:34
Definition Class.h:3793
UE_DEPRECATED(5.6, "ClassDefaultObject will be made private in the next release. For general purpose access to the CDO consider using the global GetDefault<>() or GetMutableDefault<>() functions.") TObjectPtr< UObject > ClassDefaultObject
T * GetDefaultObject() const
Definition Class.h:4478
virtual void SerializeDefaultObject(UObject *Object, FArchive &Ar) final
Definition Class.h:4582
TArray< FRepRecord > ClassReps
Definition Class.h:3868
virtual void PostLoadInstance(UObject *InObj)
Definition Class.h:4427
virtual void CreatePersistentUberGraphFrame(UObject *Obj, bool bCreateOnlyIfEmpty=false, bool bSkipSuperClass=false, UClass *OldClass=nullptr) const
Definition Class.h:4464
bool bLayoutChanging
Definition Class.h:3820
UObject * GetDefaultObject(bool bCreateIfNeeded=true) const
Definition Class.h:4373
ClassVTableHelperCtorCallerType ClassVTableHelperCtorCaller
Definition Class.h:3807
UE_FORCEINLINE_HINT EClassFlags GetClassFlags() const
Definition Class.h:4533
UE_FORCEINLINE_HINT bool HasAllCastFlags(EClassCastFlags FlagsToCheck) const
Definition Class.h:4550
COREUOBJECT_API UClass(const FObjectInitializer &ObjectInitializer=FObjectInitializer::Get())
Definition Class.cpp:6553
static T * TryFindTypeSlowSafe(FStringView InShortNameOrPathName, EFindFirstObjectOptions InOptions=EFindFirstObjectOptions::None)
Definition Class.h:4260
void RemoveFunctionFromFunctionMap(UFunction *Function)
Definition Class.h:4139
UE_FORCEINLINE_HINT FTopLevelAssetPath GetClassPathName() const
Definition Class.h:4212
virtual void DestroyPersistentUberGraphFrame(UObject *Obj, bool bSkipSuperClass=false) const
Definition Class.h:4469
UE_FORCEINLINE_HINT bool HasAnyCastFlag(EClassCastFlags FlagToCheck) const
Definition Class.h:4546
UE::GC::FSchemaOwner ReferenceSchema
Definition Class.h:4022
void * SparseClassData
Definition Class.h:3936
virtual bool IsAsset() const override
Definition Class.h:4183
void * GetOrCreateSparseClassData()
Definition Class.h:3954
void SetCppTypeInfoStatic(const FCppClassTypeInfoStatic *InCppTypeInfoStatic)
Definition Class.h:4333
virtual void SetupObjectInitializer(FObjectInitializer &ObjectInitializer) const
Definition Class.h:4441
static T * TryFindTypeSlow(FStringView InShortNameOrPathName, EFindFirstObjectOptions InOptions=EFindFirstObjectOptions::None)
Definition Class.h:4235
const UClass * GetAuthoritativeClass() const
Definition Class.h:4100
bool ShouldUseDynamicSubobjectInstancing() const
Definition Class.h:4693
virtual void InitPropertiesFromCustomList(uint8 *DataPtr, const uint8 *DefaultDataPtr)
Definition Class.h:4436
void AddFunctionToFunctionMap(UFunction *Function, FName FuncName)
Definition Class.h:4118
EClassFlags ClassFlags
Definition Class.h:3823
virtual bool IsNameStableForNetworking() const override
Definition Class.h:4184
UE_DEPRECATED(5.5, "Replace with UE::Reflection::DoesSparseClassDataOverrideArchetype(Class, [](const FProperty*){return true;})") COREUOBJECT_API bool OverridesSparseClassDataArchetype() const
TObjectPtr< UScriptStruct > SparseClassDataStruct
Definition Class.h:3939
virtual UObject * FindArchetype(const UClass *ArchetypeClass, const FName ArchetypeName) const
Definition Class.h:4638
virtual void PostInitInstance(UObject *InObj, FObjectInstancingGraph *InstanceGraph)
Definition Class.h:4422
bool bCooked
Definition Class.h:3817
UE_FORCEINLINE_HINT bool HasAllClassFlags(EClassFlags FlagsToCheck) const
Definition Class.h:4523
UClass * GetSuperClass() const
Definition Class.h:4352
static FTopLevelAssetPath TryConvertShortTypeNameToPathName(FStringView InShortTypeName, ELogVerbosity::Type AmbiguousMessageVerbosity=ELogVerbosity::NoLogging, const TCHAR *AmbiguousClassMessage=nullptr)
Definition Class.h:4284
void AddDefaultSubobject(UObject *NewSubobject, const UClass *BaseClass)
Definition Class.h:4489
int32 GetDefaultsCount()
Definition Class.h:4361
bool CheckDefaultObjectIsValidLowLevelFast(const int32 AlignmentCheck) const
Definition Class.h:4412
ClassConstructorType ClassConstructor
Definition Class.h:3806
virtual uint8 * GetPersistentUberGraphFrame(UObject *Obj, UFunction *FuncToCheck) const
Definition Class.h:4458
FUObjectCppClassStaticFunctions CppClassStaticFunctions
Definition Class.h:3808
virtual bool CanCreateAssetOfClass() const
Definition Class.h:4446
UE_FORCEINLINE_HINT bool HasAnyClassFlags(EClassFlags FlagsToCheck) const
Definition Class.h:4512
void CallAddReferencedObjects(UObject *This, FReferenceCollector &Collector) const
Definition Class.h:3893
EClassCastFlags ClassCastFlags
Definition Class.h:3826
int32 ClassUnique
Definition Class.h:3811
Definition Class.h:2681
UDelegateFunction(const FObjectInitializer &ObjectInitializer)
Definition Class.h:2685
Definition Mutex.h:18
Definition CriticalSection.h:14
Definition SharedMutex.h:22
Definition GarbageCollection.h:65
Definition SharedLock.h:22
Definition UniqueLock.h:20
Definition Class.h:3391
TConstArrayView< FName > GetNames() const
Definition Class.h:3480
int32 Num() const
Definition Class.h:3436
FIteratorEnd end() const
Definition Class.h:3534
FIterator begin() const
Definition Class.h:3526
TArrayView< FName > GetMutableNames()
Definition Class.h:3473
TPair< FName, int64 > operator[](int32 Index) const
Definition Class.h:3446
bool IsValidIndex(int32 Index) const
Definition Class.h:3441
TConstArrayView< int64 > GetValues() const
Definition Class.h:3487
Definition Class.h:2791
static UE_FORCEINLINE_HINT void GetValueAsString(const EnumType EnumeratorValue, FString &out_StringValue)
Definition Class.h:3272
static FString GetValueOrBitfieldAsString(const IntegralType EnumeratorValue)
Definition Class.h:3311
static bool IsFullEnumName(const TCHAR *InEnumName)
Definition Class.h:2994
void SetEnumDisplayNameFn(FEnumDisplayNameFn InEnumDisplayNameFn)
Definition Class.h:2963
EEnumFlags EnumFlags
Definition Class.h:3544
static UE_FORCEINLINE_HINT void GetValueOrBitfieldAsString(const IntegralType EnumeratorValue, FString &out_StringValue)
Definition Class.h:3331
static FRWLock AllEnumNamesLock
Definition Class.h:3553
static FString GetValueOrBitfieldAsString(const EnumType EnumeratorValue)
Definition Class.h:3286
ECppForm
Definition Class.h:2799
bool HasAnyEnumFlags(EEnumFlags InFlags) const
Definition Class.h:2983
COREUOBJECT_API FName GetNameByValue(int64 InValue) const
Definition Enum.cpp:346
static UE_FORCEINLINE_HINT void GetValueOrBitfieldAsString(const TCHAR *EnumPath, const T EnumeratorValue, FString &out_StringValue)
Definition Class.h:3195
static UE_FORCEINLINE_HINT FString GetValueOrBitfieldAsString(const TCHAR *EnumPath, const TEnumAsByte< T > EnumeratorValue)
Definition Class.h:3189
static FName GetValueAsName(const EnumType EnumeratorValue)
Definition Class.h:3231
static UE_FORCEINLINE_HINT void GetValueAsString(const TCHAR *EnumPath, const T EnumeratorValue, FString &out_StringValue)
Definition Class.h:3175
static FString GetValueAsString(const TCHAR *EnumPath, const T EnumeratorValue)
Definition Class.h:3161
FEnumDisplayNameFn EnumDisplayNameFn
Definition Class.h:3550
static consteval int64 CalculateMaxEnumValue(std::initializer_list< int64 > Values, EEnumFlags InFlags)
Definition Class.h:3371
static UE_FORCEINLINE_HINT void GetValueOrBitfieldAsString(const EnumType EnumeratorValue, FString &out_StringValue)
Definition Class.h:3321
int64 GetValueByIndex(int32 Index) const
Definition Class.h:2859
static UE_FORCEINLINE_HINT void GetDisplayValueAsText(const EnumType EnumeratorValue, FText &out_TextValue)
Definition Class.h:3358
ECppForm GetCppForm() const
Definition Class.h:2973
static UE_FORCEINLINE_HINT void GetValueAsName(const EnumType EnumeratorValue, FName &out_NameValue)
Definition Class.h:3247
static FText GetDisplayValueAsText(const EnumType EnumeratorValue)
Definition Class.h:3342
static FString GetValueAsString(const EnumType EnumeratorValue)
Definition Class.h:3258
int32 GetIndexByValue(int64 InValue) const
Definition Class.h:2846
static UE_FORCEINLINE_HINT FString GetValueAsString(const TEnumAsByte< EnumType > EnumeratorValue)
Definition Class.h:3266
static UE_FORCEINLINE_HINT FString GetValueOrBitfieldAsString(const TEnumAsByte< EnumType > EnumeratorValue)
Definition Class.h:3301
static FString GetValueOrBitfieldAsString(const TCHAR *EnumPath, const T EnumeratorValue)
Definition Class.h:3181
COREUOBJECT_API FString GetValueOrBitfieldAsString(int64 InValue) const
Definition Enum.cpp:811
int32 NumEnums() const
Definition Class.h:3080
COREUOBJECT_API FString GetNameStringByValue(int64 InValue) const
Definition Enum.cpp:780
static UE_FORCEINLINE_HINT FName GetValueAsName(const TEnumAsByte< EnumType > EnumeratorValue)
Definition Class.h:3241
static COREUOBJECT_API FString GenerateEnumPrefix(const TArray< TPair< FName, int64 > > &InNames, FName InEnumName)
Find the longest common prefix of all enum names in the provided list.
FName EnumPackage
Definition Class.h:3547
static UE_FORCEINLINE_HINT FText GetDisplayValueAsText(const TCHAR *EnumPath, const TEnumAsByte< T > EnumeratorValue)
Definition Class.h:3214
static UE_FORCEINLINE_HINT FText GetDisplayValueAsText(const TEnumAsByte< EnumType > EnumeratorValue)
Definition Class.h:3352
static TMap< FName, TMap< FName, UEnum * > > AllEnumNames
Definition Class.h:3556
static FText GetDisplayValueAsText(const TCHAR *EnumPath, const T EnumeratorValue)
Definition Class.h:3206
void SetEnumFlags(EEnumFlags FlagsToSet)
Definition Class.h:2978
static UE_FORCEINLINE_HINT FString GetValueAsString(const TCHAR *EnumPath, const TEnumAsByte< T > EnumeratorValue)
Definition Class.h:3169
COREUOBJECT_API FText GetDisplayNameTextByValue(int64 InValue) const
Definition Enum.cpp:899
ECppForm CppForm
Definition Class.h:3541
static UE_FORCEINLINE_HINT void GetDisplayValueAsText(const TCHAR *EnumPath, const T EnumeratorValue, FText &out_TextValue)
Definition Class.h:3220
Definition Class.h:181
UClass FieldTypeClass
Definition Class.h:186
UField BaseFieldClass
Definition Class.h:185
~UField()=default
Definition Class.h:2476
static uint64 GetDefaultIgnoredSignatureCompatibilityFlags()
Definition Class.h:2643
UE_FORCEINLINE_HINT UClass * GetOuterUClassUnchecked() const
Definition Class.h:2610
UE_FORCEINLINE_HINT UClass * GetOuterUClass() const
Definition Class.h:2599
uint16 RPCId
Definition Class.h:2493
UFunction(const FObjectInitializer &ObjectInitializer)
Definition Class.h:2548
uint8 NumParms
Definition Class.h:2487
UE_FORCEINLINE_HINT void SetNativeFunc(FNativeFuncPtr InFunc)
Definition Class.h:2533
UE_FORCEINLINE_HINT bool HasAllFunctionFlags(EFunctionFlags FlagsToCheck) const
Definition Class.h:2635
UFunction * GetSuperFunction() const
Definition Class.h:5188
UE_FORCEINLINE_HINT bool HasAnyFunctionFlags(EFunctionFlags FlagsToCheck) const
Definition Class.h:2624
uint16 ParmsSize
Definition Class.h:2489
uint16 ReturnValueOffset
Definition Class.h:2491
FProperty * FirstPropertyToInit
Definition Class.h:2498
UE_FORCEINLINE_HINT FNativeFuncPtr GetNativeFunc() const
Definition Class.h:2523
uint16 RPCResponseId
Definition Class.h:2495
virtual UStruct * GetInheritanceSuper() const override
Definition Class.h:2589
EFunctionFlags FunctionFlags
Definition Class.h:2482
Definition UObjectBaseUtility.h:45
bool IsA() const
Definition UObjectBaseUtility.h:640
bool IsA(OtherClassType SomeBase) const
Definition UObjectBaseUtility.h:619
FORCEINLINE UClass * GetClass() const
Definition UObjectBase.h:217
Definition Object.h:95
COREUOBJECT_API UFunction * FindFunctionChecked(FName InName) const
Definition ScriptCore.cpp:1495
bool Implements() const
Definition Class.h:5202
COREUOBJECT_API UFunction * FindFunction(FName InName) const
Definition ScriptCore.cpp:1490
Definition CoreNet.h:191
Definition PropertyWrapper.h:23
Definition Class.h:1720
void ClearCppStructOps()
Definition Class.h:2299
ICppStructOps * GetCppStructOps() const
Definition Class.h:2292
bool ShouldSerializeAtomically(FArchive &Ar) const
Definition Class.h:2319
EStructFlags StructFlags
Definition Class.h:2224
bool UseNativeSerialization() const
Definition Class.h:2332
bool bPrepareCppStructOpsCompleted
Definition Class.h:2228
virtual COREUOBJECT_API void Serialize(FStructuredArchive::FRecord Record) override
static void DeferCppStructOps(FTopLevelAssetPath Target)
Definition Class.h:2276
ICppStructOps * CppStructOps
Definition Class.h:2230
COREUOBJECT_API UScriptStruct(EStaticConstructor, int32 InSize, int32 InAlignment, EObjectFlags InFlags)
Definition Class.cpp:3063
UE_FORCEINLINE_HINT bool HasDefaults() const
Definition Class.h:2310
Definition Class.h:2710
USparseDelegateFunction(const FObjectInitializer &ObjectInitializer)
Definition Class.h:2714
Definition Class.h:480
FProperty * PropertyLink
Definition Class.h:530
UE_FORCEINLINE_HINT int32 GetPropertiesSize() const
Definition Class.h:763
virtual const TCHAR * GetPrefixCPP() const
Definition Class.h:760
FProperty * PostConstructLink
Definition Class.h:536
void SetUnresolvedScriptProperties(FUnresolvedScriptPropertiesArray &InUnresolvedProperties)
Definition Class.h:903
UE_FORCEINLINE_HINT int32 GetStructureSize() const
Definition Class.h:775
FSuperStructIterator GetSuperStructIterator()
Definition Class.h:816
void SetPropertiesSize(int32 NewSize)
Definition Class.h:781
FProperty * RefLink
Definition Class.h:532
virtual bool ArePropertyGuidsAvailable() const
Definition Class.h:979
void DeleteUnresolvedScriptProperties()
Definition Class.h:913
virtual UStruct * GetInheritanceSuper() const
Definition Class.h:659
virtual COREUOBJECT_API void Serialize(FStructuredArchive::FRecord Record) override
UE_FORCEINLINE_HINT int32 GetMinAlignment() const
Definition Class.h:769
bool IsChildOf() const
Definition Class.h:788
UStruct * GetSuperStruct() const
Definition Class.h:827
virtual void SerializeTaggedProperties(FArchive &Ar, uint8 *Data, const UStruct *DefaultsStruct, const uint8 *Defaults, const UObject *BreakRecursionIfFullyLoad=nullptr) const final
Definition Class.h:712
virtual void SerializeBin(FArchive &Ar, void *Data) const final
Definition Class.h:678
FConstSuperStructIterator GetSuperStructIterator() const
Definition Class.h:821
FProperty * DestructorLink
Definition Class.h:534
UStruct(const FObjectInitializer &ObjectInitializer)
Definition Class.h:576
virtual FGuid FindPropertyGuidFromName(const FName InName) const
Definition Class.h:976
virtual FProperty * CustomFindProperty(const FName InName) const
Definition Class.h:750
virtual bool IsStructTrashed() const
Definition Class.h:845
UE_REWRITE constexpr auto MaxElement(RangeType &&Range) -> decltype(AlgoImpl::MaxElementBy(Range, FIdentityFunctor(), TLess<>()))
Definition MaxElement.h:40
Definition Class.h:3732
Type
Definition Class.h:3734
@ IncludeSuper
Definition Class.h:3736
@ ExcludeSuper
Definition Class.h:3735
Type
Definition LogVerbosity.h:17
@ NoLogging
Definition LogVerbosity.h:19
Definition FieldSystemNoiseAlgo.cpp:6
FUniformParams Params
Definition MeshPaintVirtualTexture.cpp:162
Definition Class.h:1127
Definition CoreGlobals.cpp:268
constexpr const TStructOpsFakeVTable TStructOpsFakeVTableInstance< CppStruct >
Definition Class.h:1692
bool FindInnerPropertyInstance(FName PropertyName, const void *Data, const FProperty *&OutProp, const void *&OutData)
Definition Class.h:1403
uint32 GetStructTypeHash(const void *Src)
Definition Class.h:1457
EStructOpsFakeVTableFlags
Definition Class.h:1549
void PostSerialize(const FArchive &Ar, void *Data)
Definition Class.h:1300
bool ImportTextItem(const TCHAR *&Buffer, void *Data, int32 PortFlags, UObject *OwnerObject, FOutputDevice *ErrorText)
Definition Class.h:1396
constexpr FCapabilities GetCapabilities()
Definition Class.h:1172
void * ResolveVisitedPathInfo(void *Data, const FPropertyVisitorInfo &Info)
Definition Class.h:1511
bool NetDeltaSerialize(FNetDeltaSerializeInfo &DeltaParms, void *Data)
Definition Class.h:1314
bool Identical(const void *A, const void *B, uint32 PortFlags, bool &bOutResult)
Definition Class.h:1353
bool ExportTextItem(FString &ValueStr, const void *PropertyValue, const void *DefaultValue, UObject *Parent, int32 PortFlags, UObject *ExportRootScope)
Definition Class.h:1368
bool SerializeArchive(FArchive &Ar, void *Data, UStruct *DefaultsStruct, const void *Defaults)
Definition Class.h:1272
void ConstructForTests(void *Dest)
Definition Class.h:1242
bool NetSerialize(FArchive &Ar, UPackageMap *Map, bool &bOutSuccess, void *Data)
Definition Class.h:1307
bool SerializeSlot(FStructuredArchive::FSlot Slot, void *Data, UStruct *DefaultsStruct, const void *Defaults)
Definition Class.h:1286
void PostScriptConstruct(void *Data)
Definition Class.h:1321
void(*)(void *A, FReferenceCollector &Collector) AddStructReferencedObjects()
Definition Class.h:1410
void Construct(void *Dest)
Definition Class.h:1220
constexpr EStructOpsFakeVTableFlags GetStructOpsFakeVTableFlags()
Definition Class.h:1578
void InitializeIntrusiveUnsetOptionalValue(void *Data)
Definition Class.h:1464
EPropertyVisitorControlFlow Visit(FPropertyVisitorContext &Context, const TFunctionRef< EPropertyVisitorControlFlow(const FPropertyVisitorContext &Context)> InFunc)
Definition Class.h:1503
void Destruct(void *Dest)
Definition Class.h:1265
void GetPreloadDependencies(void *Data, TArray< UObject * > &OutDeps)
Definition Class.h:1328
constexpr const TStructOpsFakeVTable< Funcs... > TStructOpsFakeVTableInstance
Definition Class.h:1683
void ClearIntrusiveOptionalValue(void *Data)
Definition Class.h:1478
bool SerializeFromMismatchedTag(FPropertyTag const &Tag, FArchive &Ar, void *Data)
Definition Class.h:1417
bool StructuredSerializeFromMismatchedTag(FPropertyTag const &Tag, FStructuredArchive::FSlot Slot, void *Data)
Definition Class.h:1437
bool IsIntrusiveOptionalValueSet(const void *Data)
Definition Class.h:1471
Definition PackageReader.cpp:44
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition GetTypeHashable.h:11
Definition StructuredArchiveNameHelpers.h:10
Definition AssetBundleData.h:82
Definition AssetData.h:162
Definition Blake3.h:27
Definition Class.h:3741
const char * FuncNameUTF8
Definition Class.h:3743
Definition Color.h:486
Definition Class.h:3654
bool bIsAbstract
Definition Class.h:3655
Definition Class.h:3661
virtual bool IsAbstract() const override
Definition Class.h:3672
FCppClassTypeInfo(const FCppClassTypeInfo &)=delete
constexpr FCppClassTypeInfo(const FCppClassTypeInfoStatic *InInfo)
Definition Class.h:3662
FCppClassTypeInfo & operator=(const FCppClassTypeInfo &)=delete
Definition Class.h:3626
@ IsAbstract
Definition Class.h:3629
Definition UnrealType.h:6698
Definition DateTime.h:76
Definition FallbackStruct.h:7
Definition FrameNumber.h:18
Definition FrameRate.h:21
Definition FrameTime.h:16
Definition Stack.h:114
Definition Guid.h:109
Definition Class.h:3684
friend COREUOBJECT_API FArchive & operator<<(FArchive &Ar, FImplementedInterface &A)
Definition Class.cpp:6367
TObjectPtr< UClass > Class
Definition Class.h:3686
FImplementedInterface()
Definition Class.h:3692
FImplementedInterface(UClass *InClass, int32 InOffset, bool InImplementedByK2)
Definition Class.h:3697
int32 PointerOffset
Definition Class.h:3688
bool bImplementedByK2
Definition Class.h:3690
Definition Color.h:48
static constexpr UE_FORCEINLINE_HINT bool IsPowerOfTwo(T Value)
Definition UnrealMathUtility.h:519
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131
Definition Class.h:3713
FNativeFunctionLookup(FName InName, FNativeFuncPtr InPointer)
Definition Class.h:3724
FNativeFuncPtr Pointer
Definition Class.h:3715
FName Name
Definition Class.h:3714
Definition CoreNet.h:643
Definition Class.h:4941
void SetLoadingObject(bool bIsLoading)
Definition Class.h:5075
void ForEachObjectInstance(Predicate Pred)
Definition Class.h:5040
const UObject * GetDestinationRoot() const
Definition Class.h:4975
bool IsPropertyInSubobjectExclusionList(const FProperty *Property) const
Definition Class.h:5091
void EnableSubobjectInstancing(bool bEnabled)
Definition Class.h:5052
bool HasDestinationRoot() const
Definition Class.h:4967
bool IsSubobjectInstancingEnabled() const
Definition Class.h:5067
void AddPropertyToSubobjectExclusionList(const FProperty *Property)
Definition Class.h:5083
Definition RemoteObjectPathName.h:36
Definition PolyglotTextData.h:17
Definition PrimaryAssetId.h:126
Definition PrimaryAssetId.h:28
Definition PropertyTag.h:38
Definition PropertyVisitor.h:268
Definition PropertyVisitor.h:249
Definition PropertyVisitor.h:32
Definition PropertyVisitor.h:97
Definition RandomStream.h:20
Definition RemoteObjectTransfer.h:22
Definition RemoteObjectTransfer.h:30
Definition RemoteObjectTypes.h:212
Definition RemoteObjectPathName.h:73
Definition RemoteObjectTransfer.h:173
Definition RemoteObjectPathName.h:11
Definition RemoteObjectTypes.h:49
Definition Class.h:164
int32 Index
Definition Class.h:166
FRepRecord(FProperty *InProperty, int32 InIndex)
Definition Class.h:167
FProperty * Property
Definition Class.h:165
Definition SoftObjectPath.h:539
Definition SoftObjectPath.h:56
Definition Class.h:5246
static COREUOBJECT_API bool ArePropertiesTheSame(const FProperty *A, const FProperty *B, bool bCheckPropertiesNames)
Definition Class.cpp:7707
static COREUOBJECT_API int32 AttemptToFindUninitializedScriptStructMembers()
Definition Class.cpp:4240
static COREUOBJECT_API bool TheSameLayout(const UStruct *StructA, const UStruct *StructB, bool bCheckPropertiesNames=false)
Definition Class.cpp:7742
static COREUOBJECT_API UStruct * FindStructureInPackageChecked(const TCHAR *StructName, const TCHAR *PackageName)
Definition Class.cpp:7780
Definition TopLevelAssetPath.h:38
Definition ObjectMacros.h:2059
AddReferencedObjectsType GetAddReferencedObjects() const
Definition ObjectMacros.h:2114
Definition UObjectThreadContext.h:140
Definition Class.h:3647
virtual bool IsAbstract() const =0
static FORCEINLINE T * NoAccessTrackingGet(const TObjectPtr< T > &Ptr)
Definition ObjectPtr.h:867
Definition Class.h:5274
static UScriptStruct * Get()
Definition Class.h:5275
static COREUOBJECT_API UScriptStruct * Get()
Definition Class.h:5288
static UE_FORCEINLINE_HINT int32 Atoi(const CharType *String)
Definition CString.h:1173
static UE_FORCEINLINE_HINT float Atof(const CharType *String)
Definition CString.h:1185
static UE_FORCEINLINE_HINT const CharType * Strstr(const CharType *String, const CharType *Find)
Definition CString.h:1066
Definition Class.h:3637
@ IsAbstract
Definition Class.h:3640
Definition FieldPath.h:283
Definition IsAbstract.h:10
Definition IsEnumClass.h:25
Definition IsEnum.h:7
Definition IsPODType.h:12
Definition IsUECoreType.h:40
Definition IsUECoreType.h:19
Definition UnrealTypeTraits.h:172
Definition ObjectPtrLinkedListBuilder.h:26
Definition ObjectPtrLinkedListIterator.h:10
Definition ObjectPtr.h:488
Definition Optional.h:131
Definition StructOpsTypeTraits.h:11
@ WithNetSerializer
Definition StructOpsTypeTraits.h:26
@ WithSerializer
Definition StructOpsTypeTraits.h:23
Definition StructOpsTypeTraits.h:46
Definition Tuple.h:652
Definition TypeCompatibleBytes.h:24
Definition Class.h:5553
Definition UObjectGlobals.h:4248
bool IsAbstract
Definition Class.h:1160
bool IsUECoreVariant
Definition Class.h:1150
bool HasFindInnerPropertyInstance
Definition Class.h:1161
bool HasVisitor
Definition Class.h:1166
bool IsUECoreType
Definition Class.h:1149
bool ClearOnFinishDestroy
Definition Class.h:1162
bool HasIdentical
Definition Class.h:1152
bool HasZeroConstructor
Definition Class.h:1139
bool HasDestructor
Definition Class.h:1140
bool HasExportTextItem
Definition Class.h:1153
bool HasPostSerialize
Definition Class.h:1143
bool HasGetPreloadDependencies
Definition Class.h:1167
bool HasGetTypeHash
Definition Class.h:1158
bool IsPlainOldData
Definition Class.h:1148
bool HasNetSharedSerialization
Definition Class.h:1145
bool HasNetSerializer
Definition Class.h:1144
bool HasAddStructReferencedObjects
Definition Class.h:1155
bool IsIntrusiveOptionalSafeForGC
Definition Class.h:1168
bool HasSerializer
Definition Class.h:1141
bool HasNetDeltaSerializer
Definition Class.h:1146
bool HasPostScriptConstruct
Definition Class.h:1147
EPropertyFlags ComputedPropertyFlags
Definition Class.h:1136
bool HasNoopConstructor
Definition Class.h:1138
EPropertyObjectReferenceType HasSerializerObjectReferences
Definition Class.h:1137
bool HasImportTextItem
Definition Class.h:1154
bool HasCopy
Definition Class.h:1151
bool HasStructuredSerializeFromMismatchedTag
Definition Class.h:1157
bool HasStructuredSerializer
Definition Class.h:1142
bool HasSerializeFromMismatchedTag
Definition Class.h:1156
bool HasIntrusiveUnsetOptionalState
Definition Class.h:1159
FCapabilities Capabilities
Definition Class.h:1601
void(* HandlingFunctions[0])()
Definition Class.h:1608
UE_REWRITE auto GetHandlingFunc() const
Definition Class.h:1613
EStructOpsFakeVTableFlags Flags
Definition Class.h:1598
TTuple< decltype(Funcs)... > Functions
Definition Class.h:1660
Definition IntPoint.h:25
Definition IntVector.h:670
Definition Class.h:3494
Definition Class.h:3497
void operator++()
Definition Class.h:3498
const int64 * Values
Definition Class.h:3523
bool operator==(FIteratorEnd) const
Definition Class.h:3503
bool operator!=(FIteratorEnd) const
Definition Class.h:3509
int32 Num
Definition Class.h:3521
const FName * Names
Definition Class.h:3522
TPair< FName, int64 > operator*() const
Definition Class.h:3515
Definition Class.h:1725
const FCapabilities & GetCapabilities() const
Definition Class.h:1741
bool HasImportTextItem() const
Definition Class.h:1972
UE_FORCEINLINE_HINT int32 GetSize() const
Definition Class.h:1785
void PostSerialize(const FArchive &Ar, void *Data)
Definition Class.h:1840
bool IsPlainOldData() const
Definition Class.h:1909
void Construct(void *Dest)
Definition Class.h:1759
bool HasIdentical() const
Definition Class.h:1942
bool HasDestructor() const
Definition Class.h:1773
bool Serialize(FStructuredArchive::FSlot Slot, void *Data, UStruct *DefaultsStruct, const void *Defaults)
Definition Class.h:1828
bool ImportTextItem(const TCHAR *&Buffer, void *Data, int32 PortFlags, UObject *OwnerObject, FOutputDevice *ErrorText)
Definition Class.h:1981
UE_FORCEINLINE_HINT int32 GetAlignment() const
Definition Class.h:1791
void(*)(void *A, FReferenceCollector &Collector) PointerToAddStructReferencedObjectsType
Definition Class.h:2012
bool IsUECoreVariant() const
Definition Class.h:1921
void GetPreloadDependencies(void *Data, TArray< UObject * > &OutDeps)
Definition Class.h:1900
bool IsUECoreType() const
Definition Class.h:1915
bool Serialize(FArchive &Ar, void *Data, UStruct *DefaultsStruct, const void *Defaults)
Definition Class.h:1824
bool HasPostScriptConstruct() const
Definition Class.h:1882
bool StructuredSerializeFromMismatchedTag(FPropertyTag const &Tag, FStructuredArchive::FSlot Slot, void *Data)
Definition Class.h:2040
bool HasNetSerializer() const
Definition Class.h:1846
bool HasExportTextItem() const
Definition Class.h:1957
bool HasNoopConstructor() const
Definition Class.h:1747
bool HasAddStructReferencedObjects() const
Definition Class.h:1997
bool HasGetPreloadDependencies() const
Definition Class.h:1894
bool HasFindInnerPropertyInstance() const
Definition Class.h:1986
bool HasStructuredSerializeFromMismatchedTag() const
Definition Class.h:2026
bool SerializeFromMismatchedTag(FPropertyTag const &Tag, FArchive &Ar, void *Data)
Definition Class.h:2035
bool HasPostSerialize() const
Definition Class.h:1834
bool HasSerializer() const
Definition Class.h:1797
bool HasStructuredSerializer() const
Definition Class.h:1803
bool HasSerializeFromMismatchedTag() const
Definition Class.h:2021
bool HasClearOnFinishDestroy() const
Definition Class.h:2077
bool HasVisitor() const
Definition Class.h:2130
uint32 GetStructTypeHash(const void *Src)
Definition Class.h:2052
bool ExportTextItem(FString &ValueStr, const void *PropertyValue, const void *DefaultValue, UObject *Parent, int32 PortFlags, UObject *ExportRootScope)
Definition Class.h:1966
PointerToAddStructReferencedObjectsType AddStructReferencedObjects()
Definition Class.h:2015
void Destruct(void *Dest)
Definition Class.h:1779
void PostScriptConstruct(void *Data)
Definition Class.h:1888
void InitializeIntrusiveUnsetOptionalValue(void *Data) const
Definition Class.h:2089
bool IsIntrusiveOptionalValueSet(const void *Data) const
Definition Class.h:2095
bool NetDeltaSerialize(FNetDeltaSerializeInfo &DeltaParms, void *Data)
Definition Class.h:1876
bool FindInnerPropertyInstance(FName PropertyName, const void *Data, const FProperty *&OutProp, const void *&OutData) const
Definition Class.h:1991
bool HasNetSharedSerialization() const
Definition Class.h:1852
bool HasSerializerObjectReferences(EPropertyObjectReferenceType Type) const
Definition Class.h:2003
constexpr ICppStructOps(int32 InSize, int32 InAlignment)
Definition Class.h:1734
bool Identical(const void *A, const void *B, uint32 PortFlags, bool &bOutResult)
Definition Class.h:1951
bool NetSerialize(FArchive &Ar, UPackageMap *Map, bool &bOutSuccess, void *Data)
Definition Class.h:1861
bool HasIntrusiveUnsetOptionalState() const
Definition Class.h:2083
bool IsAbstract() const
Definition Class.h:2071
void ConstructForTests(void *Dest)
Definition Class.h:1766
void ClearIntrusiveOptionalValue(void *Data) const
Definition Class.h:2101
EPropertyFlags GetComputedPropertyFlags() const
Definition Class.h:2065
bool HasGetTypeHash() const
Definition Class.h:2046
bool HasZeroConstructor() const
Definition Class.h:1753
EPropertyVisitorControlFlow Visit(FPropertyVisitorContext &Context, const TFunctionRef< EPropertyVisitorControlFlow(const FPropertyVisitorContext &Context)> InFunc) const
Definition Class.h:2136
bool HasCopy() const
Definition Class.h:1927
const UE::CoreUObject::Private::FStructOpsFakeVTable * FakeVPtr
Definition Class.h:1728
void * ResolveVisitedPathInfo(void *Data, const FPropertyVisitorInfo &Info) const
Definition Class.h:2148
bool IsIntrusiveOptionalSafeForGC() const
Definition Class.h:2110
bool HasNetDeltaSerializer() const
Definition Class.h:1867
bool Copy(void *Dest, void const *Src, int32 ArrayDim)
Definition Class.h:1936
Definition Class.h:2191
~TAutoCppStructOps()
Definition Class.h:2198
FTopLevelAssetPath Name
Definition Class.h:2202
TAutoCppStructOps(FTopLevelAssetPath InName)
Definition Class.h:2192
Definition Class.h:2170
TStructOpsTypeTraits< CPPSTRUCT > TTraits
Definition Class.h:2171
constexpr TCppStructOps()
Definition Class.h:2172
Definition NoDestroy.h:18