File: format.hpp

package info (click to toggle)
openmw 0.50.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 37,076 kB
  • sloc: cpp: 380,958; xml: 2,192; sh: 1,449; python: 911; makefile: 26; javascript: 5
file content (75 lines) | stat: -rw-r--r-- 2,305 bytes parent folder | download
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