Skip to content

Commit

Permalink
feat(utils/member); add member_types
Browse files Browse the repository at this point in the history
  • Loading branch information
Curve committed Oct 27, 2024
1 parent 408b2b2 commit 22ae2f8
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
18 changes: 18 additions & 0 deletions include/rebind/utils/member.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,20 @@ namespace rebind::utils

namespace impl
{
template <typename T>
using member_types = decltype([]
{
constexpr auto arity = rebind::arity<T>;
using members = decltype(rebind::members<T>);

constexpr auto unpack = []<auto... Is>(std::index_sequence<Is...>)
{
return std::type_identity<std::tuple<typename std::tuple_element_t<Is, members>::type...>>{};
};

return unpack(std::make_index_sequence<arity>());
}())::type;

template <typename T>
static constexpr auto member_names = []
{
Expand All @@ -45,6 +59,10 @@ namespace rebind::utils
}();
} // namespace impl

template <typename T>
requires std::is_aggregate_v<T>
using member_types = impl::member_types<T>;

template <typename T>
requires std::is_aggregate_v<T>
static constexpr auto member_names = impl::member_names<T>;
Expand Down
7 changes: 7 additions & 0 deletions tests/member.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,11 @@ suite<"member"> member_test = []
expect(info.value == &simple::y);

static constexpr auto members = rebind::members<simple>;
using member_types = rebind::utils::member_types<simple>;
static constexpr auto names = rebind::utils::member_names<simple>;

expect(std::tuple_size_v<decltype(members)> == 4);
expect(std::tuple_size_v<member_types> == 4);
expect(names.size() == 4);

expect(std::get<0>(members).name == "x");
Expand All @@ -59,6 +61,11 @@ suite<"member"> member_test = []

expect(std::get<3>(members).index == 3);

expect(std::same_as<std::tuple_element_t<0, member_types>, int>);
expect(std::same_as<std::tuple_element_t<1, member_types>, float>);
expect(std::same_as<std::tuple_element_t<2, member_types>, double>);
expect(std::is_class_v<std::tuple_element_t<3, member_types>>);

expect(std::same_as<std::tuple_element_t<0, decltype(members)>::type, int>);
expect(std::same_as<std::tuple_element_t<1, decltype(members)>::type, float>);
expect(std::same_as<std::tuple_element_t<2, decltype(members)>::type, double>);
Expand Down

0 comments on commit 22ae2f8

Please sign in to comment.