Skip to content

Instantly share code, notes, and snippets.

@Vatyx
Last active July 22, 2023 00:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Vatyx/02c99e58dccf5c17a3f5f9dcb81a1ced to your computer and use it in GitHub Desktop.
Save Vatyx/02c99e58dccf5c17a3f5f9dcb81a1ced to your computer and use it in GitHub Desktop.
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