9 #ifndef EAGINE_REFLECT_DATA_MEMBERS_HPP
10 #define EAGINE_REFLECT_DATA_MEMBERS_HPP
12 #include "../selector.hpp"
17 template <
typename F,
typename S,
identifier_t Id>
19 data_member_mapping(type_identity<std::pair<F, S>>, selector<Id>) noexcept {
20 using P = std::pair<F, S>;
21 return make_data_member_mapping<P, F, S>(
22 {
"first", &P::first}, {
"second", &P::second});
25 template <
typename C,
typename... M>
26 constexpr
auto data_member_tuple_from_mapping(
27 const std::tuple<std::pair<string_view, M C::*>...>&) noexcept {
28 return std::tuple<std::remove_cv_t<std::remove_reference_t<M>>...>{};
34 typename = std::enable_if_t<has_data_member_mapping_v<T, Selector>>>
35 constexpr
auto data_member_tuple(type_identity<T> tid, Selector sel) noexcept {
36 return data_member_tuple_from_mapping(data_member_mapping(tid, sel));
39 template <
typename T,
typename Selector>
40 constexpr
auto _do_map_single_data_member(
44 std::false_type) noexcept {
45 return std::pair<string_view, const T&>(name, ref);
48 template <
typename T,
typename Selector>
49 constexpr
auto _do_map_single_data_member(
53 std::false_type) noexcept {
54 return std::pair<string_view, T&>(name, ref);
57 template <
typename T,
typename Selector>
58 constexpr
auto _do_map_single_data_member(
62 std::true_type) noexcept {
63 return std::make_pair(name, map_data_members(ref, select));
66 template <
typename T,
typename Selector>
67 constexpr
auto _do_map_single_data_member(
71 std::true_type) noexcept {
72 return std::make_pair(name, map_data_members(ref, select));
75 template <
typename T,
typename Selector>
76 constexpr
auto _map_single_data_member(
79 Selector select) noexcept {
80 return _do_map_single_data_member(
81 name, ref, select, has_data_member_mapping_t<T, Selector>());
84 template <
typename T,
typename Selector>
86 _map_single_data_member(
string_view name, T& ref, Selector select) noexcept {
87 return _do_map_single_data_member(
88 name, ref, select, has_data_member_mapping_t<T, Selector>());
91 template <
typename T,
typename Selector,
typename Mapping, std::size_t... I>
92 constexpr
auto _map_data_members_impl(
95 const Mapping& mapping,
96 std::index_sequence<I...>) {
97 return std::make_tuple(_map_single_data_member(
98 std::get<0>(std::get<I>(mapping)),
99 instance.*std::get<1>(std::get<I>(mapping)),
103 template <
typename T,
typename Selector,
typename Mapping, std::size_t... I>
104 constexpr
auto _map_data_members_impl(
107 const Mapping& mapping,
108 std::index_sequence<I...>) {
109 return std::make_tuple(_map_single_data_member(
110 std::get<0>(std::get<I>(mapping)),
111 instance.*std::get<1>(std::get<I>(mapping)),
115 template <
typename T,
typename Selector,
typename C,
typename... M>
116 constexpr
auto do_map_data_members(
119 const std::tuple<std::pair<string_view, M C::*>...>& mapping) {
120 return _map_data_members_impl(
121 instance, select, mapping, std::make_index_sequence<
sizeof...(M)>());
124 template <
typename T,
identifier_t Id>
126 map_data_members(
const T& instance, selector<Id> select) noexcept {
127 return do_map_data_members(
130 data_member_mapping(type_identity<std::remove_cv_t<T>>(), select));
133 template <
typename T,
identifier_t Id>
134 constexpr
auto map_data_members(T& instance, selector<Id> select) noexcept {
135 return do_map_data_members(
138 data_member_mapping(type_identity<std::remove_cv_t<T>>(), select));
141 template <
typename T>
142 constexpr
auto map_data_members(
const T& instance) noexcept {
146 template <
typename T>
147 constexpr
auto map_data_members(T& instance) noexcept {
153 #endif // EAGINE_REFLECT_DATA_MEMBERS_HPP