// Copyright (C) 2024 Jérôme "SirLynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Export.hpp #include namespace Nz { template inline bool Serialize(SerializationContext& context, std::string_view name, const T& value) { return Serialize(context, name, value, TypeTag>()); } template bool Serialize(SerializationContext& context, std::string_view name, const T& value, TypeTag) { if (!context.PushObject(name)) return false; bool bRes = Serialize(context, value, TypeTag>()); context.PopObject(); return bRes; } /*! * \ingroup core * \brief Serializes a boolean * \return true if serialization succeeded * * \param context Context for the serialization * \param value Boolean to serialize * * \see Serialize, Unserialize */ inline bool Serialize(SerializationContext& context, std::string_view name, const bool& value, TypeTag) { return context.Write(name, value); } /*! * \ingroup core * \brief Serializes a std::string * \return true if successful * * \param context Context for the serialization * \param value String to serialize */ inline bool Serialize(SerializationContext& context, std::string_view name, const std::string& value, TypeTag) { return context.Write(name, value); } inline bool Serialize(SerializationContext& context, std::string_view name, const std::filesystem::path& value, TypeTag) { std::string str = value.string(); return context.Write(name, str); } template bool Serialize(SerializationContext& context, std::string_view name, const T(&values)[N]) { if (!context.PushArray(name)) return false; bool bRes = true; for (size_t i = 0; i < N; ++i) { if (!Serialize(context, "", values[i])) bRes = false; } context.PopArray(); return bRes; } template bool Serialize(SerializationContext& context, std::string_view name, const std::array& values) { if (!context.PushArray(name)) return false; bool bRes = true; for (auto&& value : values) { if (!Serialize(context, "", value)) bRes = false; } context.PopArray(); return bRes; } template bool Serialize(SerializationContext& context, std::string_view name, const std::vector& values) { if (!context.PushArray(name)) return false; bool bRes = true; for (auto&& value : values) { if (!Serialize(context, "", value)) bRes = false; } context.PopArray(); return bRes; } template bool Serialize(SerializationContext& context, std::string_view name, const Nz::EnumArray& values) { if (!context.PushArray(name)) return false; bool bRes = true; for (auto&& value : values) { if (!Serialize(context, "", value)) bRes = false; } context.PopArray(); return bRes; } /*! * \ingroup core * \brief Serializes an arithmetic type * \return true if serialization succeeded * * \param context Context for the serialization * \param value Arithmetic type to serialize * * \see Serialize, Unserialize */ template inline bool Serialize(SerializationContext& context, std::string_view name, const T& value, TypeTag) { return context.Write(name, value); } template inline bool Serialize(SerializationContext& context, std::string_view name, const T& value, TypeTag) { switch (context.GetEnumSerializationMode()) { case EnumSerializationMode::Binary: return Serialize(context, name, std::underlying_type_t(value), TypeTag>>()); case EnumSerializationMode::String: return Serialize(context, name, std::string(EnumToString(value)), TypeTag()); } return false; } template inline bool Unserialize(SerializationContext& context, std::string_view name, T* value) { return Unserialize(context, name, value, TypeTag>()); } template bool Unserialize(SerializationContext& context, std::string_view name, T* value, TypeTag) { if (!context.PushObject(name)) return false; bool bRes = Unserialize(context, value, TypeTag()); context.PopObject(); return bRes; } /*! * \ingroup core * \brief Unserializes a boolean * \return true if unserialization succedeed * * \param context Context for the unserialization * \param value Pointer to boolean to unserialize * * \see Serialize, Unserialize */ inline bool Unserialize(SerializationContext& context, std::string_view name, bool* value, TypeTag) { return context.Read(name, value); } /*! * \brief Unserializes a string * \return true if successful * * \param context Context of unserialization * \param string std::string to unserialize */ inline bool Unserialize(SerializationContext& context, std::string_view name, std::string* string, TypeTag) { return context.Read(name, string); } inline bool Unserialize(SerializationContext& context, std::string_view name, std::filesystem::path* value, TypeTag) { std::string str; if (!context.Read(name, &str)) return false; *value = str; return true; } template bool Unserialize(SerializationContext& context, std::string_view name, T(*values)[N]) { if (!context.PushArray(name)) return false; bool bRes = true; for (size_t i = 0; i < N; ++i) { if (!Unserialize(context, "", &(*values[i]))) bRes = false; } context.PopArray(); return bRes; } template bool Unserialize(SerializationContext& context, std::string_view name, std::array* values) { if (!context.PushArray(name)) return false; bool bRes = true; for (auto&& value : *values) { if (!Unserialize(context, "", &value)) bRes = false; } context.PopArray(); return bRes; } template bool Unserialize(SerializationContext& context, std::string_view name, std::vector* values) { if (!context.PushArray(name)) return false; bool bRes = true; for (auto&& value : *values) { if (!Unserialize(context, "", &value)) bRes = false; } context.PopArray(); return bRes; } template bool Unserialize(SerializationContext& context, std::string_view name, Nz::EnumArray* values) { if (!context.PushArray(name)) return false; bool bRes = true; for (auto&& value : *values) { if (!Unserialize(context, "", &value)) bRes = false; } context.PopArray(); return bRes; } /*! * \ingroup core * \brief Unserializes an arithmetic type * \return true if unserialization succedeed * * \param context Context for the unserialization * \param value Pointer to arithmetic type to serialize * * \remark Produce a NazaraAssert if pointer to value is invalid * * \see Serialize, Unserialize */ template inline bool Unserialize(SerializationContext& context, std::string_view name, T* value, TypeTag) { return context.Read(name, value); } template bool Unserialize(SerializationContext& context, std::string_view name, T* value, TypeTag) { switch (context.GetEnumSerializationMode()) { case EnumSerializationMode::Binary: { std::underlying_type_t v = 0; if (!Unserialize(context, name, &v, TypeTag>>())) return false; *value = static_cast(v); return true; } case EnumSerializationMode::String: { std::string str; if (!Unserialize(context, name, &str, TypeTag())) return false; *value = EnumFromString(str); return true; } } return false; } template inline bool Serialize(SerializationContext& context, std::string_view name, const Flags& flags, TypeTag>) { return Serialize(context, name, static_cast::BitField>(flags), TypeTag::BitField>>()); } template inline bool Unserialize(SerializationContext& context, std::string_view name, Flags* flags, TypeTag>) { typename Flags::BitField v; if (Unserialize(context, name, &v, TypeTag::BitField>>())) *flags = v; return true; } }