1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
#ifndef OPENMW_TEST_SUITE_SERIALIZATION_FORMAT_H
#define OPENMW_TEST_SUITE_SERIALIZATION_FORMAT_H
#include <components/serialization/format.hpp>
#include <cstdint>
#include <type_traits>
#include <utility>
namespace SerializationTesting
{
struct Pod
{
int mInt = 42;
double mDouble = 3.14;
friend bool operator==(const Pod& l, const Pod& r)
{
const auto tuple = [](const Pod& v) { return std::tuple(v.mInt, v.mDouble); };
return tuple(l) == tuple(r);
}
};
enum Enum : std::int32_t
{
A,
B,
C,
};
struct Composite
{
short mFloatArray[3] = { 0 };
std::vector<std::int32_t> mIntVector;
std::vector<Enum> mEnumVector;
std::vector<Pod> mPodVector;
std::size_t mPodDataSize = 0;
std::vector<Pod> mPodBuffer;
std::size_t mCharDataSize = 0;
std::vector<char> mCharBuffer;
};
template <Serialization::Mode mode>
struct TestFormat : Serialization::Format<mode, TestFormat<mode>>
{
using Serialization::Format<mode, TestFormat<mode>>::operator();
template <class Visitor, class T>
auto operator()(Visitor&& visitor, T& value) const -> std::enable_if_t<std::is_same_v<std::decay_t<T>, Pod>>
{
visitor(*this, value.mInt);
visitor(*this, value.mDouble);
}
template <class Visitor, class T>
auto operator()(Visitor&& visitor, T& value) const
-> std::enable_if_t<std::is_same_v<std::decay_t<T>, Composite>>
{
visitor(*this, value.mFloatArray);
visitor(*this, value.mIntVector);
visitor(*this, value.mEnumVector);
visitor(*this, value.mPodVector);
visitor(*this, value.mPodDataSize);
if constexpr (mode == Serialization::Mode::Read)
value.mPodBuffer.resize(value.mPodDataSize);
visitor(*this, value.mPodBuffer.data(), value.mPodDataSize);
visitor(*this, value.mCharDataSize);
if constexpr (mode == Serialization::Mode::Read)
value.mCharBuffer.resize(value.mCharDataSize);
visitor(*this, value.mCharBuffer.data(), value.mCharDataSize);
}
};
}
#endif
|