forked from VisualGMQ/mirrow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsrefl_serd.cpp
95 lines (71 loc) · 2.45 KB
/
srefl_serd.cpp
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#define TOML_IMPLEMENTATION
#include "mirrow/serd/static/backends/tomlplusplus.hpp"
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include <array>
#include <iostream>
class Person final {
public:
static std::string family_name;
Person() = default;
Person(const std::string& name, float height, bool male)
: name(name), height(height), male(male) {}
void AddChild(const Person& person) { children.push_back(person); }
std::string Name() const { return name; }
float Height() const { return height; }
Person& operator+(const Person& child) {
AddChild(child);
return *this;
}
bool operator==(const Person& p) const {
return p.name == name && p.children == children && p.height == height && p.male == male;
}
std::string name;
bool male;
float height;
std::vector<Person> children;
std::optional<int> age;
};
std::string Person::family_name = "little home";
// clang-format off
#include "mirrow/srefl/srefl_begin.hpp"
srefl_class(Person,
bases()
ctors(ctor(const std::string&, float))
fields(
field(&Person::age),
field(&Person::AddChild),
field(&Person::children),
field(&Person::male),
field(&Person::Height),
field(&Person::height),
field(&Person::Name),
field(&Person::name),
field(&Person::operator+)
)
)
#include "mirrow/srefl/srefl_end.hpp"
// clang-format on
TEST_CASE("serd") {
Person person("VisualGMQ", 172.3f, false);
person.children.emplace_back("foo1", 100.0f, true);
person.children.emplace_back("foo2", 120.3f, false);
person.children.emplace_back("foo3", 130.3f, true);
person.age = 16;
toml::table person_serd;
::mirrow::serd::srefl::serialize(person, person_serd);
std::stringstream ss;
ss << toml::toml_formatter{person_serd};
// std::cout << toml::toml_formatter{person_serd} << std::endl;
toml::table person_tbl = toml::parse(ss.str()).table();
Person deserd_person;
::mirrow::serd::srefl::deserialize<Person>(person_tbl, deserd_person);
toml::table tbl;
REQUIRE(deserd_person.name == "VisualGMQ");
REQUIRE(deserd_person.height == 172.3f);
REQUIRE(deserd_person.children.size() == 3);
REQUIRE(deserd_person.children[0] == person.children[0]);
REQUIRE(deserd_person.children[1] == person.children[1]);
REQUIRE(deserd_person.children[2] == person.children[2]);
REQUIRE(deserd_person.age.value() == 16);
}