Fix bug when serializing class types
This commit is contained in:
parent
5217f97acb
commit
ca4048c038
@ -98,8 +98,8 @@ insert_in_toml_table(toml::table& tbl, const char* fieldName, const T& obj)
|
||||
{
|
||||
using value_type = std::decay_t<T>;
|
||||
|
||||
if constexpr (is_not_toml_native_t<value_type>) {
|
||||
auto subtable = to_toml_table<T>(obj);
|
||||
if constexpr (is_not_toml_native_t<value_type> || std::is_class_v<value_type>) {
|
||||
auto subtable = to_toml_table(obj);
|
||||
tbl.insert_or_assign(fieldName, subtable);
|
||||
} else {
|
||||
|
||||
@ -117,9 +117,9 @@ extract_from_toml_table(const toml::table& tbl, const char* fieldName, T& output
|
||||
"Missing field " + std::string(fieldName)
|
||||
);
|
||||
}
|
||||
if constexpr (is_not_toml_native_t<value_type>) {
|
||||
if constexpr (is_not_toml_native_t<value_type> || std::is_class_v<value_type>) {
|
||||
auto subtable = *(tbl[fieldName].as_table());
|
||||
from_toml_table<T>(subtable, output);
|
||||
from_toml_table(subtable, output);
|
||||
} else {
|
||||
output = tbl[fieldName].value<T>().value();
|
||||
}
|
||||
|
@ -24,17 +24,29 @@ BEGIN_TEST_SUITE("Util.Toml")
|
||||
|
||||
IOCORE_TOML_SERIALIZABLE(SimpleStruct, field1, field2);
|
||||
};
|
||||
struct SimpleStruct2 {
|
||||
int fieldA;
|
||||
|
||||
struct ComplexStruct {
|
||||
IOCORE_TOML_SERIALIZABLE(SimpleStruct2, fieldA);
|
||||
};
|
||||
|
||||
struct StructWithEnum {
|
||||
int field1;
|
||||
int field2;
|
||||
Colors foreground;
|
||||
|
||||
IOCORE_TOML_SERIALIZABLE(
|
||||
ComplexStruct, field1, field2, foreground
|
||||
StructWithEnum, field1, field2, foreground
|
||||
);
|
||||
};
|
||||
|
||||
struct CompositeStruct {
|
||||
SimpleStruct part1;
|
||||
SimpleStruct2 part2;
|
||||
|
||||
IOCORE_TOML_SERIALIZABLE(CompositeStruct, part1, part2);
|
||||
};
|
||||
|
||||
TEST_CASE("IOCORE_TOML_TO Macro works")
|
||||
{
|
||||
toml::table tbl;
|
||||
@ -44,11 +56,28 @@ BEGIN_TEST_SUITE("Util.Toml")
|
||||
IOCORE_TOML_TO(field2);
|
||||
REQUIRE(tbl.size() == 2);
|
||||
}
|
||||
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works")
|
||||
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works with SimpleStruct")
|
||||
{
|
||||
toml::table table;
|
||||
ComplexStruct data = { 11, 22, Green };
|
||||
ComplexStruct newdest;
|
||||
SimpleStruct data = { 10, 20 };
|
||||
SimpleStruct newdest;
|
||||
|
||||
table = to_toml_table(data);
|
||||
from_toml_table(table, newdest);
|
||||
|
||||
CHECK(table.size() == 2);
|
||||
|
||||
CHECK(table["field1"].value<int>() == 10);
|
||||
CHECK(table["field2"].value<int>() == 20);
|
||||
|
||||
CHECK(newdest.field1 == data.field1);
|
||||
CHECK(newdest.field2 == data.field2);
|
||||
}
|
||||
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works with StructWithEnum")
|
||||
{
|
||||
toml::table table;
|
||||
StructWithEnum data = { 11, 22, Green };
|
||||
StructWithEnum newdest;
|
||||
|
||||
table = to_toml_table(data);
|
||||
from_toml_table(table, newdest);
|
||||
@ -63,6 +92,29 @@ BEGIN_TEST_SUITE("Util.Toml")
|
||||
CHECK(newdest.field2 == data.field2);
|
||||
CHECK(newdest.foreground == data.foreground);
|
||||
}
|
||||
|
||||
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works with CompositeStruct")
|
||||
{
|
||||
toml::table table;
|
||||
CompositeStruct data = { { 10, 20 }, { 30 } };
|
||||
CompositeStruct newdest;
|
||||
|
||||
table = to_toml_table(data);
|
||||
from_toml_table(table, newdest);
|
||||
|
||||
CHECK(table.size() == 2);
|
||||
|
||||
CHECK(table["part1"].as_table()->size() == 2);
|
||||
CHECK(table["part2"].as_table()->size() == 1);
|
||||
|
||||
CHECK(table["part1"]["field1"].value<int>() == 10);
|
||||
CHECK(table["part1"]["field2"].value<int>() == 20);
|
||||
CHECK(table["part2"]["fieldA"].value<int>() == 30);
|
||||
|
||||
CHECK(newdest.part1.field1 == data.part1.field1);
|
||||
CHECK(newdest.part1.field2 == data.part1.field2);
|
||||
CHECK(newdest.part2.fieldA == data.part2.fieldA);
|
||||
}
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
|
Loading…
Reference in New Issue
Block a user