Files
UnrealEngine/Engine/Source/Runtime/FieldNotification/Public/FieldNotificationDeclaration.h
2025-05-18 13:04:45 +08:00

251 lines
12 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "FieldNotificationId.h"
#include "IFieldNotificationClassDescriptor.h"
/*
* struct FFieldNotificationClassDescriptor : Super::FFieldNotificationClassDescriptor
* {
* private:
* using SuperDescriptor = Super::FFieldNotificationClassDescriptor;
* static const ::UE::FieldNotification::FFieldId* AllFields[];
* friend ThisClass;
* public:
* static const ::UE::FieldNotification::FFieldId FieldA;
* static const ::UE::FieldNotification::FFieldId FieldB;
* enum
* {
* IndexOf_FieldA = Super::FFieldNotificationClassDescriptor::Max_IndexOf_ + 0,
* IndexOf_FieldB,
* Max_IndexOf_,
* };
* virtual void ForEachField(const UClass* Class, TFunctionRef<bool(::UE::FieldNotification::FFieldId FielId)> Callback) const override;
* };
* virtual const ::UE::FieldNotification::IClassDescriptor& GetFieldNotificationDescriptor() const override;
*/
#define UE_FIELD_NOTIFICATION_OVERRIDE_GET_FIELD_NOTIFICATION_DESCRIPTOR() \
virtual const ::UE::FieldNotification::IClassDescriptor& GetFieldNotificationDescriptor() const \
{ \
return FFieldNotificationClassDescriptor::GetDescriptor(); \
}
#define UE_FIELD_NOTIFICATION_DECLARE_CLASS_DESCRIPTOR_BEGIN(API_STRING) \
struct FFieldNotificationClassDescriptor : public Super::FFieldNotificationClassDescriptor \
{ \
private: \
using SuperDescriptor = Super::FFieldNotificationClassDescriptor; \
static API_STRING const ::UE::FieldNotification::FFieldId* AllFields[]; \
static API_STRING const ::UE::FieldNotification::IClassDescriptor& GetDescriptor(); \
friend ThisClass; \
public:
#define UE_FIELD_NOTIFICATION_DECLARE_CLASS_DESCRIPTOR_END() \
virtual void ForEachField(const UClass* Class, TFunctionRef<bool(::UE::FieldNotification::FFieldId FielId)> Callback) const override \
{ \
for (int32 Index = 0; Index < Max_IndexOf_-SuperDescriptor::Max_IndexOf_; ++Index) \
{ \
if (!Callback(*AllFields[Index])) \
{ \
return; \
} \
} \
SuperDescriptor::ForEachField(Class, Callback); \
} \
}; \
UE_FIELD_NOTIFICATION_OVERRIDE_GET_FIELD_NOTIFICATION_DESCRIPTOR()
#define UE_FIELD_NOTIFICATION_DECLARE_CLASS_DESCRIPTOR_BASE_BEGIN(API_STRING) \
struct FFieldNotificationClassDescriptor : public ::UE::FieldNotification::IClassDescriptor \
{ \
private: \
using SuperDescriptor = ::UE::FieldNotification::IClassDescriptor; \
static API_STRING const ::UE::FieldNotification::FFieldId* AllFields[]; \
static API_STRING const ::UE::FieldNotification::IClassDescriptor& GetDescriptor(); \
friend ThisClass; \
public: \
API_STRING virtual void ForEachField(const UClass* Class, TFunctionRef<bool(::UE::FieldNotification::FFieldId FielId)> Callback) const override; \
#define UE_FIELD_NOTIFICATION_DECLARE_CLASS_DESCRIPTOR_BASE_END() \
}; \
UE_FIELD_NOTIFICATION_OVERRIDE_GET_FIELD_NOTIFICATION_DESCRIPTOR()
#define UE_FIELD_NOTIFICATION_DECLARE_ENUM_FIELD_BEGIN(Name) \
enum EField \
{ \
IndexOf_##Name = SuperDescriptor::Max_IndexOf_ + 0,
#define UE_FIELD_NOTIFICATION_DECLARE_ENUM_FIELD_END() \
Max_IndexOf_, \
};
#define UE_FIELD_NOTIFICATION_DECLARE_FIELD(Name, API_STRING) \
static API_STRING const ::UE::FieldNotification::FFieldId Name;
#define UE_FIELD_NOTIFICATION_DECLARE_ENUM_FIELD(Name) \
IndexOf_##Name,
#define UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
const ::UE::FieldNotification::IClassDescriptor& ClassName::FFieldNotificationClassDescriptor::GetDescriptor() \
{ \
static FFieldNotificationClassDescriptor Instance; \
return Instance; \
} \
const ::UE::FieldNotification::FFieldId* ClassName::FFieldNotificationClassDescriptor::AllFields[] = {
#define UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName) }
//#if DO_CHECK
//#define UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName) \
// }; \
// const ::UE::FieldNotification::IClassDescriptor& ClassName::GetFieldNotificationDescriptor() const \
// { \
// static_assert(UE_ARRAY_COUNT(ClassName::FFieldNotificationClassDescriptor::AllFields) == ClassName::FFieldNotificationClassDescriptor::Max_IndexOf_-ClassName::FFieldNotificationClassDescriptor::SuperDescriptor::Max_IndexOf_, "The descriptor for class " #ClassName " doesn't not implement the same number of field as declared in in the constructor."); \
// struct FLocal \
// { \
// ClassName::FFieldNotificationClassDescriptor Instance; \
// FLocal() \
// { \
// int32 NumberOfField = Instance.GetNumberOfField(); \
// for (int32 Index = 0; Index < NumberOfField; ++Index) \
// { \
// ::UE::FieldNotification::FFieldId Id = Instance.GetField(Index); \
// ensureAlwaysMsgf(Id.IsValid(), TEXT("The FFieldId '%d' for the class '%s' is invalid"), Index, *ClassName::StaticClass()->GetName()); \
// ensureAlwaysMsgf(Id.GetIndex() == Index, TEXT("The FFieldId at index '%d' doesn't match the id index '%d'."), Index, Id.GetIndex()); \
// } \
// } \
// }; \
// static FLocal Local; \
// return Local.Instance; \
// }
//#else
//#define UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName) \
// }; \
// const ::UE::FieldNotification::IClassDescriptor& ClassName::GetFieldNotificationDescriptor() const \
// { \
// static FFieldNotificationClassDescriptor Instance; \
// return Instance; \
// }
//#endif
#define UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, MemberName) const ::UE::FieldNotification::FFieldId ClassName::FFieldNotificationClassDescriptor::MemberName( FName(TEXT(#MemberName)), ClassName::FFieldNotificationClassDescriptor::IndexOf_##MemberName );
#define UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, MemberName) &ClassName::FFieldNotificationClassDescriptor::MemberName,
#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_OneField(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_TwoFields(ClassName, Field1, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_ThreeFields(ClassName, Field1, Field2, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_FourFields(ClassName, Field1, Field2, Field3, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_FiveFields(ClassName, Field1, Field2, Field3, Field4, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_SixFields(ClassName, Field1, Field2, Field3, Field4, Field5, Field6) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field6) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field6) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_SevenFields(ClassName, Field1, Field2, Field3, Field4, Field5, Field6, Field7) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field6) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field7) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field6) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field7) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_EightFields(ClassName, Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field6) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field7) \
UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field8) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field5) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field6) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field7) \
UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field8) \
UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)