9#include "Containers/Array.h"
11#include "Containers/Map.h"
25#include "Misc/Optional.h"
87 std::atomic<int32> UniqueNameIndexCounter = 0;
120#if UE_WITH_CONSTINIT_UOBJECT
123 return Name !=
FName();
129#if UE_WITH_CONSTINIT_UOBJECT
132 return Name.ToString();
136#if UE_WITH_CONSTINIT_UOBJECT
178 DefaultObject = ConstructDefaultObject();
179 check(DefaultObject);
181 return DefaultObject;
191 return ++UniqueNameIndexCounter;
214#if UE_WITH_CONSTINIT_UOBJECT
219#if UE_WITH_CONSTINIT_UOBJECT
226#if !CHECK_PUREVIRTUALS
227 #define DECLARE_FIELD_NEW_IMPLEMENTATION(TClass) \
228 ThisClass* Mem = (ThisClass*)FMemory::Malloc(InSize); \
229 new (Mem) TClass(EC_InternalUseOnlyConstructor, TClass::StaticClass()); \
232 #define DECLARE_FIELD_NEW_IMPLEMENTATION(TClass) \
233 ThisClass* Mem = (ThisClass*)FMemory::Malloc(InSize); \
237#if UE_WITH_CONSTINIT_UOBJECT
238#define UE_DEFINE_GET_FIELD_CLASS_PRIVATE virtual FFieldClass* GetFieldClassPrivate() override { return &ConstInitClass; }
239#define UE_DECLARE_FIELD_CLASS_STATIC_CONSTINIT static constinit TNoDestroy<FFieldClass> ConstInitClass;
240#define UE_DEFINE_FIELD_CLASS_STATIC_CONSTINIT(TClass) \
241 constinit TNoDestroy<FFieldClass> TClass::ConstInitClass{ NoDestroyConstEval, \
243 TEXT(PREPROCESSOR_TO_STRING(TClass)), \
244 TClass::StaticClassCastFlagsPrivate(), \
245 TClass::StaticClassCastFlags(), \
246 &TClass::Super::ConstInitClass, \
247 &TClass::Construct };
249#define UE_DEFINE_GET_FIELD_CLASS_PRIVATE
250#define UE_DECLARE_FIELD_CLASS_STATIC_CONSTINIT
251#define UE_DEFINE_FIELD_CLASS_STATIC_CONSTINIT(...)
254#define DECLARE_FIELD(TClass, TSuperClass, TStaticFlags) \
255 DECLARE_FIELD_API(TClass, TSuperClass, TStaticFlags, NO_API)
257#define DECLARE_FIELD_API(TClass, TSuperClass, TStaticFlags, TRequiredAPI) \
259 TClass& operator=(TClass&&) = delete; \
260 TClass& operator=(const TClass&) = delete; \
261 UE_DEFINE_GET_FIELD_CLASS_PRIVATE \
263 using Super = PREPROCESSOR_REMOVE_OPTIONAL_PARENS(TSuperClass);\
264 using ThisClass = TClass;\
265 TClass(EInternal InInernal, FFieldClass* InClass) \
266 : Super(EC_InternalUseOnlyConstructor, InClass) \
269 static TRequiredAPI FFieldClass* StaticClass(); \
270 UE_DECLARE_FIELD_CLASS_STATIC_CONSTINIT \
271 static TRequiredAPI FField* Construct(const FFieldVariant& InOwner, const FName& InName, EObjectFlags InObjectFlags); \
272 inline static constexpr EClassCastFlags StaticClassCastFlagsPrivate() \
274 return TStaticFlags; \
276 inline static constexpr EClassCastFlags StaticClassCastFlags() \
278 return TStaticFlags | Super::StaticClassCastFlags(); \
280 inline void* operator new(const size_t InSize, void* InMem) \
284 inline void* operator new(const size_t InSize) \
286 DECLARE_FIELD_NEW_IMPLEMENTATION(TClass) \
288 inline void operator delete(void* InMem) noexcept \
290 FMemory::Free(InMem); \
292 friend FArchive &operator<<( FArchive& Ar, ThisClass*& Res ) \
294 return Ar << (FField*&)Res; \
296 friend void operator<<(FStructuredArchive::FSlot InSlot, ThisClass*& Res) \
298 InSlot << (FField*&)Res; \
300 virtual SIZE_T GetFieldSize() const override \
302 return sizeof(TClass); \
305#if !CHECK_PUREVIRTUALS
306 #define IMPLEMENT_FIELD_CONSTRUCT_IMPLEMENTATION(TClass) \
307 FField* Instance = new TClass(InOwner, InName, InFlags); \
310 #define IMPLEMENT_FIELD_CONSTRUCT_IMPLEMENTATION(TClass) \
314#if UE_WITH_CONSTINIT_UOBJECT
315#define IMPLEMENT_FIELD(TClass) \
316 FField* TClass::Construct(const FFieldVariant& InOwner, const FName& InName, EObjectFlags InFlags) \
318 IMPLEMENT_FIELD_CONSTRUCT_IMPLEMENTATION(TClass) \
320 UE_DEFINE_FIELD_CLASS_STATIC_CONSTINIT(TClass) \
321 static FRegisterFieldClass Register_FieldClass_##TClass( \
322 &TClass::ConstInitClass, TEXT(UE_STRINGIZE(TClass))); \
323 FFieldClass* TClass::StaticClass() \
325 checkf(ConstInitClass->IsFullyConstructed(), \
326 UE_STRINGIZE(TClass) TEXT(": FieldClass not fully constructed before ::StaticClass called")); \
327 return &ConstInitClass; \
330#define IMPLEMENT_FIELD(TClass) \
331FField* TClass::Construct(const FFieldVariant& InOwner, const FName& InName, EObjectFlags InFlags) \
333 IMPLEMENT_FIELD_CONSTRUCT_IMPLEMENTATION(TClass) \
335FFieldClass* TClass::StaticClass() \
337 static FFieldClass StaticFieldClass(TEXT(PREPROCESSOR_TO_STRING(TClass)), TClass::StaticClassCastFlagsPrivate(), TClass::StaticClassCastFlags(), TClass::Super::StaticClass(), &TClass::Construct); \
338 return &StaticFieldClass; \
354 union FFieldObjectUnion
361 static constexpr uintptr_t UObjectMask = 0x1;
363 constexpr void ConditionallyMarkAsReachable()
378 Container.Field =
nullptr;
387#if UE_WITH_CONSTINIT_UOBJECT
391 Container.Object = InObject;
402 UE_REQUIRES(std::is_convertible_v<T, const UObject*>)
408 ConditionallyMarkAsReachable();
417 : Container(
Other.Container)
419 ConditionallyMarkAsReachable();
424 Container =
Other.Container;
425 ConditionallyMarkAsReachable();
430 : Container(
Other.Container)
432 ConditionallyMarkAsReachable();
437 Container =
Other.Container;
438 ConditionallyMarkAsReachable();
444 return (
uintptr_t)Container.Object & UObjectMask;
457 template <
typename T>
460 static_assert(
sizeof(T) > 0,
"T must not be an incomplete type");
461 return IsA(T::StaticClass());
464 template <
typename T>
467 static_assert(
sizeof(T) > 0,
"T must not be an incomplete type");
468 if (
IsA(T::StaticClass()))
470 if constexpr (std::is_base_of_v<UObject, T>)
507 return Container.Field;
518 return (
void*)Container.Unknown;
532 return Container.Field ==
Other.Container.Field;
536 return Container.Field !=
Other.Container.Field;
563#if UE_WITH_CONSTINIT_UOBJECT
570#if UE_WITH_CONSTINIT_UOBJECT
581#if UE_WITH_CONSTINIT_UOBJECT
614#if WITH_EDITORONLY_DATA
619#if UE_WITH_CONSTINIT_UOBJECT
662#if UE_WITH_CONSTINIT_UOBJECT
740 if constexpr (!!(T::StaticClassCastFlagsPrivate()))
742 return !!(
GetCastFlags() & T::StaticClassCastFlagsPrivate());
750 UE_DEPRECATED(5.0,
"HasAnyCastFlags is deprecated. Not all FField has CastFlag. Use IsA instead.")
756 UE_DEPRECATED(5.0,
"HasAllCastFlags is deprecated. Not all FField has CastFlag. Use IsA instead.")
809 template <
typename T>
812 static_assert(
sizeof(T) > 0,
"T must not be an incomplete type");
816 template <
typename T>
821 static_assert(
sizeof(T) > 0,
"T must not be an incomplete type");
827 template <
typename T>
830 static_assert(
sizeof(T) > 0,
"T must not be an incomplete type");
912 bool HasMetaData(
const TCHAR* Key)
const {
return FindMetaData(Key) !=
nullptr; }
913 bool HasMetaData(
const FName& Key)
const {
return FindMetaData(Key) !=
nullptr; }
983 const FString&
INTString = GetMetaData(Key);
989 const FString&
INTString = GetMetaData(Key);
1059#if WITH_EDITORONLY_DATA
1105template<
typename FieldType>
1111template<
typename FieldType>
1117template<
typename FieldType>
1120 return (Src && (Src->
GetClass() == FieldType::StaticClass())) ?
static_cast<FieldType*
>(Src) :
nullptr;
1123template<
typename FieldType>
1126 return (Src && (Src->
GetClass() == FieldType::StaticClass())) ?
static_cast<const FieldType*
>(Src) :
nullptr;
1129template<
typename FieldType>
1143template<
typename FieldType>
1157template<
typename FieldType>
1169template<
typename FieldType>
1184template <
typename FieldType>
1195 Field->Serialize(Ar);
1208 Field->Serialize(Ar);
1238 return TEXT(
"none");
1256template <
typename FieldType>
#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
bool IsThisNotNull(const void *This, const ANSICHAR *Function)
Definition CoreGlobals.cpp:999
#define PURE_VIRTUAL(func,...)
Definition CoreMiscDefines.h:103
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define WITH_METADATA
Definition CoreMiscDefines.h:32
EConstEval
Definition CoreMiscDefines.h:161
@ ConstEval
Definition CoreMiscDefines.h:161
FName GetFNameSafe(const FField *InField)
Definition Field.h:1216
void SerializeSingleField(FArchive &Ar, FieldType *&Field, FFieldVariant Owner)
Definition Field.h:1185
COREUOBJECT_API FString GetFullNameSafe(const FField *InField)
Definition Field.cpp:1138
FieldType * CastFieldCheckedNullAllowed(FField *Src)
Definition Field.h:1158
FString GetNameSafe(const FField *InField)
Definition Field.h:1230
FieldType * FindFProperty(const TCHAR *InFieldPath)
Definition Field.h:1257
UE_FORCEINLINE_HINT FieldType * CastField(FField *Src)
Definition Field.h:1106
COREUOBJECT_API FString GetPathNameSafe(const FField *InField, const UObject *StopOuter=nullptr)
Definition Field.cpp:1150
COREUOBJECT_API FField * FindFPropertyByPath(const TCHAR *InFieldPath)
Definition Field.cpp:1162
UE_FORCEINLINE_HINT FieldType * ExactCastField(FField *Src)
Definition Field.h:1118
FUNCTION_NON_NULL_RETURN_START FieldType * CastFieldChecked(FField *Src) FUNCTION_NON_NULL_RETURN_END
Definition Field.h:1131
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_MULTICAST_DELEGATE_ThreeParams(DelegateName, Param1Type, Param2Type, Param3Type)
Definition DelegateCombinations.h:67
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
const bool
Definition NetworkReplayStreaming.h:178
#define EInternalObjectFlags_AllFlags
Definition ObjectMacros.h:678
EClassCastFlags
Definition ObjectMacros.h:333
@ CASTCLASS_UField
Definition ObjectMacros.h:336
EClassFlags
Definition ObjectMacros.h:199
EInternalObjectFlags
Definition ObjectMacros.h:631
EObjectFlags
Definition ObjectMacros.h:552
@ RF_MarkAsRootSet
Object will be marked as root set on construction and not be garbage collected, even if unreferenced ...
Definition ObjectMacros.h:568
@ RF_NoFlags
No flags, used to avoid a cast.
Definition ObjectMacros.h:555
@ RF_MarkAsNative
Object (UField) will be marked as native on construction (DO NOT USE THIS FLAG in HasAnyFlags() etc)
Definition ObjectMacros.h:561
#define RF_AllFlags
All flags, used mainly for error checking.
Definition ObjectMacros.h:612
EInternal
Definition ObjectMacros.h:175
#define UE_REQUIRES(...)
Definition Requires.h:86
if(Failed) console_printf("Failed.\n")
Definition Archive.h:1208
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
friend FArchive & operator<<(FArchive &Ar, FFieldClass &InField)
Definition Field.h:194
uint64 GetId() const
Definition Field.h:141
uint64 GetCastFlags() const
Definition Field.h:145
static COREUOBJECT_API TArray< FFieldClass * > & GetAllFieldClasses()
Definition Field.cpp:79
COREUOBJECT_API ~FFieldClass()
Definition Field.cpp:73
FString GetName() const
Definition Field.h:127
FField * Construct(const FFieldVariant &InOwner, const FName &InName, EObjectFlags InFlags=RF_NoFlags) const
Definition Field.h:164
FName GetFName() const
Definition Field.h:134
FField *(const FFieldVariant &, const FName &, EObjectFlags) FConstructFunction
Definition Field.h:68
consteval FFieldClass(EConstEval, const TCHAR *InCPPName, uint64 InId, EClassCastFlags InCastFlags, FFieldClass *InSuperClass, FConstructFunction *InConstructFn)
Definition Field.h:102
bool IsChildOf(const FFieldClass *InClass) const
Definition Field.h:157
FField * GetDefaultObject()
Definition Field.h:174
COREUOBJECT_API FString GetDescription() const
Definition Field.cpp:96
COREUOBJECT_API FText GetDisplayNameText() const
Definition Field.cpp:101
FFieldClass * GetSuperClass() const
Definition Field.h:169
COREUOBJECT_API FFieldClass(const TCHAR *InCPPName, uint64 InId, EClassCastFlags InCastFlags, FFieldClass *InSuperClass, FConstructFunction *InConstructFn)
int32 GetNextUniqueNameIndex()
Definition Field.h:189
bool HasAllCastFlags(const uint64 InCastFlags) const
Definition Field.h:153
bool HasAnyClassFlags(EClassFlags FlagsToCheck) const
Definition Field.h:184
bool HasAnyCastFlags(const uint64 InCastFlags) const
Definition Field.h:149
static COREUOBJECT_API TMap< FName, FFieldClass * > & GetNameToFieldClassMap()
Definition Field.cpp:84
COREUOBJECT_API FName GetFName() const
Definition Field.cpp:194
constexpr FFieldVariant & operator=(const FFieldVariant &Other)
Definition Field.h:422
bool operator==(const FFieldVariant &Other) const
Definition Field.h:530
COREUOBJECT_API FFieldVariant GetOwnerVariant() const
Definition Field.cpp:124
UObject * ToUObject() const
Definition Field.h:482
COREUOBJECT_API bool IsValidLowLevel() const
Definition Field.cpp:245
constexpr FFieldVariant(TYPE_OF_NULLPTR)
Definition Field.h:411
FFieldVariant(T &&InObject)
Definition Field.h:404
FField * ToField() const
Definition Field.h:493
T * Get() const
Definition Field.h:465
COREUOBJECT_API bool IsNative() const
Definition Field.cpp:219
constexpr FFieldVariant & operator=(FFieldVariant &&Other)
Definition Field.h:435
COREUOBJECT_API UClass * GetOwnerClass() const
Definition Field.cpp:145
void * GetRawPointer() const
Definition Field.h:516
friend uint32 GetTypeHash(const FFieldVariant &InFieldVariant)
Definition Field.h:544
COREUOBJECT_API FString GetFullName() const
Definition Field.cpp:158
FFieldVariant(const FField *InField)
Definition Field.h:381
bool IsUObject() const
Definition Field.h:442
COREUOBJECT_API UPackage * GetOutermost() const
Definition Field.cpp:232
bool operator!=(const FFieldVariant &Other) const
Definition Field.h:534
bool IsValid() const
Definition Field.h:446
constexpr FFieldVariant(FFieldVariant &&Other)
Definition Field.h:429
constexpr FFieldVariant(const FFieldVariant &Other)
Definition Field.h:416
bool IsA() const
Definition Field.h:458
UE_FORCEINLINE_HINT FField * ToFieldUnsafe() const
Definition Field.h:505
UE_FORCEINLINE_HINT UObject * ToUObjectUnsafe() const
Definition Field.h:510
COREUOBJECT_API FString GetPathName() const
Definition Field.cpp:170
COREUOBJECT_API FString GetName() const
Definition Field.cpp:182
COREUOBJECT_API FString GetClassName() const
Definition Field.cpp:206
constexpr FFieldVariant()
Definition Field.h:376
T * GetTypedOwner() const
Definition Field.h:828
FFieldClass * ClassPrivate
Definition Field.h:562
static constexpr EClassCastFlags StaticClassCastFlags()
Definition Field.h:594
bool IsA() const
Definition Field.h:738
UE_FORCEINLINE_HINT UObject * InternalGetOwnerAsUObjectUnsafe() const
Definition Field.h:786
static COREUOBJECT_API FName GenerateFFieldName(FFieldVariant InOwner, FFieldClass *InClass)
Definition Field.cpp:871
COREUOBJECT_API FString GetAuthoredName() const
Definition Field.cpp:620
virtual COREUOBJECT_API void Bind()
Definition Field.cpp:421
bool HasAnyFlags(EObjectFlags FlagsToCheck) const
Definition Field.h:705
virtual COREUOBJECT_API void PostLoad()
Definition Field.cpp:425
FString GetName() const
Definition Field.h:848
virtual COREUOBJECT_API void GetPreloadDependencies(TArray< UObject * > &OutDeps)
Definition Field.cpp:465
T * GetOwner() const
Definition Field.h:810
bool HasAllFlags(EObjectFlags FlagsToCheck) const
Definition Field.h:716
static constexpr EClassCastFlags StaticClassCastFlagsPrivate()
Definition Field.h:590
virtual COREUOBJECT_API void PostDuplicate(const FField &InField)
Definition Field.cpp:841
static COREUOBJECT_API FFieldClass * StaticClass()
Definition Field.cpp:293
FField Super
Definition Field.h:575
static COREUOBJECT_API FField * Construct(const FFieldVariant &InOwner, const FName &InName, EObjectFlags InFlags)
Definition Field.cpp:277
COREUOBJECT_API UField * GetOwnerUField() const
Definition Field.cpp:408
COREUOBJECT_API bool IsRooted() const
Definition Field.cpp:487
COREUOBJECT_API FString GetFullName() const
Definition Field.cpp:599
FFieldVariant Owner
Definition Field.h:600
virtual FField * GetInnerFieldByName(const FName &InName)
Definition Field.h:890
COREUOBJECT_API bool IsNative() const
Definition Field.cpp:506
FFieldClass FieldTypeClass
Definition Field.h:578
COREUOBJECT_API bool IsIn(const UObject *InOwner) const
Definition Field.cpp:524
bool IsA(const FFieldClass *FieldType) const
Definition Field.h:731
COREUOBJECT_API UStruct * GetOwnerStruct() const
Definition Field.cpp:393
virtual COREUOBJECT_API void AddReferencedObjects(FReferenceCollector &Collector)
Definition Field.cpp:474
FField ThisClass
Definition Field.h:576
FField * Next
Definition Field.h:603
virtual COREUOBJECT_API ~FField()
Definition Field.cpp:323
COREUOBJECT_API FLinkerLoad * GetLinker() const
Definition Field.cpp:554
virtual SIZE_T GetFieldSize() const
Definition Field.h:585
static COREUOBJECT_API FField * TryConstruct(const FName &FieldTypeName, const FFieldVariant &InOwner, const FName &InName, EObjectFlags InFlags)
Definition Field.cpp:862
void SetFlagsTo(EObjectFlags NewFlags)
Definition Field.h:672
UObject * GetOwnerUObject() const
Definition Field.h:774
COREUOBJECT_API void Rename(const FName &NewName)
Definition Field.cpp:630
void ClearFlags(EObjectFlags NewFlags)
Definition Field.h:694
FFieldClass * GetClass() const
Definition Field.h:722
EObjectFlags FlagsPrivate
Definition Field.h:609
virtual void GetInnerFields(TArray< FField * > &OutFields)
Definition Field.h:896
COREUOBJECT_API UClass * GetOwnerClass() const
Definition Field.cpp:372
void GetName(FString &OutName) const
Definition Field.h:862
FUNCTION_NON_NULL_RETURN_START T * GetOwnerChecked() const FUNCTION_NON_NULL_RETURN_END
Definition Field.h:818
COREUOBJECT_API UPackage * GetOutermost() const
Definition Field.cpp:414
COREUOBJECT_API FString GetPathName(const UObject *StopOuter=nullptr) const
Definition Field.cpp:565
FFieldVariant GetOwnerVariant() const
Definition Field.h:768
bool HasAllCastFlags(const uint64 InCastFlags) const
Definition Field.h:757
void AppendName(FString &ResultString) const
Definition Field.h:762
virtual COREUOBJECT_API void AddCppProperty(FProperty *Property)
Definition Field.cpp:560
FName GetFName() const
Definition Field.h:834
FField BaseFieldClass
Definition Field.h:577
bool HasAnyCastFlags(const uint64 InCastFlags) const
Definition Field.h:751
void SetFlags(EObjectFlags NewFlags)
Definition Field.h:689
FName NamePrivate
Definition Field.h:606
COREUOBJECT_API bool IsValidLowLevel() const
Definition Field.cpp:517
uint64 GetCastFlags() const
Definition Field.h:726
virtual COREUOBJECT_API void BeginDestroy()
Definition Field.cpp:470
EObjectFlags GetFlags() const
Definition Field.h:683
Definition LinkerLoad.h:124
Definition NameTypes.h:617
CORE_API FString ToString() const
Definition UnrealNames.cpp:3537
CORE_API void AppendString(FWideString &Out) const
Definition UnrealNames.cpp:3717
Definition UnrealType.h:174
Definition UObjectGlobals.h:2492
Definition UnrealString.h.inl:34
FString GetDisplayNameText(const UEnum *Enum, int64 Value, const FString &Fallback)
Definition Collision.cpp:642
Definition FieldSystemNoiseAlgo.cpp:6
bool GIsIncrementalReachabilityPending
Definition GarbageCollection.cpp:620
void MarkAsReachable(const UObject *Obj)
Definition GarbageCollection.cpp:603
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 double Atod(const CharType *String)
Definition CString.h:1191
Definition LinkedListBuilder.h:212
Definition NoDestroy.h:18