UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
FieldNotificationDeclaration.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7
8
9/*
10 * struct FFieldNotificationClassDescriptor : Super::FFieldNotificationClassDescriptor
11 * {
12 * private:
13 * using SuperDescriptor = Super::FFieldNotificationClassDescriptor;
14 * static const ::UE::FieldNotification::FFieldId* AllFields[];
15 * friend ThisClass;
16 * public:
17 * static const ::UE::FieldNotification::FFieldId FieldA;
18 * static const ::UE::FieldNotification::FFieldId FieldB;
19 * enum
20 * {
21 * IndexOf_FieldA = Super::FFieldNotificationClassDescriptor::Max_IndexOf_ + 0,
22 * IndexOf_FieldB,
23 * Max_IndexOf_,
24 * };
25 * virtual void ForEachField(const UClass* Class, TFunctionRef<bool(::UE::FieldNotification::FFieldId FielId)> Callback) const override;
26 * };
27 * virtual const ::UE::FieldNotification::IClassDescriptor& GetFieldNotificationDescriptor() const override;
28 */
29
30#define UE_FIELD_NOTIFICATION_OVERRIDE_GET_FIELD_NOTIFICATION_DESCRIPTOR() \
31 virtual const ::UE::FieldNotification::IClassDescriptor& GetFieldNotificationDescriptor() const \
32 { \
33 return FFieldNotificationClassDescriptor::GetDescriptor(); \
34 }
35
36#define UE_FIELD_NOTIFICATION_DECLARE_CLASS_DESCRIPTOR_BEGIN(API_STRING) \
37 struct FFieldNotificationClassDescriptor : public Super::FFieldNotificationClassDescriptor \
38 { \
39 private: \
40 using SuperDescriptor = Super::FFieldNotificationClassDescriptor; \
41 static API_STRING const ::UE::FieldNotification::FFieldId* AllFields[]; \
42 static API_STRING const ::UE::FieldNotification::IClassDescriptor& GetDescriptor(); \
43 friend ThisClass; \
44 public:
45
46
47#define UE_FIELD_NOTIFICATION_DECLARE_CLASS_DESCRIPTOR_END() \
48 virtual void ForEachField(const UClass* Class, TFunctionRef<bool(::UE::FieldNotification::FFieldId FielId)> Callback) const override \
49 { \
50 for (int32 Index = 0; Index < Max_IndexOf_-SuperDescriptor::Max_IndexOf_; ++Index) \
51 { \
52 if (!Callback(*AllFields[Index])) \
53 { \
54 return; \
55 } \
56 } \
57 SuperDescriptor::ForEachField(Class, Callback); \
58 } \
59 }; \
60 UE_FIELD_NOTIFICATION_OVERRIDE_GET_FIELD_NOTIFICATION_DESCRIPTOR()
61
62
63#define UE_FIELD_NOTIFICATION_DECLARE_CLASS_DESCRIPTOR_BASE_BEGIN(API_STRING) \
64 struct FFieldNotificationClassDescriptor : public ::UE::FieldNotification::IClassDescriptor \
65 { \
66 private: \
67 using SuperDescriptor = ::UE::FieldNotification::IClassDescriptor; \
68 static API_STRING const ::UE::FieldNotification::FFieldId* AllFields[]; \
69 static API_STRING const ::UE::FieldNotification::IClassDescriptor& GetDescriptor(); \
70 friend ThisClass; \
71 public: \
72 API_STRING virtual void ForEachField(const UClass* Class, TFunctionRef<bool(::UE::FieldNotification::FFieldId FielId)> Callback) const override; \
73
74
75#define UE_FIELD_NOTIFICATION_DECLARE_CLASS_DESCRIPTOR_BASE_END() \
76 }; \
77 UE_FIELD_NOTIFICATION_OVERRIDE_GET_FIELD_NOTIFICATION_DESCRIPTOR()
78
79
80#define UE_FIELD_NOTIFICATION_DECLARE_ENUM_FIELD_BEGIN(Name) \
81 enum EField \
82 { \
83 IndexOf_##Name = SuperDescriptor::Max_IndexOf_ + 0,
84
85
86#define UE_FIELD_NOTIFICATION_DECLARE_ENUM_FIELD_END() \
87 Max_IndexOf_, \
88 };
89
90
91#define UE_FIELD_NOTIFICATION_DECLARE_FIELD(Name, API_STRING) \
92 static API_STRING const ::UE::FieldNotification::FFieldId Name;
93
94
95#define UE_FIELD_NOTIFICATION_DECLARE_ENUM_FIELD(Name) \
96 IndexOf_##Name,
97
98
99#define UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
100 const ::UE::FieldNotification::IClassDescriptor& ClassName::FFieldNotificationClassDescriptor::GetDescriptor() \
101 { \
102 static FFieldNotificationClassDescriptor Instance; \
103 return Instance; \
104 } \
105 const ::UE::FieldNotification::FFieldId* ClassName::FFieldNotificationClassDescriptor::AllFields[] = {
106
107
108#define UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName) }
109
110//#if DO_CHECK
111//#define UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName) \
112// }; \
113// const ::UE::FieldNotification::IClassDescriptor& ClassName::GetFieldNotificationDescriptor() const \
114// { \
115// 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."); \
116// struct FLocal \
117// { \
118// ClassName::FFieldNotificationClassDescriptor Instance; \
119// FLocal() \
120// { \
121// int32 NumberOfField = Instance.GetNumberOfField(); \
122// for (int32 Index = 0; Index < NumberOfField; ++Index) \
123// { \
124// ::UE::FieldNotification::FFieldId Id = Instance.GetField(Index); \
125// ensureAlwaysMsgf(Id.IsValid(), TEXT("The FFieldId '%d' for the class '%s' is invalid"), Index, *ClassName::StaticClass()->GetName()); \
126// ensureAlwaysMsgf(Id.GetIndex() == Index, TEXT("The FFieldId at index '%d' doesn't match the id index '%d'."), Index, Id.GetIndex()); \
127// } \
128// } \
129// }; \
130// static FLocal Local; \
131// return Local.Instance; \
132// }
133//#else
134//#define UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName) \
135// }; \
136// const ::UE::FieldNotification::IClassDescriptor& ClassName::GetFieldNotificationDescriptor() const \
137// { \
138// static FFieldNotificationClassDescriptor Instance; \
139// return Instance; \
140// }
141//#endif
142
143
144#define UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, MemberName) const ::UE::FieldNotification::FFieldId ClassName::FFieldNotificationClassDescriptor::MemberName( FName(TEXT(#MemberName)), ClassName::FFieldNotificationClassDescriptor::IndexOf_##MemberName );
145#define UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, MemberName) &ClassName::FFieldNotificationClassDescriptor::MemberName,
146
147
148#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_OneField(ClassName, Field1) \
149 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
150 UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
151 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
152 UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
153
154#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_TwoFields(ClassName, Field1, Field2) \
155 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
156 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
157 UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
158 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
159 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
160 UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
161
162#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_ThreeFields(ClassName, Field1, Field2, Field3) \
163 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
164 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
165 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
166 UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
167 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
168 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
169 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
170 UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
171
172#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_FourFields(ClassName, Field1, Field2, Field3, Field4) \
173 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
174 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
175 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
176 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
177 UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
178 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
179 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
180 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
181 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
182 UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
183
184#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_FiveFields(ClassName, Field1, Field2, Field3, Field4, Field5) \
185 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
186 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
187 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
188 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
189 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field5) \
190 UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
191 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
192 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
193 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
194 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
195 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field5) \
196 UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
197
198#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_SixFields(ClassName, Field1, Field2, Field3, Field4, Field5, Field6) \
199 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
200 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
201 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
202 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
203 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field5) \
204 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field6) \
205 UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
206 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
207 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
208 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
209 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
210 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field5) \
211 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field6) \
212 UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
213
214#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_SevenFields(ClassName, Field1, Field2, Field3, Field4, Field5, Field6, Field7) \
215 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
216 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
217 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
218 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
219 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field5) \
220 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field6) \
221 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field7) \
222 UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
223 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
224 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
225 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
226 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
227 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field5) \
228 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field6) \
229 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field7) \
230 UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)
231
232#define UE_FIELD_NOTIFICATION_IMPLEMENT_CLASS_DESCRIPTOR_EightFields(ClassName, Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8) \
233 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field1) \
234 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field2) \
235 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field3) \
236 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field4) \
237 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field5) \
238 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field6) \
239 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field7) \
240 UE_FIELD_NOTIFICATION_IMPLEMENT_FIELD(ClassName, Field8) \
241 UE_FIELD_NOTIFICATION_IMPLEMENTATION_BEGIN(ClassName) \
242 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field1) \
243 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field2) \
244 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field3) \
245 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field4) \
246 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field5) \
247 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field6) \
248 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field7) \
249 UE_FIELD_NOTIFICATION_IMPLEMENT_ENUM_FIELD(ClassName, Field8) \
250 UE_FIELD_NOTIFICATION_IMPLEMENTATION_END(ClassName)