From 4cbd826d08f4c00501e467496cce5cb5e03e718a Mon Sep 17 00:00:00 2001 From: Alex Shabalin Date: Tue, 20 Feb 2024 11:03:37 +0100 Subject: [PATCH] Make sure that the type names are unique --- .../immer-archive/json/json_with_archive.hpp | 13 ++++++++ .../immer-archive/test_special_archive.cpp | 31 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/immer/experimental/immer-archive/json/json_with_archive.hpp b/immer/experimental/immer-archive/json/json_with_archive.hpp index 6d292ef1..9f124ca4 100644 --- a/immer/experimental/immer-archive/json/json_with_archive.hpp +++ b/immer/experimental/immer-archive/json/json_with_archive.hpp @@ -142,6 +142,15 @@ inline auto generate_archives_save(auto type_names) return archives_save{storage}; } +inline auto are_type_names_unique(auto type_names) +{ + auto names_set = + hana::fold_left(type_names, hana::make_set(), [](auto set, auto pair) { + return hana::insert(set, hana::second(pair)); + }); + return hana::length(type_names) == hana::length(names_set); +} + inline auto generate_archives_load(auto type_names) { auto storage = @@ -179,6 +188,10 @@ constexpr bool is_archive_empty(const Archives& archives) template auto to_json_with_archive(const T& serializable) { + using IsUnique = decltype(detail::are_type_names_unique( + get_archives_types(serializable))); + static_assert(boost::hana::value(), + "Archive names for each type must be unique"); auto archives = detail::generate_archives_save(get_archives_types(serializable)); using Archives = std::decay_t; diff --git a/test/experimental/immer-archive/test_special_archive.cpp b/test/experimental/immer-archive/test_special_archive.cpp index ebce79f6..5e40f57c 100644 --- a/test/experimental/immer-archive/test_special_archive.cpp +++ b/test/experimental/immer-archive/test_special_archive.cpp @@ -743,3 +743,34 @@ TEST_CASE("Test saving a map that contains the same map") json_str); } } + +TEST_CASE("Test non-unique names in the map") +{ + { + const auto names = hana::make_map( + hana::make_pair(hana::type_c>, + BOOST_HANA_STRING("box")), + hana::make_pair(hana::type_c>, + BOOST_HANA_STRING("box")) + + ); + + using IsUnique = + decltype(immer_archive::detail::are_type_names_unique(names)); + static_assert(boost::hana::value() == false, + "Detect non-unique names"); + } + { + const auto names = hana::make_map( + hana::make_pair(hana::type_c>, + BOOST_HANA_STRING("box_1")), + hana::make_pair(hana::type_c>, + BOOST_HANA_STRING("box_2")) + + ); + + using IsUnique = + decltype(immer_archive::detail::are_type_names_unique(names)); + static_assert(boost::hana::value(), "Names are unique"); + } +}