From 818f8d23d90684f841a57cadae7c14fd37de1e06 Mon Sep 17 00:00:00 2001 From: Alex Shabalin Date: Thu, 22 Feb 2024 11:46:35 +0100 Subject: [PATCH] Archive conversion for tables --- immer/extra/archive/champ/archive.hpp | 19 + test/extra/archive/test_champ.cpp | 957 +++++++++++++++++++++++--- test/extra/archive/test_vectors.cpp | 118 ++-- test/extra/archive/utils.hpp | 9 +- 4 files changed, 957 insertions(+), 146 deletions(-) diff --git a/immer/extra/archive/champ/archive.hpp b/immer/extra/archive/champ/archive.hpp index 092c11f4..c1cbed38 100644 --- a/immer/extra/archive/champ/archive.hpp +++ b/immer/extra/archive/champ/archive.hpp @@ -249,5 +249,24 @@ auto transform_archive(const container_archive_load< }; } +template +auto transform_archive( + const container_archive_load< + immer::table>& ar, + F&& func) +{ + using U = std::decay_t()))>; + using new_table_t = immer::table; + return container_archive_load{ + .nodes = transform(ar.nodes, func), + }; +} + } // namespace champ } // namespace immer::archive diff --git a/test/extra/archive/test_champ.cpp b/test/extra/archive/test_champ.cpp index 7333b3ce..46b6db61 100644 --- a/test/extra/archive/test_champ.cpp +++ b/test/extra/archive/test_champ.cpp @@ -776,7 +776,7 @@ TEST_CASE("Test modifying nodes with collisions") } } -TEST_CASE("Test champ archive conversion") +TEST_CASE("Test champ archive conversion, map") { using test::new_type; using test::old_type; @@ -789,11 +789,12 @@ TEST_CASE("Test champ archive conversion") const auto map1 = [] { auto map = old_map_t{}; for (auto i = 0; i < 30; ++i) { - map = std::move(map).set(fmt::format("x{}x", i), old_type{i}); + map = + std::move(map).set(fmt::format("x{}x", i), old_type{.data = i}); } return map; }(); - const auto map2 = map1.set("345", old_type{345}); + const auto map2 = map1.set("345", old_type{.data = 345}); auto [ar, map1_id] = immer::archive::champ::save_to_archive(map1, {}); auto map2_id = immer::archive::node_id{}; @@ -823,67 +824,78 @@ TEST_CASE("Test champ archive conversion") { "first": "x13x", "second": { - "data": 13 + "data": 13, + "id": "" } }, { "first": "x4x", "second": { - "data": 4 + "data": 4, + "id": "" } }, { "first": "x22x", "second": { - "data": 22 + "data": 22, + "id": "" } }, { "first": "x28x", "second": { - "data": 28 + "data": 28, + "id": "" } }, { "first": "x10x", "second": { - "data": 10 + "data": 10, + "id": "" } }, { "first": "x12x", "second": { - "data": 12 + "data": 12, + "id": "" } }, { "first": "x9x", "second": { - "data": 9 + "data": 9, + "id": "" } }, { "first": "x29x", "second": { - "data": 29 + "data": 29, + "id": "" } }, { "first": "x6x", "second": { - "data": 6 + "data": 6, + "id": "" } }, { "first": "x17x", "second": { - "data": 17 + "data": 17, + "id": "" } }, { "first": "x11x", "second": { - "data": 11 + "data": 11, + "id": "" } } ] @@ -897,13 +909,15 @@ TEST_CASE("Test champ archive conversion") { "first": "x21x", "second": { - "data": 21 + "data": 21, + "id": "" } }, { "first": "x5x", "second": { - "data": 5 + "data": 5, + "id": "" } } ] @@ -917,13 +931,15 @@ TEST_CASE("Test champ archive conversion") { "first": "x25x", "second": { - "data": 25 + "data": 25, + "id": "" } }, { "first": "x26x", "second": { - "data": 26 + "data": 26, + "id": "" } } ] @@ -937,19 +953,22 @@ TEST_CASE("Test champ archive conversion") { "first": "x8x", "second": { - "data": 8 + "data": 8, + "id": "" } }, { "first": "x16x", "second": { - "data": 16 + "data": 16, + "id": "" } }, { "first": "x3x", "second": { - "data": 3 + "data": 3, + "id": "" } } ] @@ -963,13 +982,15 @@ TEST_CASE("Test champ archive conversion") { "first": "x14x", "second": { - "data": 14 + "data": 14, + "id": "" } }, { "first": "x18x", "second": { - "data": 18 + "data": 18, + "id": "" } } ] @@ -983,13 +1004,15 @@ TEST_CASE("Test champ archive conversion") { "first": "x23x", "second": { - "data": 23 + "data": 23, + "id": "" } }, { "first": "x0x", "second": { - "data": 0 + "data": 0, + "id": "" } } ] @@ -1003,13 +1026,15 @@ TEST_CASE("Test champ archive conversion") { "first": "x15x", "second": { - "data": 15 + "data": 15, + "id": "" } }, { "first": "x24x", "second": { - "data": 24 + "data": 24, + "id": "" } } ] @@ -1023,13 +1048,15 @@ TEST_CASE("Test champ archive conversion") { "first": "x27x", "second": { - "data": 27 + "data": 27, + "id": "" } }, { "first": "x1x", "second": { - "data": 1 + "data": 1, + "id": "" } } ] @@ -1043,13 +1070,15 @@ TEST_CASE("Test champ archive conversion") { "first": "x7x", "second": { - "data": 7 + "data": 7, + "id": "" } }, { "first": "x20x", "second": { - "data": 20 + "data": 20, + "id": "" } } ] @@ -1063,13 +1092,15 @@ TEST_CASE("Test champ archive conversion") { "first": "x19x", "second": { - "data": 19 + "data": 19, + "id": "" } }, { "first": "x2x", "second": { - "data": 2 + "data": 2, + "id": "" } } ] @@ -1093,73 +1124,85 @@ TEST_CASE("Test champ archive conversion") { "first": "x13x", "second": { - "data": 13 + "data": 13, + "id": "" } }, { "first": "x4x", "second": { - "data": 4 + "data": 4, + "id": "" } }, { "first": "x22x", "second": { - "data": 22 + "data": 22, + "id": "" } }, { "first": "x28x", "second": { - "data": 28 + "data": 28, + "id": "" } }, { "first": "x10x", "second": { - "data": 10 + "data": 10, + "id": "" } }, { "first": "x12x", "second": { - "data": 12 + "data": 12, + "id": "" } }, { "first": "x9x", "second": { - "data": 9 + "data": 9, + "id": "" } }, { "first": "x29x", "second": { - "data": 29 + "data": 29, + "id": "" } }, { "first": "x6x", "second": { - "data": 6 + "data": 6, + "id": "" } }, { "first": "345", "second": { - "data": 345 + "data": 345, + "id": "" } }, { "first": "x17x", "second": { - "data": 17 + "data": 17, + "id": "" } }, { "first": "x11x", "second": { - "data": 11 + "data": 11, + "id": "" } } ] @@ -1219,77 +1262,88 @@ TEST_CASE("Test champ archive conversion") "first": "x13x", "second": { "data": 13, - "data2": "_13_" + "data2": "_13_", + "id": "" } }, { "first": "x4x", "second": { "data": 4, - "data2": "_4_" + "data2": "_4_", + "id": "" } }, { "first": "x22x", "second": { "data": 22, - "data2": "_22_" + "data2": "_22_", + "id": "" } }, { "first": "x28x", "second": { "data": 28, - "data2": "_28_" + "data2": "_28_", + "id": "" } }, { "first": "x10x", "second": { "data": 10, - "data2": "_10_" + "data2": "_10_", + "id": "" } }, { "first": "x12x", "second": { "data": 12, - "data2": "_12_" + "data2": "_12_", + "id": "" } }, { "first": "x9x", "second": { "data": 9, - "data2": "_9_" + "data2": "_9_", + "id": "" } }, { "first": "x29x", "second": { "data": 29, - "data2": "_29_" + "data2": "_29_", + "id": "" } }, { "first": "x6x", "second": { "data": 6, - "data2": "_6_" + "data2": "_6_", + "id": "" } }, { "first": "x17x", "second": { "data": 17, - "data2": "_17_" + "data2": "_17_", + "id": "" } }, { "first": "x11x", "second": { "data": 11, - "data2": "_11_" + "data2": "_11_", + "id": "" } } ] @@ -1304,14 +1358,16 @@ TEST_CASE("Test champ archive conversion") "first": "x21x", "second": { "data": 21, - "data2": "_21_" + "data2": "_21_", + "id": "" } }, { "first": "x5x", "second": { "data": 5, - "data2": "_5_" + "data2": "_5_", + "id": "" } } ] @@ -1326,14 +1382,16 @@ TEST_CASE("Test champ archive conversion") "first": "x25x", "second": { "data": 25, - "data2": "_25_" + "data2": "_25_", + "id": "" } }, { "first": "x26x", "second": { "data": 26, - "data2": "_26_" + "data2": "_26_", + "id": "" } } ] @@ -1348,21 +1406,24 @@ TEST_CASE("Test champ archive conversion") "first": "x8x", "second": { "data": 8, - "data2": "_8_" + "data2": "_8_", + "id": "" } }, { "first": "x16x", "second": { "data": 16, - "data2": "_16_" + "data2": "_16_", + "id": "" } }, { "first": "x3x", "second": { "data": 3, - "data2": "_3_" + "data2": "_3_", + "id": "" } } ] @@ -1377,14 +1438,16 @@ TEST_CASE("Test champ archive conversion") "first": "x14x", "second": { "data": 14, - "data2": "_14_" + "data2": "_14_", + "id": "" } }, { "first": "x18x", "second": { "data": 18, - "data2": "_18_" + "data2": "_18_", + "id": "" } } ] @@ -1399,14 +1462,16 @@ TEST_CASE("Test champ archive conversion") "first": "x23x", "second": { "data": 23, - "data2": "_23_" + "data2": "_23_", + "id": "" } }, { "first": "x0x", "second": { "data": 0, - "data2": "_0_" + "data2": "_0_", + "id": "" } } ] @@ -1421,14 +1486,16 @@ TEST_CASE("Test champ archive conversion") "first": "x15x", "second": { "data": 15, - "data2": "_15_" + "data2": "_15_", + "id": "" } }, { "first": "x24x", "second": { "data": 24, - "data2": "_24_" + "data2": "_24_", + "id": "" } } ] @@ -1443,14 +1510,16 @@ TEST_CASE("Test champ archive conversion") "first": "x27x", "second": { "data": 27, - "data2": "_27_" + "data2": "_27_", + "id": "" } }, { "first": "x1x", "second": { "data": 1, - "data2": "_1_" + "data2": "_1_", + "id": "" } } ] @@ -1465,14 +1534,16 @@ TEST_CASE("Test champ archive conversion") "first": "x7x", "second": { "data": 7, - "data2": "_7_" + "data2": "_7_", + "id": "" } }, { "first": "x20x", "second": { "data": 20, - "data2": "_20_" + "data2": "_20_", + "id": "" } } ] @@ -1487,14 +1558,16 @@ TEST_CASE("Test champ archive conversion") "first": "x19x", "second": { "data": 19, - "data2": "_19_" + "data2": "_19_", + "id": "" } }, { "first": "x2x", "second": { "data": 2, - "data2": "_2_" + "data2": "_2_", + "id": "" } } ] @@ -1519,84 +1592,96 @@ TEST_CASE("Test champ archive conversion") "first": "x13x", "second": { "data": 13, - "data2": "_13_" + "data2": "_13_", + "id": "" } }, { "first": "x4x", "second": { "data": 4, - "data2": "_4_" + "data2": "_4_", + "id": "" } }, { "first": "x22x", "second": { "data": 22, - "data2": "_22_" + "data2": "_22_", + "id": "" } }, { "first": "x28x", "second": { "data": 28, - "data2": "_28_" + "data2": "_28_", + "id": "" } }, { "first": "x10x", "second": { "data": 10, - "data2": "_10_" + "data2": "_10_", + "id": "" } }, { "first": "x12x", "second": { "data": 12, - "data2": "_12_" + "data2": "_12_", + "id": "" } }, { "first": "x9x", "second": { "data": 9, - "data2": "_9_" + "data2": "_9_", + "id": "" } }, { "first": "x29x", "second": { "data": 29, - "data2": "_29_" + "data2": "_29_", + "id": "" } }, { "first": "x6x", "second": { "data": 6, - "data2": "_6_" + "data2": "_6_", + "id": "" } }, { "first": "345", "second": { "data": 345, - "data2": "_345_" + "data2": "_345_", + "id": "" } }, { "first": "x17x", "second": { "data": 17, - "data2": "_17_" + "data2": "_17_", + "id": "" } }, { "first": "x11x", "second": { "data": 11, - "data2": "_11_" + "data2": "_11_", + "id": "" } } ] @@ -1607,3 +1692,701 @@ TEST_CASE("Test champ archive conversion") REQUIRE(json_t::parse(to_json(ar)) == expected_ar); } } + +TEST_CASE("Test champ archive conversion, table") +{ + using test::new_type; + using test::old_type; + + using old_table_t = immer::table; + using new_table_t = immer::table; + + const auto table1 = [] { + auto table = old_table_t{}; + for (auto i = 0; i < 30; ++i) { + table = std::move(table).insert(old_type{ + .id = fmt::format("q{}q", i), + .data = i, + }); + } + return table; + }(); + const auto table2 = table1.insert(old_type{ + .id = "345", + .data = 345, + }); + + auto [ar, table1_id] = immer::archive::champ::save_to_archive(table1, {}); + auto table2_id = immer::archive::node_id{}; + std::tie(ar, table2_id) = save_to_archive(table2, ar); + + // Confirm that table1 and table2 have structural sharing in the beginning. + // "q27q" is stored only once. + const auto expected_ar = json_t::parse(R"( +{ + "value0": [ + { + "children": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "collisions": false, + "datamap": 1141116977, + "nodemap": 2843749188, + "values": [ + { + "data": 15, + "id": "q15q" + }, + { + "data": 8, + "id": "q8q" + }, + { + "data": 0, + "id": "q0q" + }, + { + "data": 29, + "id": "q29q" + }, + { + "data": 24, + "id": "q24q" + }, + { + "data": 4, + "id": "q4q" + }, + { + "data": 6, + "id": "q6q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 8389632, + "nodemap": 0, + "values": [ + { + "data": 27, + "id": "q27q" + }, + { + "data": 17, + "id": "q17q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 2097216, + "nodemap": 0, + "values": [ + { + "data": 26, + "id": "q26q" + }, + { + "data": 9, + "id": "q9q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 2214592512, + "nodemap": 0, + "values": [ + { + "data": 19, + "id": "q19q" + }, + { + "data": 11, + "id": "q11q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 8388610, + "nodemap": 0, + "values": [ + { + "data": 14, + "id": "q14q" + }, + { + "data": 1, + "id": "q1q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 131200, + "nodemap": 0, + "values": [ + { + "data": 22, + "id": "q22q" + }, + { + "data": 20, + "id": "q20q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 536870944, + "nodemap": 0, + "values": [ + { + "data": 10, + "id": "q10q" + }, + { + "data": 3, + "id": "q3q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 532480, + "nodemap": 0, + "values": [ + { + "data": 21, + "id": "q21q" + }, + { + "data": 5, + "id": "q5q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 17825792, + "nodemap": 0, + "values": [ + { + "data": 16, + "id": "q16q" + }, + { + "data": 2, + "id": "q2q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 268435457, + "nodemap": 0, + "values": [ + { + "data": 13, + "id": "q13q" + }, + { + "data": 12, + "id": "q12q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 537001986, + "nodemap": 0, + "values": [ + { + "data": 23, + "id": "q23q" + }, + { + "data": 18, + "id": "q18q" + }, + { + "data": 7, + "id": "q7q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 1056768, + "nodemap": 0, + "values": [ + { + "data": 25, + "id": "q25q" + }, + { + "data": 28, + "id": "q28q" + } + ] + }, + { + "children": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "collisions": false, + "datamap": 1409552433, + "nodemap": 2843749188, + "values": [ + { + "data": 15, + "id": "q15q" + }, + { + "data": 345, + "id": "345" + }, + { + "data": 8, + "id": "q8q" + }, + { + "data": 0, + "id": "q0q" + }, + { + "data": 29, + "id": "q29q" + }, + { + "data": 24, + "id": "q24q" + }, + { + "data": 4, + "id": "q4q" + }, + { + "data": 6, + "id": "q6q" + } + ] + } + ] +} + )"); + + REQUIRE(json_t::parse(to_json(ar)) == expected_ar); + + const auto transform_table = [&](const auto& table) { + auto result = new_table_t{}; + for (const auto& item : table) { + result = std::move(result).insert(convert_old_type(item)); + } + return result; + }; + + const auto load_archive = to_load_archive(ar); + + SECTION("Invalid conversion, ID is corrupted") + { + const auto badly_convert_old_type = [](const old_type& val) { + return new_type{ + .id = val.id + "OOPS", + .data = val.data, + .data2 = fmt::format("_{}_", val.data), + }; + }; + const auto load_archive_new_type = + transform_archive(load_archive, badly_convert_old_type); + auto loader = + immer::archive::champ::container_loader{load_archive_new_type}; + REQUIRE_THROWS_AS( + loader.load(table1_id), + immer::archive::champ::hash_validation_failed_exception); + REQUIRE_THROWS_AS( + loader.load(table2_id), + immer::archive::champ::hash_validation_failed_exception); + } + + SECTION("Valid conversion, ID is not changed") + { + const auto load_archive_new_type = + transform_archive(load_archive, convert_old_type); + auto loader = + immer::archive::champ::container_loader{load_archive_new_type}; + + const auto loaded_1 = loader.load(table1_id); + const auto loaded_2 = loader.load(table2_id); + REQUIRE(loaded_1 == transform_table(table1)); + REQUIRE(loaded_2 == transform_table(table2)); + + SECTION("Loaded tables still share the structure") + { + auto [ar, id] = + immer::archive::champ::save_to_archive(loaded_1, {}); + std::tie(ar, id) = save_to_archive(loaded_1, ar); + std::tie(ar, id) = save_to_archive(loaded_2, ar); + + // For example, "q17q" is stored only once + const auto expected_ar = json_t::parse(R"( +{ + "value0": [ + { + "children": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "collisions": false, + "datamap": 1141116977, + "nodemap": 2843749188, + "values": [ + { + "data": 15, + "data2": "_15_", + "id": "q15q" + }, + { + "data": 8, + "data2": "_8_", + "id": "q8q" + }, + { + "data": 0, + "data2": "_0_", + "id": "q0q" + }, + { + "data": 29, + "data2": "_29_", + "id": "q29q" + }, + { + "data": 24, + "data2": "_24_", + "id": "q24q" + }, + { + "data": 4, + "data2": "_4_", + "id": "q4q" + }, + { + "data": 6, + "data2": "_6_", + "id": "q6q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 8389632, + "nodemap": 0, + "values": [ + { + "data": 27, + "data2": "_27_", + "id": "q27q" + }, + { + "data": 17, + "data2": "_17_", + "id": "q17q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 2097216, + "nodemap": 0, + "values": [ + { + "data": 26, + "data2": "_26_", + "id": "q26q" + }, + { + "data": 9, + "data2": "_9_", + "id": "q9q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 2214592512, + "nodemap": 0, + "values": [ + { + "data": 19, + "data2": "_19_", + "id": "q19q" + }, + { + "data": 11, + "data2": "_11_", + "id": "q11q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 8388610, + "nodemap": 0, + "values": [ + { + "data": 14, + "data2": "_14_", + "id": "q14q" + }, + { + "data": 1, + "data2": "_1_", + "id": "q1q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 131200, + "nodemap": 0, + "values": [ + { + "data": 22, + "data2": "_22_", + "id": "q22q" + }, + { + "data": 20, + "data2": "_20_", + "id": "q20q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 536870944, + "nodemap": 0, + "values": [ + { + "data": 10, + "data2": "_10_", + "id": "q10q" + }, + { + "data": 3, + "data2": "_3_", + "id": "q3q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 532480, + "nodemap": 0, + "values": [ + { + "data": 21, + "data2": "_21_", + "id": "q21q" + }, + { + "data": 5, + "data2": "_5_", + "id": "q5q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 17825792, + "nodemap": 0, + "values": [ + { + "data": 16, + "data2": "_16_", + "id": "q16q" + }, + { + "data": 2, + "data2": "_2_", + "id": "q2q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 268435457, + "nodemap": 0, + "values": [ + { + "data": 13, + "data2": "_13_", + "id": "q13q" + }, + { + "data": 12, + "data2": "_12_", + "id": "q12q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 537001986, + "nodemap": 0, + "values": [ + { + "data": 23, + "data2": "_23_", + "id": "q23q" + }, + { + "data": 18, + "data2": "_18_", + "id": "q18q" + }, + { + "data": 7, + "data2": "_7_", + "id": "q7q" + } + ] + }, + { + "children": [], + "collisions": false, + "datamap": 1056768, + "nodemap": 0, + "values": [ + { + "data": 25, + "data2": "_25_", + "id": "q25q" + }, + { + "data": 28, + "data2": "_28_", + "id": "q28q" + } + ] + }, + { + "children": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "collisions": false, + "datamap": 1409552433, + "nodemap": 2843749188, + "values": [ + { + "data": 15, + "data2": "_15_", + "id": "q15q" + }, + { + "data": 345, + "data2": "_345_", + "id": "345" + }, + { + "data": 8, + "data2": "_8_", + "id": "q8q" + }, + { + "data": 0, + "data2": "_0_", + "id": "q0q" + }, + { + "data": 29, + "data2": "_29_", + "id": "q29q" + }, + { + "data": 24, + "data2": "_24_", + "id": "q24q" + }, + { + "data": 4, + "data2": "_4_", + "id": "q4q" + }, + { + "data": 6, + "data2": "_6_", + "id": "q6q" + } + ] + } + ] +} + )"); + REQUIRE(json_t::parse(to_json(ar)) == expected_ar); + } + } +} diff --git a/test/extra/archive/test_vectors.cpp b/test/extra/archive/test_vectors.cpp index 5d6ba2b3..328d741a 100644 --- a/test/extra/archive/test_vectors.cpp +++ b/test/extra/archive/test_vectors.cpp @@ -1551,10 +1551,10 @@ TEST_CASE("Test vector archive conversion") using test::old_type; const auto vec1 = test::vector_one{ - old_type{123}, - old_type{234}, + old_type{.data = 123}, + old_type{.data = 234}, }; - const auto vec2 = vec1.push_back(old_type{345}); + const auto vec2 = vec1.push_back(old_type{.data = 345}); auto ar = immer::archive::rbts::make_save_archive_for(vec1); auto vec1_id = immer::archive::container_id{}; @@ -1565,57 +1565,60 @@ TEST_CASE("Test vector archive conversion") // Confirm that vec1 and vec2 have structural sharing in the beginning. const auto expected_ar = json_t::parse(R"( { - "value0": { - "leaves": [ - { - "key": 1, - "value": [ - { - "data": 123 - }, - { - "data": 234 - } - ] - }, - { - "key": 3, - "value": [ - { - "data": 345 - } - ] - } - ], - "inners": [ - { - "key": 0, - "value": { - "children": [], - "relaxed": false - } - }, - { - "key": 2, - "value": { - "children": [ - 1 - ], - "relaxed": false - } - } - ], - "vectors": [ - { - "root": 0, - "tail": 1 - }, - { - "root": 2, - "tail": 3 - } + "value0": { + "inners": [ + { + "key": 0, + "value": { + "children": [], + "relaxed": false + } + }, + { + "key": 2, + "value": { + "children": [ + 1 + ], + "relaxed": false + } + } + ], + "leaves": [ + { + "key": 1, + "value": [ + { + "data": 123, + "id": "" + }, + { + "data": 234, + "id": "" + } ] - } + }, + { + "key": 3, + "value": [ + { + "data": 345, + "id": "" + } + ] + } + ], + "vectors": [ + { + "root": 0, + "tail": 1 + }, + { + "root": 2, + "tail": 3 + } + ] + } } )"); @@ -1674,11 +1677,13 @@ TEST_CASE("Test vector archive conversion") "value": [ { "data": 123, - "data2": "_123_" + "data2": "_123_", + "id": "" }, { "data": 234, - "data2": "_234_" + "data2": "_234_", + "id": "" } ] }, @@ -1687,7 +1692,8 @@ TEST_CASE("Test vector archive conversion") "value": [ { "data": 345, - "data2": "_345_" + "data2": "_345_", + "id": "" } ] } diff --git a/test/extra/archive/utils.hpp b/test/extra/archive/utils.hpp index 2e322483..d08c90db 100644 --- a/test/extra/archive/utils.hpp +++ b/test/extra/archive/utils.hpp @@ -85,21 +85,23 @@ struct test_value struct old_type { + std::string id; int data; template void serialize(Archive& ar) { - ar(CEREAL_NVP(data)); + ar(CEREAL_NVP(id), CEREAL_NVP(data)); } }; struct new_type { + std::string id; int data; std::string data2; - auto tie() const { return std::tie(data, data2); } + auto tie() const { return std::tie(id, data, data2); } friend bool operator==(const new_type& left, const new_type& right) { @@ -109,13 +111,14 @@ struct new_type template void serialize(Archive& ar) { - ar(CEREAL_NVP(data), CEREAL_NVP(data2)); + ar(CEREAL_NVP(id), CEREAL_NVP(data), CEREAL_NVP(data2)); } }; inline auto convert_old_type(const old_type& val) { return new_type{ + .id = val.id, .data = val.data, .data2 = fmt::format("_{}_", val.data), };