OGLplus  (0.59.0) a C++ wrapper for rendering APIs

data_members.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_REFLECT_DATA_MEMBERS_HPP
10 #define EAGINE_REFLECT_DATA_MEMBERS_HPP
11 
12 #include "../selector.hpp"
13 #include "map_data_members.hpp"
14 
15 namespace eagine {
16 //------------------------------------------------------------------------------
17 template <typename F, typename S, identifier_t Id>
18 constexpr auto
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});
23 }
24 //------------------------------------------------------------------------------
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>>...>{};
29 }
30 
31 template <
32  typename T,
33  typename Selector,
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));
37 }
38 //------------------------------------------------------------------------------
39 template <typename T, typename Selector>
40 constexpr auto _do_map_single_data_member(
41  string_view name,
42  const T& ref,
43  Selector,
44  std::false_type) noexcept {
45  return std::pair<string_view, const T&>(name, ref);
46 }
47 //------------------------------------------------------------------------------
48 template <typename T, typename Selector>
49 constexpr auto _do_map_single_data_member(
50  string_view name,
51  T& ref,
52  Selector,
53  std::false_type) noexcept {
54  return std::pair<string_view, T&>(name, ref);
55 }
56 //------------------------------------------------------------------------------
57 template <typename T, typename Selector>
58 constexpr auto _do_map_single_data_member(
59  string_view name,
60  const T& ref,
61  Selector select,
62  std::true_type) noexcept {
63  return std::make_pair(name, map_data_members(ref, select));
64 }
65 //------------------------------------------------------------------------------
66 template <typename T, typename Selector>
67 constexpr auto _do_map_single_data_member(
68  string_view name,
69  T& ref,
70  Selector select,
71  std::true_type) noexcept {
72  return std::make_pair(name, map_data_members(ref, select));
73 }
74 //------------------------------------------------------------------------------
75 template <typename T, typename Selector>
76 constexpr auto _map_single_data_member(
77  string_view name,
78  const T& ref,
79  Selector select) noexcept {
80  return _do_map_single_data_member(
81  name, ref, select, has_data_member_mapping_t<T, Selector>());
82 }
83 //------------------------------------------------------------------------------
84 template <typename T, typename Selector>
85 constexpr auto
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>());
89 }
90 //------------------------------------------------------------------------------
91 template <typename T, typename Selector, typename Mapping, std::size_t... I>
92 constexpr auto _map_data_members_impl(
93  const T& instance,
94  Selector select,
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)),
100  select)...);
101 }
102 //------------------------------------------------------------------------------
103 template <typename T, typename Selector, typename Mapping, std::size_t... I>
104 constexpr auto _map_data_members_impl(
105  T& instance,
106  Selector select,
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)),
112  select)...);
113 }
114 //------------------------------------------------------------------------------
115 template <typename T, typename Selector, typename C, typename... M>
116 constexpr auto do_map_data_members(
117  T& instance,
118  Selector select,
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)>());
122 }
123 //------------------------------------------------------------------------------
124 template <typename T, identifier_t Id>
125 constexpr auto
126 map_data_members(const T& instance, selector<Id> select) noexcept {
127  return do_map_data_members(
128  instance,
129  select,
130  data_member_mapping(type_identity<std::remove_cv_t<T>>(), select));
131 }
132 //------------------------------------------------------------------------------
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(
136  instance,
137  select,
138  data_member_mapping(type_identity<std::remove_cv_t<T>>(), select));
139 }
140 //------------------------------------------------------------------------------
141 template <typename T>
142 constexpr auto map_data_members(const T& instance) noexcept {
143  return map_data_members(instance, default_selector);
144 }
145 //------------------------------------------------------------------------------
146 template <typename T>
147 constexpr auto map_data_members(T& instance) noexcept {
148  return map_data_members(instance, default_selector);
149 }
150 //------------------------------------------------------------------------------
151 } // namespace eagine
152 
153 #endif // EAGINE_REFLECT_DATA_MEMBERS_HPP
basic_string_span< const char > string_view
Alias for const string views.
Definition: string_span.hpp:116
Common code is placed in this namespace.
Definition: eagine.hpp:21
constexpr const default_selector_t default_selector
The default overload selector constant.
Definition: selector.hpp:34

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).