5#include <reflection-cpp/reflection.hpp>
18 template <
typename MemberPo
inter>
21 template <
typename Class,
typename Member>
22 struct MemberPointee<Member Class::*>
37template <
auto... MemberPointers>
41 static constexpr std::size_t
Count =
sizeof...(MemberPointers);
48 template <std::
size_t I>
49 using TypeAt = detail::MemberPointee<std::tuple_element_t<I, std::tuple<
decltype(MemberPointers)...>>>::type;
55 template <
typename Record,
typename Callable>
58 auto&& visitor = std::forward<Callable>(callable);
64 [&]<std::size_t... I>(std::index_sequence<I...> ) {
65 (visitor.template operator()<I>(MemberAt<I>(record)), ...);
66 }(std::make_index_sequence<Count> {});
70 template <
typename Callable>
73 auto&& visitor = std::forward<Callable>(callable);
74 [&]<std::size_t... I>(std::index_sequence<I...> ) {
75 (visitor.template operator()<I,
TypeAt<I>>(), ...);
76 }(std::make_index_sequence<Count> {});
81 template <
typename ElementMask,
typename Record,
typename Callable>
84 auto&& visitor = std::forward<Callable>(callable);
85 [&]<std::size_t... I>(std::integer_sequence<std::size_t, I...> ) {
86 (visitor.template operator()<I>(MemberAt<I>(record)), ...);
91 template <std::
size_t I,
typename Record>
92 static constexpr decltype(
auto)
MemberAt(Record& record)
96 return std::get<I>(std::tie(record.*MemberPointers...));
122template <
typename Record>
127template <
typename Record>
129 { Description<std::remove_cvref_t<Record>>::FieldCount } -> std::convertible_to<std::size_t>;
136 template <std::
size_t I,
typename Record,
bool HasDescriptor>
137 struct RecordMemberTypeOfDispatch
142 template <std::
size_t I,
typename Record>
143 struct RecordMemberTypeOfDispatch<I, Record, false>
145 using type = Reflection::MemberTypeOf<I, Record>;
151template <
typename Record>
154 return Description<std::remove_cvref_t<Record>>::FieldCount;
156 return Reflection::CountMembers<Record>;
161template <std::
size_t I,
typename Record>
166template <std::
size_t I,
typename Record>
170 return Description<std::remove_cvref_t<Record>>::Members::template MemberAt<I>(record);
172 return Reflection::GetMemberAt<I>(std::forward<Record>(record));
180template <
typename Record,
typename Callable>
184 Description<std::remove_cvref_t<Record>>::Members::EnumerateValues(record, std::forward<Callable>(callable));
186 Reflection::EnumerateMembers(record, std::forward<Callable>(callable));
194template <
typename ElementMask,
typename Record,
typename Callable>
198 Description<std::remove_cvref_t<Record>>::Members::template EnumerateMaskedValues<ElementMask>(
199 record, std::forward<Callable>(callable));
201 Reflection::EnumerateMembers<ElementMask>(record, std::forward<Callable>(callable));
208template <
typename Record,
typename Callable>
212 Description<std::remove_cvref_t<Record>>::Members::EnumerateTypes(std::forward<Callable>(callable));
214 Reflection::EnumerateMembers<Record>(std::forward<Callable>(callable));
221template <
typename Record,
typename Callable,
typename ResultType>
224 ResultType result = initialValue;
225 EnumerateRecordMembers<Record>(
226 [&]<std::size_t I,
typename MemberType>() { result = callable.template operator()<I, MemberType>(result); });
Satisfied when a Description specialization exists for the given record type.
constexpr ResultType FoldRecordMembers(ResultType initialValue, Callable const &callable)
Folds over a record's members as result = callable<I, MemberType>(result).
constexpr decltype(auto) GetRecordMemberAt(Record &&record)
Returns a reference to the member at index I — from the descriptor if present, else via reflection.
constexpr std::size_t RecordMemberCount
Number of members in a record — from the descriptor if present, else via reflection.
constexpr void EnumerateRecordMembers(Record &record, Callable &&callable)
Invokes callable as callable<I>(member) for each member of record.
detail::RecordMemberTypeOfDispatch< I, std::remove_cvref_t< Record >, HasDescription< Record > >::type RecordMemberTypeOf
Type of the member at index I — from the descriptor if present, else via reflection.
Customization point providing pre-computed reflection metadata for a record type.
Compile-time list of a record's members, stored as pointers-to-member.
static constexpr std::size_t Count
Number of members in the list.
static constexpr void EnumerateMaskedValues(Record &record, Callable &&callable)
static constexpr void EnumerateTypes(Callable &&callable)
Invokes callable<I, MemberType>() for every member, in order.
detail::MemberPointee< std::tuple_element_t< I, std::tuple< decltype(MemberPointers)... > > >::type TypeAt
static constexpr decltype(auto) MemberAt(Record &record)
Returns a reference to the member at index I of record.
static constexpr void EnumerateValues(Record &record, Callable &&callable)