Skip to content

Commit

Permalink
add get_members_fieldname_map.
Browse files Browse the repository at this point in the history
  • Loading branch information
171930433 committed Jun 19, 2024
1 parent cb91e08 commit 0042719
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 17 deletions.
29 changes: 12 additions & 17 deletions include/ylt/standalone/iguana/pb_util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,25 +54,20 @@ struct base_impl : public base {
}

std::any get_field_any(std::string_view name) const override {
static constexpr auto map = iguana::get_members<T>();
std::any result;
for (auto const& [no, field] : map) {
if (result.has_value()) {
break;
}
static constexpr auto map = iguana::get_members_fieldname_map<T>();

std::visit(
[&](auto val) {
if (val.field_name == name) {
auto const offset = member_offset((T*)this, val.member_ptr);
auto const ptr = (((char*)this) + offset);
using value_type = typename decltype(val)::value_type;
result = *((value_type*)ptr);
}
},
field);
if (map.find(name) == map.end()) {
return {};
}
return result;

return std::visit(
[&](auto val) {
auto const offset = member_offset((T*)this, val.member_ptr);
auto const ptr = (((char*)this) + offset);
using value_type = typename decltype(val)::value_type;
return std::any{*((value_type*)ptr)};
},
map.at(name));
}

iguana::detail::field_info get_field_info(std::string_view name) override {
Expand Down
22 changes: 22 additions & 0 deletions include/ylt/standalone/iguana/reflection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,13 @@ constexpr auto inline get_members_impl(Tuple &&tp, std::index_sequence<I...>) {
T{std::in_place_index<I>, std::move(std::get<I>(tp))}}...};
}

template <typename T, size_t Size, typename Tuple, size_t... I>
constexpr auto inline get_members_fieldname_map_impl(Tuple &&tp, std::index_sequence<I...>) {
return frozen::unordered_map<frozen::string, T, sizeof...(I)>{
{std::get<I>(tp).field_name,
T{std::in_place_index<I>, std::move(std::get<I>(tp))}}...};
}

template <typename T>
constexpr size_t count_variant_size() {
if constexpr (is_variant<T>::value) {
Expand Down Expand Up @@ -912,6 +919,21 @@ constexpr inline auto get_members() {
}
}

template <typename T>
constexpr inline auto get_members_fieldname_map() {
if constexpr (is_reflection_v<T> || is_custom_reflection_v<T>) {
constexpr auto tp = get_members_tuple<T>();
using Tuple = std::decay_t<decltype(tp)>;
using value_type = typename field_type_t<Tuple>::value_type;
constexpr auto Size = tuple_type_count<Tuple>();
return get_members_fieldname_map_impl<value_type, Size>(tp,
std::make_index_sequence<Size>{});
}
else {
static_assert(!sizeof(T), "expected reflection or custom reflection");
}
}

#define REFLECTION(STRUCT_NAME, ...) \
MAKE_META_DATA(STRUCT_NAME, #STRUCT_NAME, GET_ARG_COUNT(__VA_ARGS__), \
__VA_ARGS__)
Expand Down

0 comments on commit 0042719

Please sign in to comment.