UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
NetSerializerBuilder.inl
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
9
10namespace UE::Net
11{
12
13template<NetSerializeFunction Serialize>
14void
19
20template<NetDeserializeFunction Deserialize>
21void
26
27template<NetSerializeFunction Serialize, NetIsEqualFunction IsEqual>
28void
30{
33 EqualArgs.NetSerializerConfig = Args.NetSerializerConfig;
34 EqualArgs.Source0 = Args.Source;
35 EqualArgs.Source1 = Args.Prev;
36 EqualArgs.bStateIsQuantized = true;
37
38 if (Context.GetBitStreamWriter()->WriteBool(IsEqual(Context, EqualArgs)))
39 {
40 return;
41 }
42
43 Serialize(Context, Args);
44};
45
46template<uint32 QuantizedTypeSize, NetDeserializeFunction Deserialize, NetFreeDynamicStateFunction FreeDynamicState, NetCloneDynamicStateFunction CloneDynamicState>
47void
49{
50 if (Context.GetBitStreamReader()->ReadBool())
51 {
52 // Clone from prev. Need to free target first.
53 if (FreeDynamicState != NetFreeDynamicStateFunction(nullptr))
54 {
56 FreeArgs.Version = 0;
57 FreeArgs.NetSerializerConfig = Args.NetSerializerConfig;
58 FreeArgs.Source = Args.Target;
59
60 FreeDynamicState(Context, FreeArgs);
61 }
62
63 FMemory::Memcpy(reinterpret_cast<uint8*>(Args.Target), reinterpret_cast<uint8*>(Args.Prev), QuantizedTypeSize);
64
65 if (CloneDynamicState != NetCloneDynamicStateFunction(nullptr))
66 {
69 CloneArgs.NetSerializerConfig = Args.NetSerializerConfig;
70 CloneArgs.Source = Args.Prev;
71 CloneArgs.Target = Args.Target;
72
73 CloneDynamicState(Context, CloneArgs);
74 }
75
76 return;
77 }
78
79 Deserialize(Context, Args);
80}
81
82template<typename T>
83void
85{
86 *reinterpret_cast<T*>(Args.Target) = *reinterpret_cast<const T*>(Args.Source);
87}
88
89template<typename T>
90void
92{
93 *reinterpret_cast<T*>(Args.Target) = *reinterpret_cast<const T*>(Args.Source);
94}
95
96template<typename T>
97bool
99{
100 return *reinterpret_cast<const T*>(Args.Source0) == *reinterpret_cast<const T*>(Args.Source1);
101}
102
103template<typename T = void>
104bool
106{
107 return true;
108}
109
110template<typename NetSerializerImpl>
112{
113private:
114 enum class ETrueType : unsigned
115 {
116 Value = 1
117 };
118
119 enum class EFalseType : unsigned
120 {
121 Value = 0
122 };
123
124 struct FVersion
125 {
126 static constexpr uint32 Version = 0;
127 };
128
129 struct FTraits
130 {
131 static constexpr bool bIsForwardingSerializer = false;
132 static constexpr bool bHasConnectionSpecificSerialization = false;
133 static constexpr bool bHasCustomNetReference = false;
134 static constexpr bool bHasDynamicState = false;
135 static constexpr bool bUseDefaultDelta = true;
136 static constexpr bool bUseSerializerIsEqual = false;
137 };
138
139 template<typename U, U> struct FSignatureCheck;
140 template<typename> struct FTypeCheck;
141
142 // Version check
143 template<typename U> static ETrueType TestHasVersion(typename TEnableIf<std::is_same_v<decltype(&FVersion::Version), decltype(&U::Version)>>::Type*);
144 template<typename> static EFalseType TestHasVersion(...);
145
146 // Traits
147 template<typename U> static ETrueType TestHasCustomNetReferenceIsPresent(FTypeCheck<decltype(&U::bHasCustomNetReference)>*);
148 template<typename> static EFalseType TestHasCustomNetReferenceIsPresent(...);
149
150 template<typename U> static ETrueType TestHasCustomNetReferenceIsBool(typename TEnableIf<std::is_same_v<decltype(&FTraits::bHasCustomNetReference), decltype(&U::bHasCustomNetReference)>>::Type*);
151 template<typename> static EFalseType TestHasCustomNetReferenceIsBool(...);
152
153 template<typename U> static ETrueType TestUseSerializerIsEqualIsPresent(FTypeCheck<decltype(&U::bUseSerializerIsEqual)>*);
154 template<typename> static EFalseType TestUseSerializerIsEqualIsPresent(...);
155
156 template<typename U> static ETrueType TestUseSerializerIsEqualIsBool(typename TEnableIf<std::is_same_v<decltype(&FTraits::bUseSerializerIsEqual), decltype(&U::bUseSerializerIsEqual)>>::Type*);
157 template<typename> static EFalseType TestUseSerializerIsEqualIsBool(...);
158
159 template<typename U> static ETrueType TestIsForwardingSerializerIsPresent(FTypeCheck<decltype(&U::bIsForwardingSerializer)>*);
160 template<typename> static EFalseType TestIsForwardingSerializerIsPresent(...);
161
162 template<typename U> static ETrueType TestIsForwardingSerializerIsBool(typename TEnableIf<std::is_same_v<decltype(&FTraits::bIsForwardingSerializer), decltype(&U::bIsForwardingSerializer)>>::Type*);
163 template<typename> static EFalseType TestIsForwardingSerializerIsBool(...);
164
165 template<typename U> static ETrueType TestHasConnectionSpecificSerializationIsPresent(FTypeCheck<decltype(&U::bHasConnectionSpecificSerialization)>*);
166 template<typename> static EFalseType TestHasConnectionSpecificSerializationIsPresent(...);
167
168 template<typename U> static ETrueType TestHasConnectionSpecificSerializationIsBool(typename TEnableIf<std::is_same_v<decltype(&FTraits::bHasConnectionSpecificSerialization), decltype(&U::bHasConnectionSpecificSerialization)>>::Type*);
169 template<typename> static EFalseType TestHasConnectionSpecificSerializationIsBool(...);
170
171 template<typename U> static ETrueType TestHasDynamicStateIsPresent(FTypeCheck<decltype(&U::bHasDynamicState)>*);
172 template<typename> static EFalseType TestHasDynamicStateIsPresent(...);
173
174 template<typename U> static ETrueType TestHasDynamicStateIsBool(typename TEnableIf<std::is_same_v<decltype(&FTraits::bHasDynamicState), decltype(&U::bHasDynamicState)>>::Type*);
175 template<typename> static EFalseType TestHasDynamicStateIsBool(...);
176
177 template<typename U> static ETrueType TestUseDefaultDeltaIsPresent(FTypeCheck<decltype(&U::bUseDefaultDelta)>*);
178 template<typename> static EFalseType TestUseDefaultDeltaIsPresent(...);
179
180 template<typename U> static ETrueType TestUseDefaultDeltaIsBool(typename TEnableIf<std::is_same_v<decltype(&FTraits::bUseDefaultDelta), decltype(&U::bUseDefaultDelta)>>::Type*);
181 template<typename> static EFalseType TestUseDefaultDeltaIsBool(...);
182
183 // Type checks
184 template<typename U> static ETrueType TestHasConfigType(FTypeCheck<typename U::ConfigType>*);
185 template<typename> static EFalseType TestHasConfigType(...);
186
187 template<typename U> static ETrueType TestHasSourceType(FTypeCheck<typename U::SourceType>*);
188 template<typename> static EFalseType TestHasSourceType(...);
189
190 template<typename U> static ETrueType TestHasQuantizedType(FTypeCheck<typename U::QuantizedType>*);
191 template<typename> static EFalseType TestHasQuantizedType(...);
192
193 template<typename U> static constexpr bool IsSourceTypePod(FTypeCheck<typename U::SourceType>*) { return TIsPODType<typename U::SourceType>::Value; }
194 template<typename> static constexpr bool IsSourceTypePod(...) { return false; }
195
196 template<typename U> static constexpr bool IsQuantizedTypePod(FTypeCheck<typename U::QuantizedType>*) { return TIsPODType<typename U::QuantizedType>::Value; }
197 template<typename> static constexpr bool IsQuantizedTypePod(...) { return false; }
198
199 // Default config check
200 template<typename U> static constexpr bool TestHasDefaultConfig(FTypeCheck<decltype(&U::DefaultConfig)>*) { return true; }
201 template<typename> static constexpr bool TestHasDefaultConfig(...) { return false; }
202
203 // Function checks
204 template<typename U> static ETrueType TestHasSerialize(FSignatureCheck<NetSerializeFunction, &U::Serialize>*);
205 template<typename> static EFalseType TestHasSerialize(...);
206
207 template<typename U> static ETrueType TestHasDeserialize(FSignatureCheck<NetDeserializeFunction, &U::Deserialize>*);
208 template<typename> static EFalseType TestHasDeserialize(...);
209
210 template<typename U> static ETrueType TestHasSerializeDelta(FSignatureCheck<NetSerializeDeltaFunction, &U::SerializeDelta>*);
211 template<typename> static EFalseType TestHasSerializeDelta(...);
212
213 template<typename U> static ETrueType TestHasDeserializeDelta(FSignatureCheck<NetDeserializeDeltaFunction, &U::DeserializeDelta>*);
214 template<typename> static EFalseType TestHasDeserializeDelta(...);
215
216 template<typename U> static ETrueType TestHasQuantize(FSignatureCheck<NetQuantizeFunction, &U::Quantize>*);
217 template<typename> static EFalseType TestHasQuantize(...);
218
219 template<typename U> static ETrueType TestHasDequantize(FSignatureCheck<NetDequantizeFunction, &U::Dequantize>*);
220 template<typename> static EFalseType TestHasDequantize(...);
221
222 template<typename U> static ETrueType TestHasIsEqual(FSignatureCheck<NetIsEqualFunction, &U::IsEqual>*);
223 template<typename> static EFalseType TestHasIsEqual(...);
224
225 template<typename U> static ETrueType TestHasValidate(FSignatureCheck<NetValidateFunction, &U::Validate>*);
226 template<typename> static EFalseType TestHasValidate(...);
227
228 template<typename U> static ETrueType TestHasFreeDynamicState(FSignatureCheck<NetFreeDynamicStateFunction, &U::FreeDynamicState>*);
229 template<typename> static EFalseType TestHasFreeDynamicState(...);
230
231 template<typename U> static ETrueType TestHasCloneDynamicState(FSignatureCheck<NetCloneDynamicStateFunction, &U::CloneDynamicState>*);
232 template<typename> static EFalseType TestHasCloneDynamicState(...);
233
234 template<typename U> static ETrueType TestHasCollectNetReferences(FSignatureCheck<NetCollectNetReferencesFunction, &U::CollectNetReferences>*);
235 template<typename> static EFalseType TestHasCollectNetReferences(...);
236
237 template<typename U> static ETrueType TestHasApply(FSignatureCheck<NetApplyFunction, &U::Apply>*);
238 template<typename> static EFalseType TestHasApply(...);
239
240 enum ETraits : unsigned
241 {
242 HasVersion = unsigned(decltype(TestHasVersion<NetSerializerImpl>(nullptr))::Value),
243
244 HasCustomNetReferenceIsPresent = unsigned(decltype(TestHasCustomNetReferenceIsPresent<NetSerializerImpl>(nullptr))::Value),
245 HasCustomNetReferenceIsBool = unsigned(decltype(TestHasCustomNetReferenceIsBool<NetSerializerImpl>(nullptr))::Value),
246
247 UseSerializerIsEqualIsPresent = unsigned(decltype(TestUseSerializerIsEqualIsPresent<NetSerializerImpl>(nullptr))::Value),
248 UseSerializerIsEqualIsBool = unsigned(decltype(TestUseSerializerIsEqualIsBool<NetSerializerImpl>(nullptr))::Value),
249
250 IsForwardingSerializerIsPresent = unsigned(decltype(TestIsForwardingSerializerIsPresent<NetSerializerImpl>(nullptr))::Value),
251 IsForwardingSerializerIsBool = unsigned(decltype(TestIsForwardingSerializerIsBool<NetSerializerImpl>(nullptr))::Value),
252 HasConnectionSpecificSerializationIsPresent = unsigned(decltype(TestHasConnectionSpecificSerializationIsPresent<NetSerializerImpl>(nullptr))::Value),
253 HasConnectionSpecificSerializationIsBool = unsigned(decltype(TestHasConnectionSpecificSerializationIsBool<NetSerializerImpl>(nullptr))::Value),
254
255 HasDynamicStateIsPresent = unsigned(decltype(TestHasDynamicStateIsPresent<NetSerializerImpl>(nullptr))::Value),
256 HasDynamicStateIsBool = unsigned(decltype(TestHasDynamicStateIsBool<NetSerializerImpl>(nullptr))::Value),
257
258 UseDefaultDeltaIsPresent = unsigned(decltype(TestUseDefaultDeltaIsPresent<NetSerializerImpl>(nullptr))::Value),
259 UseDefaultDeltaIsBool = unsigned(decltype(TestUseDefaultDeltaIsBool<NetSerializerImpl>(nullptr))::Value),
260
261 HasConfigType = unsigned(decltype(TestHasConfigType<NetSerializerImpl>(nullptr))::Value),
262 HasSourceType = unsigned(decltype(TestHasSourceType<NetSerializerImpl>(nullptr))::Value),
263 HasQuantizedType = unsigned(decltype(TestHasQuantizedType<NetSerializerImpl>(nullptr))::Value),
264 SourceTypeIsPod = IsSourceTypePod<NetSerializerImpl>(nullptr),
265 QuantizedTypeIsPod = IsQuantizedTypePod<NetSerializerImpl>(nullptr),
266
267 HasDefaultConfig = TestHasDefaultConfig<NetSerializerImpl>(nullptr),
268
269 HasSerialize = unsigned(decltype(TestHasSerialize<NetSerializerImpl>(nullptr))::Value),
270 HasDeserialize = unsigned(decltype(TestHasDeserialize<NetSerializerImpl>(nullptr))::Value),
271 HasSerializeDelta = unsigned(decltype(TestHasSerializeDelta<NetSerializerImpl>(nullptr))::Value),
272 HasDeserializeDelta = unsigned(decltype(TestHasDeserializeDelta<NetSerializerImpl>(nullptr))::Value),
273 HasQuantize = unsigned(decltype(TestHasQuantize<NetSerializerImpl>(nullptr))::Value),
274 HasDequantize = unsigned(decltype(TestHasDequantize<NetSerializerImpl>(nullptr))::Value),
275 HasIsEqual = unsigned(decltype(TestHasIsEqual<NetSerializerImpl>(nullptr))::Value),
276 HasValidate = unsigned(decltype(TestHasValidate<NetSerializerImpl>(nullptr))::Value),
277 HasFreeDynamicState = unsigned(decltype(TestHasFreeDynamicState<NetSerializerImpl>(nullptr))::Value),
278 HasCloneDynamicState = unsigned(decltype(TestHasCloneDynamicState<NetSerializerImpl>(nullptr))::Value),
279 HasCollectNetReferences = unsigned(decltype(TestHasCollectNetReferences<NetSerializerImpl>(nullptr))::Value),
280 HasApply = unsigned(decltype(TestHasApply<NetSerializerImpl>(nullptr))::Value),
281 };
282
283public:
285 static constexpr uint32 GetVersion() { return NetSerializerImpl::Version; }
286
288 static constexpr uint32 GetVersion() { return ~0U; }
289
291 static constexpr bool HasCustomNetReference() { return NetSerializerImpl::bHasCustomNetReference; }
292
294 static constexpr bool HasCustomNetReference() { return false; }
295
297 static constexpr bool UseSerializerIsEqual() { return NetSerializerImpl::bUseSerializerIsEqual; }
298
299 template<typename T = void, typename U = typename TEnableIf<!(UseSerializerIsEqualIsBool && HasIsEqual), T>::Type, char V = 0>
300 static constexpr bool UseSerializerIsEqual() { return false; }
301
303 static constexpr bool IsForwardingSerializer() { return NetSerializerImpl::bIsForwardingSerializer; }
304
306 static constexpr bool IsForwardingSerializer() { return false; }
307
309 static constexpr bool HasConnectionSpecificSerialization() { return NetSerializerImpl::bHasConnectionSpecificSerialization; }
310
312 static constexpr bool HasConnectionSpecificSerialization() { return false; }
313
315 static constexpr bool HasDynamicState() { return NetSerializerImpl::bHasDynamicState; }
316
318 static constexpr bool HasDynamicState() { return false; }
319
321 static constexpr bool ShouldUseDefaultDelta() { return NetSerializerImpl::bUseDefaultDelta; }
322
324 static constexpr bool ShouldUseDefaultDelta() { return true; }
325
327 static NetSerializeFunction GetSerializeFunction() { return NetSerializerImpl::Serialize; }
328
331
333 static NetDeserializeFunction GetDeserializeFunction() { return NetSerializerImpl::Deserialize; }
334
337
338 // Provide a default SerializeDelta implementation if needed. The default will compare the value with previous value and write an extra bit and forward to Serialize if the value differs
339 // It is possible to opt out by adding static constexpr bool bUseDefaultDelta = false; in the serializer declaration
341 static NetSerializeDeltaFunction GetSerializeDeltaFunction() { return NetSerializerImpl::SerializeDelta; }
342
343 template<typename T = void, typename U = typename TEnableIf<!HasSerializeDelta && !ShouldUseDefaultDelta(), T>::Type, int V = 0>
345
346 template<typename T = void, typename U = typename TEnableIf<!HasSerializeDelta && ShouldUseDefaultDelta() && HasIsEqual, T>::Type, char V = 0>
348
349 template<typename T = void, typename U = typename TEnableIf<!HasSerializeDelta && ShouldUseDefaultDelta() && !HasIsEqual, T>::Type, unsigned char V = 0>
351
352 // Provide a default DeserializeDelta implementation if needed. The default will call Deserialize.
354 static NetDeserializeDeltaFunction GetDeserializeDeltaFunction(const T* = nullptr) { return NetSerializerImpl::DeserializeDelta; }
355
356 template<typename T = void, typename U = typename TEnableIf<!HasDeserializeDelta && !ShouldUseDefaultDelta(), T>::Type, int V = 0>
358
359 template<typename T = void, typename U = typename TEnableIf<!HasDeserializeDelta && ShouldUseDefaultDelta() && (HasCloneDynamicState && HasFreeDynamicState), T>::Type, char V = 0>
360 static NetDeserializeDeltaFunction GetDeserializeDeltaFunction(const void* = nullptr) { return NetDeserializeDeltaDefault<GetQuantizedTypeSize(), NetSerializerImpl::Deserialize, NetSerializerImpl::FreeDynamicState, NetSerializerImpl::CloneDynamicState>; }
361
362 template<typename T = void, typename U = typename TEnableIf<!HasDeserializeDelta && ShouldUseDefaultDelta() && !(HasCloneDynamicState && HasFreeDynamicState), T>::Type, unsigned char V = 0>
364
365 // Provide a default Quantize implementation if needed. The default will copy the value.
367 static NetQuantizeFunction GetQuantizeFunction() { return NetSerializerImpl::Quantize; }
368
371
372 // Provide a default Dequantize implementation if needed. The default will copy the value.
374 static NetDequantizeFunction GetDequantizeFunction() { return NetSerializerImpl::Dequantize; }
375
378
379 // Provide a default IsEqual implementation if needed. The default will call the equality operator.
381 static NetIsEqualFunction GetIsEqualFunction() { return NetSerializerImpl::IsEqual; }
382
385
386 // Provide a default Validate implementation if needed. The default will not perform any validation.
388 static NetValidateFunction GetValidateFunction() { return NetSerializerImpl::Validate; }
389
392
394 static NetCollectNetReferencesFunction GetCollectNetReferencesFunction() { return NetSerializerImpl::CollectNetReferences; }
395
398
400 static NetApplyFunction GetApplyFunction() { return NetSerializerImpl::Apply; }
401
404
405 // CloneDynamicState
406 template<typename T = void, typename U = typename TEnableIf<HasCloneDynamicState && (IsForwardingSerializer() || HasDynamicState()), T>::Type, bool V = true>
407 static NetCloneDynamicStateFunction GetCloneDynamicStateFunction() { return NetSerializerImpl::CloneDynamicState; }
408
409 template<typename T = void, typename U = typename TEnableIf<!(HasCloneDynamicState && (IsForwardingSerializer() || HasDynamicState())), T>::Type, char V = 0>
411
412 // FreeDynamicState
413 template<typename T = void, typename U = typename TEnableIf<HasFreeDynamicState && (IsForwardingSerializer() || HasDynamicState()), T>::Type, bool V = true>
414 static NetFreeDynamicStateFunction GetFreeDynamicStateFunction() { return NetSerializerImpl::FreeDynamicState; }
415
416 template<typename T = void, typename U = typename TEnableIf<!(HasFreeDynamicState && (IsForwardingSerializer() || HasDynamicState())), T>::Type, char V = 0>
418
419 // DefaultConfig
421 static const FNetSerializerConfig* GetDefaultConfig() { return &NetSerializerImpl::DefaultConfig; }
422
423 template<typename T = void, typename U = typename TEnableIf<!(HasConfigType && HasDefaultConfig), T>::Type, char V = 0>
424 static constexpr FNetSerializerConfig* GetDefaultConfig() { return nullptr; }
425
426 // Type sizes and alignments
428 static constexpr uint32 GetConfigTypeSize() { return sizeof(typename NetSerializerImpl::ConfigType); }
429
431 static constexpr uint32 GetConfigTypeSize() { return 0; }
432
434 static constexpr uint32 GetConfigTypeAlignment() { return alignof(typename NetSerializerImpl::ConfigType); }
435
437 static constexpr uint32 GetConfigTypeAlignment() { return 1; }
438
440 static constexpr uint32 GetQuantizedTypeSize() { return sizeof(typename NetSerializerImpl::QuantizedType); }
441
443 static constexpr uint32 GetQuantizedTypeSize() { return std::is_same_v<void, typename NetSerializerImpl::SourceType> ? uint32(0) : sizeof(std::conditional_t<std::is_same_v<void, typename NetSerializerImpl::SourceType>, uint8, typename NetSerializerImpl::SourceType>); }
444
445 template<typename T = void, typename U = typename TEnableIf<!(HasSourceType || HasQuantizedType), T>::Type, char V = 0>
446 static constexpr uint32 GetQuantizedTypeSize() { return 0; }
447
449 static constexpr uint32 GetQuantizedTypeAlignment() { return alignof(typename NetSerializerImpl::QuantizedType); }
450
452 static constexpr uint32 GetQuantizedTypeAlignment() { return alignof(std::conditional_t<std::is_same_v<void, typename NetSerializerImpl::SourceType>, uint8, typename NetSerializerImpl::SourceType>); }
453
454 template<typename T = void, typename U = typename TEnableIf<!(HasSourceType || HasQuantizedType), T>::Type, char V = 0>
455 static constexpr uint32 GetQuantizedTypeAlignment() { return 1; }
456
469
470 static void Validate()
471 {
472 static_assert(HasVersion, "FNetSerializer must have a 'static constexpr uint32 Version' member.");
473
474 static_assert(!IsForwardingSerializerIsPresent || IsForwardingSerializerIsBool, "FNetSerializer bIsForwardingSerializer member should be declared as 'static constexpr bool bIsForwardingSerializer'.");
475 static_assert(!HasConnectionSpecificSerializationIsPresent || HasConnectionSpecificSerializationIsBool, "FNetSerializer bHasConnectionSpecificSerialization member should be declared as 'static constexpr bool bHasConnectionSpecificSerialization'.");
476 static_assert(!HasCustomNetReferenceIsPresent || HasCustomNetReferenceIsBool, "FNetSerializer bHasCustomNetReference member should be declared as 'static constexpr bool bHasCustomNetReference'.");
477 static_assert(!HasDynamicStateIsPresent || HasDynamicStateIsBool, "FNetSerializer bHasDynamicState member should be declared as 'static constexpr bool bHasDynamicState'.");
478
479 static_assert(HasConfigType, "FNetSerializer must have a ConfigType.");
480 static_assert(GetConfigTypeSize() <= TNumericLimits<decltype(FNetSerializer::ConfigTypeSize)>::Max() , "FNetSerializer NetSerializerConfig type is too large.");
481 static_assert(GetConfigTypeAlignment() <= TNumericLimits<decltype(FNetSerializer::ConfigTypeAlignment)>::Max() , "FNetSerializer NetSerializerConfig type has too large alignment requirements.");
482
483 static_assert(HasSourceType, "FNetSerializer must have a SourceType.");
484 static_assert(!HasQuantizedType || QuantizedTypeIsPod, "QuantizedType in FNetSerializer must be POD.");
485 static_assert(GetQuantizedTypeSize() <= TNumericLimits<decltype(FNetSerializer::QuantizedTypeSize)>::Max() , "FNetSerializer quantized type is too large.");
486 static_assert(GetQuantizedTypeAlignment() <= TNumericLimits<decltype(FNetSerializer::QuantizedTypeAlignment)>::Max() , "FNetSerializer quantized type has too large alignment requirements.");
487
488 static_assert(HasSerialize, "FNetSerializer must implement Serialize.");
489 static_assert(HasDeserialize, "FNetSerializer must implement Deserialize.");
490
491 static_assert(HasSerializeDelta == HasDeserializeDelta, "FNetSerializer should implement both SerializeDelta and DeserializeDelta or none of them.");
492
493 static_assert(HasQuantize || SourceTypeIsPod, "FNetSerializer must implement Quantize and Dequantize when SourceType isn't POD.");
494 static_assert(!HasQuantizedType || (HasQuantize && HasDequantize), "FNetSerializer must implement Quantize and Dequantize when it has a QuantizedType.");
495 static_assert(HasQuantize == HasDequantize, "FNetSerializer must implement both Quantize and Dequantize or none of them.");
496 static_assert(!HasQuantize || HasIsEqual, "FNetSerializer must implement IsEqual when it has Quantize.");
497
498 static_assert(!HasCustomNetReference() || (HasCustomNetReference() && HasCollectNetReferences), "FNetSerializer with bHasCustomNetReference = true must implement CollectNetReferences method.");
499
500 static_assert(!HasDynamicStateIsBool || (HasFreeDynamicState && HasCloneDynamicState), "FNetSerializer must implement CloneDynamicState and FreeDynamicState when it has dynamic state.");
501
502 static_assert(!UseDefaultDeltaIsPresent || UseDefaultDeltaIsBool, "FNetSerializer bUseDefaultDelta member should be declared as 'static constexpr bool bUseDefaultDelta'.");
503
504 ValidateForwardingSerializer();
505 }
506
507private:
508 template<typename T = void, typename U = typename TEnableIf<IsForwardingSerializer(), T>::Type, bool V = true>
509 static void ValidateForwardingSerializer()
510 {
511 static_assert(HasSerialize, "Forwarding FNetSerializer must implement Serialize.");
512 static_assert(HasDeserialize, "Forwarding FNetSerializer must implement Deserialize.");
513 static_assert(HasSerializeDelta, "Forwarding FNetSerializer must implement SerializeDelta.");
514 static_assert(HasDeserializeDelta, "Forwarding FNetSerializer must implement DeserializeDelta.");
515 static_assert(HasQuantize, "Forwarding FNetSerializer must implement Quantize.");
516 static_assert(HasDequantize, "Forwarding FNetSerializer must implement Dequantize.");
517 static_assert(HasIsEqual, "Forwarding FNetSerializer must implement IsEqual.");
518 static_assert(HasValidate, "Forwarding FNetSerializer must implement Validate.");
519 static_assert(HasCloneDynamicState, "Forwarding FNetSerializer must implement CloneDynamicState.");
520 static_assert(HasFreeDynamicState, "Forwarding FNetSerializer must implement FreeDynamicState.");
521 static_assert(HasCollectNetReferences, "Forwarding FNetSerializer must implement CollectNetReferences.");
522 }
523
524 template<typename T = void, typename U = typename TEnableIf<!IsForwardingSerializer(), T>::Type, char V = 0>
525 static void ValidateForwardingSerializer()
526 {
527 }
528};
529
530}
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
bool IsEqual(TRangeBound< FFrameNumber > A, TRangeBound< FFrameNumber > B)
Definition MovieSceneTransformTests.cpp:15
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition EnableIf.h:20
Definition NetSerializationContext.h:31
Definition NetSerializerBuilder.inl:112
static NetIsEqualFunction GetIsEqualFunction()
Definition NetSerializerBuilder.inl:381
static constexpr uint32 GetConfigTypeSize()
Definition NetSerializerBuilder.inl:428
static NetQuantizeFunction GetQuantizeFunction()
Definition NetSerializerBuilder.inl:367
static constexpr uint32 GetQuantizedTypeAlignment()
Definition NetSerializerBuilder.inl:455
static constexpr bool UseSerializerIsEqual()
Definition NetSerializerBuilder.inl:297
static NetCollectNetReferencesFunction GetCollectNetReferencesFunction()
Definition NetSerializerBuilder.inl:394
static NetDeserializeDeltaFunction GetDeserializeDeltaFunction(const T *=nullptr)
Definition NetSerializerBuilder.inl:354
static const FNetSerializerConfig * GetDefaultConfig()
Definition NetSerializerBuilder.inl:421
static NetDeserializeDeltaFunction GetDeserializeDeltaFunction(const void *=nullptr)
Definition NetSerializerBuilder.inl:357
static constexpr bool HasCustomNetReference()
Definition NetSerializerBuilder.inl:291
static constexpr uint32 GetQuantizedTypeAlignment()
Definition NetSerializerBuilder.inl:449
static constexpr bool HasConnectionSpecificSerialization()
Definition NetSerializerBuilder.inl:309
static void Validate()
Definition NetSerializerBuilder.inl:470
static NetSerializeDeltaFunction GetSerializeDeltaFunction()
Definition NetSerializerBuilder.inl:341
static NetValidateFunction GetValidateFunction()
Definition NetSerializerBuilder.inl:388
static NetSerializeFunction GetSerializeFunction()
Definition NetSerializerBuilder.inl:327
static constexpr ENetSerializerTraits GetTraits()
Definition NetSerializerBuilder.inl:457
static constexpr uint32 GetQuantizedTypeSize()
Definition NetSerializerBuilder.inl:446
static NetDeserializeFunction GetDeserializeFunction()
Definition NetSerializerBuilder.inl:333
static constexpr uint32 GetVersion()
Definition NetSerializerBuilder.inl:285
static NetFreeDynamicStateFunction GetFreeDynamicStateFunction()
Definition NetSerializerBuilder.inl:414
static constexpr bool ShouldUseDefaultDelta()
Definition NetSerializerBuilder.inl:321
static constexpr bool IsForwardingSerializer()
Definition NetSerializerBuilder.inl:303
static constexpr uint32 GetQuantizedTypeSize()
Definition NetSerializerBuilder.inl:440
static NetCloneDynamicStateFunction GetCloneDynamicStateFunction()
Definition NetSerializerBuilder.inl:407
static constexpr FNetSerializerConfig * GetDefaultConfig()
Definition NetSerializerBuilder.inl:424
static NetDequantizeFunction GetDequantizeFunction()
Definition NetSerializerBuilder.inl:374
static constexpr bool HasDynamicState()
Definition NetSerializerBuilder.inl:315
static constexpr uint32 GetConfigTypeAlignment()
Definition NetSerializerBuilder.inl:434
static NetApplyFunction GetApplyFunction()
Definition NetSerializerBuilder.inl:400
Definition NetworkVersion.cpp:28
void(* NetQuantizeFunction)(FNetSerializationContext &, const FNetQuantizeArgs &)
Definition NetSerializer.h:249
bool NetValidateDefault(FNetSerializationContext &Context, const FNetValidateArgs &Args)
Definition NetSerializerBuilder.inl:105
void(* NetCloneDynamicStateFunction)(FNetSerializationContext &, const FNetCloneDynamicStateArgs &)
Definition NetSerializer.h:314
void(* NetSerializeDeltaFunction)(FNetSerializationContext &, const FNetSerializeDeltaArgs &)
Definition NetSerializer.h:211
void(* NetDequantizeFunction)(FNetSerializationContext &, const FNetDequantizeArgs &)
Definition NetSerializer.h:265
void(* NetFreeDynamicStateFunction)(FNetSerializationContext &, const FNetFreeDynamicStateArgs &)
Definition NetSerializer.h:329
bool(* NetValidateFunction)(FNetSerializationContext &, const FNetValidateArgs &)
Definition NetSerializer.h:296
void NetSerializeDeltaDefault(FNetSerializationContext &Context, const FNetSerializeDeltaArgs &Args)
Definition NetSerializerBuilder.inl:15
void NetDeserializeDeltaDefault(FNetSerializationContext &Context, const FNetDeserializeDeltaArgs &Args)
Definition NetSerializerBuilder.inl:22
ENetSerializerTraits
Definition NetSerializer.h:347
bool(* NetIsEqualFunction)(FNetSerializationContext &, const FNetIsEqualArgs &)
Definition NetSerializer.h:282
void(* NetCollectNetReferencesFunction)(FNetSerializationContext &, const FNetCollectReferencesArgs &)
Definition NetSerializer.h:176
bool NetIsEqualDefault(FNetSerializationContext &Context, const FNetIsEqualArgs &Args)
Definition NetSerializerBuilder.inl:98
void(* NetDeserializeFunction)(FNetSerializationContext &, const FNetDeserializeArgs &)
Definition NetSerializer.h:197
void(* NetApplyFunction)(FNetSerializationContext &, const FNetApplyArgs &)
Definition NetSerializer.h:339
void NetQuantizeDefault(FNetSerializationContext &Context, const FNetQuantizeArgs &Args)
Definition NetSerializerBuilder.inl:84
void NetDequantizeDefault(FNetSerializationContext &Context, const FNetDequantizeArgs &Args)
Definition NetSerializerBuilder.inl:91
@ Max
Definition EscalationStates.h:607
void(* NetDeserializeDeltaFunction)(FNetSerializationContext &, const FNetDeserializeDeltaArgs &)
Definition NetSerializer.h:226
void(* NetSerializeFunction)(FNetSerializationContext &, const FNetSerializeArgs &)
Definition NetSerializer.h:187
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition NetSerializerConfig.h:17
Definition IsPODType.h:12
Definition NumericLimits.h:41
Definition NetSerializer.h:308
Definition NetSerializer.h:259
NetSerializerValuePointer Source
Definition NetSerializer.h:261
NetSerializerValuePointer Target
Definition NetSerializer.h:263
NetSerializerValuePointer Target
Definition NetSerializer.h:195
Definition NetSerializer.h:222
NetSerializerValuePointer Prev
Definition NetSerializer.h:224
Definition NetSerializer.h:325
Definition NetSerializer.h:274
NetSerializerValuePointer Source1
Definition NetSerializer.h:278
NetSerializerValuePointer Source0
Definition NetSerializer.h:276
Definition NetSerializer.h:243
NetSerializerValuePointer Target
Definition NetSerializer.h:247
NetSerializerValuePointer Source
Definition NetSerializer.h:245
NetSerializerValuePointer Source
Definition NetSerializer.h:185
Definition NetSerializer.h:207
NetSerializerValuePointer Prev
Definition NetSerializer.h:209
NetSerializerConfigParam NetSerializerConfig
Definition NetSerializer.h:157
uint32 Version
Definition NetSerializer.h:161
uint16 ConfigTypeSize
Definition NetSerializer.h:396
uint16 QuantizedTypeSize
Definition NetSerializer.h:394
uint16 ConfigTypeAlignment
Definition NetSerializer.h:397
uint16 QuantizedTypeAlignment
Definition NetSerializer.h:395
Definition NetSerializer.h:292