Last active
July 22, 2023 00:56
-
-
Save Vatyx/02c99e58dccf5c17a3f5f9dcb81a1ced to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
template <typename Base, typename Derived> | |
struct TSerialize | |
{ | |
static void Do(FArchive& Ar, const TUniquePtr<Base>& Payload) | |
{ | |
Ar.SerializeBits(Payload.Get(), sizeof(Derived)); | |
} | |
}; | |
template <typename Base, typename Derived> | |
struct TDeserialize | |
{ | |
static TUniquePtr<Base> Do(FArchive& Ar) | |
{ | |
auto Payload = MakeUnique<Derived>(); | |
Ar.SerializeBits(Payload.Get(), sizeof(Derived)); | |
return Payload; | |
} | |
}; | |
template <typename T> | |
using TSerializeActionPayload = TSerialize<FActionPayload, T>; | |
template <typename T> | |
using TDeserializeActionPayload = TDeserialize<FActionPayload, T>; | |
template <typename T> | |
using TSerializeBehaviorState = TSerialize<FBehaviorState, T>; | |
template <typename T> | |
using TDeserializeBehaviorState = TDeserialize<FBehaviorState, T>; | |
using SerializeFunctionPtr_ActionPayload = decltype(&TSerializeActionPayload<void>::Do); | |
using DeserializeFunctionPtr_ActionPayload = decltype(&TDeserializeActionPayload<void>::Do); | |
using SerializeFunctionPtr_BehaviorState = decltype(&TSerializeBehaviorState<void>::Do); | |
using DeserializeFunctionPtr_BehaviorState = decltype(&TDeserializeBehaviorState<void>::Do); | |
using FSerializeFunctionMap_ActionPayload = TMap<size_t, SerializeFunctionPtr_ActionPayload>; | |
using FDeserializeFunctionMap_ActionPayload = TMap<size_t, DeserializeFunctionPtr_ActionPayload>; | |
using FSerializeFunctionMap_BehaviorState = TMap<size_t, SerializeFunctionPtr_BehaviorState>; | |
using FDeserializeFunctionMap_BehaviorState = TMap<size_t, DeserializeFunctionPtr_BehaviorState>; | |
struct FSerializationMaps | |
{ | |
FSerializeFunctionMap_ActionPayload SerializeActionPayloadMap; | |
FDeserializeFunctionMap_ActionPayload DeserializeActionPayloadMap; | |
FSerializeFunctionMap_BehaviorState SerializeBehaviorStateMap; | |
FDeserializeFunctionMap_BehaviorState DeserializeBehaviorStateMap; | |
}; | |
#define ADD_SERIALIZATION_ACTION_PAYLOAD(ActionPayloadType) \ | |
static_assert(std::is_base_of_v<FActionPayload, ActionPayloadType>); \ | |
Maps.SerializeActionPayloadMap.Emplace(typeid(ActionPayloadType).hash_code(), &TSerializeActionPayload<ActionPayloadType>::Do); \ | |
Maps.DeserializeActionPayloadMap.Emplace(typeid(ActionPayloadType).hash_code(), &TDeserializeActionPayload<ActionPayloadType>::Do); | |
#define ADD_SERIALIZATION_BEHAVIOR_STATE(BehaviorStateType) \ | |
static_assert(std::is_base_of_v<FBehaviorState, BehaviorStateType>); \ | |
Maps.SerializeBehaviorStateMap.Emplace(typeid(BehaviorStateType).hash_code(), &TSerializeBehaviorState<BehaviorStateType>::Do); \ | |
Maps.DeserializeBehaviorStateMap.Emplace(typeid(BehaviorStateType).hash_code(), &TDeserializeBehaviorState<BehaviorStateType>::Do); | |
FSerializationMaps GatherSerializationMaps() | |
{ | |
FSerializationMaps Maps{}; | |
ADD_SERIALIZATION_ACTION_PAYLOAD(FTranslationActionPayload); | |
ADD_SERIALIZATION_ACTION_PAYLOAD(FGravityActionPayload); | |
ADD_SERIALIZATION_ACTION_PAYLOAD(FExtendActionPayload); | |
ADD_SERIALIZATION_BEHAVIOR_STATE(FRotationBehaviorState); | |
return Maps; | |
} | |
static FSerializationMaps SerializationMaps = GatherSerializationMaps(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment