13template<NetSerializeFunction Serialize>
20template<NetDeserializeFunction Deserialize>
27template<NetSerializeFunction Serialize, NetIsEqualFunction IsEqual>
46template<u
int32 QuantizedTypeSize, NetDeserializeFunction Deserialize, NetFreeDynamicStateFunction FreeDynamicState, NetCloneDynamicStateFunction CloneDynamicState>
50 if (
Context.GetBitStreamReader()->ReadBool())
86 *
reinterpret_cast<T*
>(Args.
Target) = *
reinterpret_cast<const T*
>(Args.
Source);
93 *
reinterpret_cast<T*
>(Args.
Target) = *
reinterpret_cast<const T*
>(Args.
Source);
100 return *
reinterpret_cast<const T*
>(Args.
Source0) == *
reinterpret_cast<const T*
>(Args.
Source1);
103template<
typename T =
void>
110template<
typename NetSerializerImpl>
114 enum class ETrueType :
unsigned
119 enum class EFalseType :
unsigned
126 static constexpr uint32 Version = 0;
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;
139 template<
typename U, U>
struct FSignatureCheck;
140 template<
typename>
struct FTypeCheck;
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(...);
147 template<
typename U>
static ETrueType TestHasCustomNetReferenceIsPresent(FTypeCheck<
decltype(&U::bHasCustomNetReference)>*);
148 template<
typename>
static EFalseType TestHasCustomNetReferenceIsPresent(...);
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(...);
153 template<
typename U>
static ETrueType TestUseSerializerIsEqualIsPresent(FTypeCheck<
decltype(&U::bUseSerializerIsEqual)>*);
154 template<
typename>
static EFalseType TestUseSerializerIsEqualIsPresent(...);
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(...);
159 template<
typename U>
static ETrueType TestIsForwardingSerializerIsPresent(FTypeCheck<
decltype(&U::bIsForwardingSerializer)>*);
160 template<
typename>
static EFalseType TestIsForwardingSerializerIsPresent(...);
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(...);
165 template<
typename U>
static ETrueType TestHasConnectionSpecificSerializationIsPresent(FTypeCheck<
decltype(&U::bHasConnectionSpecificSerialization)>*);
166 template<
typename>
static EFalseType TestHasConnectionSpecificSerializationIsPresent(...);
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(...);
171 template<
typename U>
static ETrueType TestHasDynamicStateIsPresent(FTypeCheck<
decltype(&U::bHasDynamicState)>*);
172 template<
typename>
static EFalseType TestHasDynamicStateIsPresent(...);
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(...);
177 template<
typename U>
static ETrueType TestUseDefaultDeltaIsPresent(FTypeCheck<
decltype(&U::bUseDefaultDelta)>*);
178 template<
typename>
static EFalseType TestUseDefaultDeltaIsPresent(...);
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(...);
185 template<
typename>
static EFalseType TestHasConfigType(...);
188 template<
typename>
static EFalseType TestHasSourceType(...);
191 template<
typename>
static EFalseType TestHasQuantizedType(...);
194 template<
typename>
static constexpr bool IsSourceTypePod(...) {
return false; }
197 template<
typename>
static constexpr bool IsQuantizedTypePod(...) {
return false; }
200 template<
typename U>
static constexpr bool TestHasDefaultConfig(FTypeCheck<
decltype(&U::DefaultConfig)>*) {
return true; }
201 template<
typename>
static constexpr bool TestHasDefaultConfig(...) {
return false; }
205 template<
typename>
static EFalseType TestHasSerialize(...);
208 template<
typename>
static EFalseType TestHasDeserialize(...);
211 template<
typename>
static EFalseType TestHasSerializeDelta(...);
214 template<
typename>
static EFalseType TestHasDeserializeDelta(...);
217 template<
typename>
static EFalseType TestHasQuantize(...);
220 template<
typename>
static EFalseType TestHasDequantize(...);
223 template<
typename>
static EFalseType TestHasIsEqual(...);
226 template<
typename>
static EFalseType TestHasValidate(...);
229 template<
typename>
static EFalseType TestHasFreeDynamicState(...);
232 template<
typename>
static EFalseType TestHasCloneDynamicState(...);
235 template<
typename>
static EFalseType TestHasCollectNetReferences(...);
238 template<
typename>
static EFalseType TestHasApply(...);
240 enum ETraits :
unsigned
299 template<
typename T =
void,
typename U =
typename TEnableIf<!(UseSerializerIsEqualIsBool && HasIsEqual), T>::Type,
char V = 0>
315 static constexpr bool HasDynamicState() {
return NetSerializerImpl::bHasDynamicState; }
343 template<
typename T =
void,
typename U =
typename TEnableIf<!HasSerializeDelta && !ShouldUseDefaultDelta(), T>::Type,
int V = 0>
346 template<
typename T =
void,
typename U =
typename TEnableIf<!HasSerializeDelta && ShouldUseDefaultDelta() && HasIsEqual, T>::Type,
char V = 0>
349 template<
typename T =
void,
typename U =
typename TEnableIf<!HasSerializeDelta && ShouldUseDefaultDelta() && !HasIsEqual, T>::Type,
unsigned char V = 0>
356 template<
typename T =
void,
typename U =
typename TEnableIf<!HasDeserializeDelta && !ShouldUseDefaultDelta(), T>::Type,
int V = 0>
359 template<
typename T =
void,
typename U =
typename TEnableIf<!HasDeserializeDelta && ShouldUseDefaultDelta() && (HasCloneDynamicState && HasFreeDynamicState), T>::Type,
char V = 0>
362 template<
typename T =
void,
typename U =
typename TEnableIf<!HasDeserializeDelta && ShouldUseDefaultDelta() && !(HasCloneDynamicState && HasFreeDynamicState), T>::Type,
unsigned char V = 0>
406 template<
typename T =
void,
typename U =
typename TEnableIf<HasCloneDynamicState && (IsForwardingSerializer() || HasDynamicState()), T>::Type,
bool V = true>
409 template<
typename T =
void,
typename U =
typename TEnableIf<!(HasCloneDynamicState && (IsForwardingSerializer() || HasDynamicState())), T>::Type,
char V = 0>
413 template<
typename T =
void,
typename U =
typename TEnableIf<HasFreeDynamicState && (IsForwardingSerializer() || HasDynamicState()), T>::Type,
bool V = true>
416 template<
typename T =
void,
typename U =
typename TEnableIf<!(HasFreeDynamicState && (IsForwardingSerializer() || HasDynamicState())), T>::Type,
char V = 0>
423 template<
typename T =
void,
typename U =
typename TEnableIf<!(HasConfigType && HasDefaultConfig), T>::Type,
char V = 0>
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>); }
445 template<
typename T =
void,
typename U =
typename TEnableIf<!(HasSourceType || HasQuantizedType), T>::Type,
char V = 0>
452 static constexpr uint32 GetQuantizedTypeAlignment() {
return alignof(std::conditional_t<std::is_same_v<void, typename NetSerializerImpl::SourceType>,
uint8,
typename NetSerializerImpl::SourceType>); }
454 template<
typename T =
void,
typename U =
typename TEnableIf<!(HasSourceType || HasQuantizedType), T>::Type,
char V = 0>
472 static_assert(HasVersion,
"FNetSerializer must have a 'static constexpr uint32 Version' member.");
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'.");
479 static_assert(HasConfigType,
"FNetSerializer must have a ConfigType.");
483 static_assert(HasSourceType,
"FNetSerializer must have a SourceType.");
484 static_assert(!HasQuantizedType || QuantizedTypeIsPod,
"QuantizedType in FNetSerializer must be POD.");
488 static_assert(HasSerialize,
"FNetSerializer must implement Serialize.");
489 static_assert(HasDeserialize,
"FNetSerializer must implement Deserialize.");
491 static_assert(HasSerializeDelta == HasDeserializeDelta,
"FNetSerializer should implement both SerializeDelta and DeserializeDelta or none of them.");
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.");
500 static_assert(!HasDynamicStateIsBool || (HasFreeDynamicState && HasCloneDynamicState),
"FNetSerializer must implement CloneDynamicState and FreeDynamicState when it has dynamic state.");
502 static_assert(!UseDefaultDeltaIsPresent || UseDefaultDeltaIsBool,
"FNetSerializer bUseDefaultDelta member should be declared as 'static constexpr bool bUseDefaultDelta'.");
504 ValidateForwardingSerializer();
508 template<
typename T =
void,
typename U =
typename TEnableIf<IsForwardingSerializer(), T>::Type,
bool V = true>
509 static void ValidateForwardingSerializer()
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.");
524 template<
typename T =
void,
typename U =
typename TEnableIf<!IsForwardingSerializer(), T>::Type,
char V = 0>
525 static void ValidateForwardingSerializer()
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
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
@ HasConnectionSpecificSerialization
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