From 79a090af2f2a8feadb404c2d99867cb6999f6ecf Mon Sep 17 00:00:00 2001 From: qicosmos Date: Wed, 11 Sep 2024 17:38:24 +0800 Subject: [PATCH] simplify --- iguana/ylt/reflection/member_names.hpp | 26 +++++++------------------- test/test_cpp20.cpp | 6 +++--- test/test_xml.cpp | 4 ++-- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/iguana/ylt/reflection/member_names.hpp b/iguana/ylt/reflection/member_names.hpp index 72c94168..6afe7c33 100644 --- a/iguana/ylt/reflection/member_names.hpp +++ b/iguana/ylt/reflection/member_names.hpp @@ -88,8 +88,8 @@ inline constexpr bool has_alias_struct_name_v = has_alias_struct_names_t::value; template -inline constexpr void init_arr_with_tuple(const T& tp, U& arr, - std::index_sequence) { +inline constexpr void init_arr_with_tuple(U& arr, std::index_sequence) { + constexpr auto tp = struct_to_tuple(); ((arr[Is] = internal::get_member_name(tp))>()), ...); } @@ -106,10 +106,9 @@ get_member_names() { return type::refl_member_names(ylt::reflection::identity{}); } else { - constexpr auto tp = struct_to_tuple(); - std::array arr; #if __cplusplus >= 202002L + constexpr auto tp = struct_to_tuple(); [&](std::index_sequence) mutable { ((arr[Is] = internal::get_member_name(tp))>()), @@ -117,7 +116,7 @@ get_member_names() { } (std::make_index_sequence{}); #else - init_arr_with_tuple(tp, arr, std::make_index_sequence{}); + init_arr_with_tuple(arr, std::make_index_sequence{}); #endif return arr; } @@ -210,26 +209,15 @@ inline constexpr size_t index_of() { return names.size(); } -template struct field_alias_t { std::string_view alias_name; - inline static constexpr auto index = Idx; + size_t index; }; -template -inline constexpr auto get_alias_field_names_impl(Tuple& tp, - std::index_sequence) { - return std::array, sizeof...(Is)>{ - std::make_pair(std::tuple_element_t>::index, - std::get(tp).alias_name)...}; -} - template inline constexpr auto get_alias_field_names() { if constexpr (internal::has_alias_field_names_v) { - constexpr auto tp = ylt_alias_struct::get_alias_field_names(); - return get_alias_field_names_impl( - tp, std::make_index_sequence>{}); + return ylt_alias_struct::get_alias_field_names(); } else { return std::array{}; @@ -254,7 +242,7 @@ get_member_names() { if constexpr (internal::has_alias_field_names_v) { constexpr auto alias_arr = get_alias_field_names(); for (size_t i = 0; i < alias_arr.size(); i++) { - arr[alias_arr[i].first] = alias_arr[i].second; + arr[alias_arr[i].index] = alias_arr[i].alias_name; } } return arr; diff --git a/test/test_cpp20.cpp b/test/test_cpp20.cpp index 1d915371..41a63623 100644 --- a/test/test_cpp20.cpp +++ b/test/test_cpp20.cpp @@ -23,7 +23,7 @@ struct ylt::reflection::ylt_alias_struct { static constexpr std::string_view get_alias_struct_name() { return "point"; } static constexpr auto get_alias_field_names() { - return std::make_tuple(field_alias_t<0>{"X"}, field_alias_t<1>{"Y"}); + return std::array{field_alias_t{"X", 0}, field_alias_t{"Y", 1}}; } }; struct test_variant { @@ -253,8 +253,8 @@ TEST_CASE("test xml") { constexpr auto names = ylt::reflection::get_member_names(); constexpr auto st_name = ylt::reflection::get_struct_name(); CHECK(names == std::array{"X", "Y"}); - CHECK(alias_names[0].second == "X"); - CHECK(alias_names[1].second == "Y"); + CHECK(alias_names[0].alias_name == "X"); + CHECK(alias_names[1].alias_name == "Y"); CHECK(st_name == "point"); constexpr auto name1 = ylt::reflection::get_struct_name(); diff --git a/test/test_xml.cpp b/test/test_xml.cpp index cdc63833..3105179e 100644 --- a/test/test_xml.cpp +++ b/test/test_xml.cpp @@ -739,7 +739,7 @@ struct ylt::reflection::ylt_alias_struct { static constexpr std::string_view get_alias_struct_name() { return "next"; } static constexpr auto get_alias_field_names() { - return std::make_tuple(field_alias_t<0>{"w"}, field_alias_t<1>{"h"}); + return std::array{field_alias_t{"w", 0}, field_alias_t{"h", 1}}; } }; @@ -755,7 +755,7 @@ struct ylt::reflection::ylt_alias_struct { static constexpr std::string_view get_alias_struct_name() { return "qi"; } static constexpr auto get_alias_field_names() { - return std::make_tuple(field_alias_t<0>{"w"}, field_alias_t<1>{"h"}); + return std::array{field_alias_t{"w", 0}, field_alias_t{"h", 1}}; } };