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

map_data_members.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_REFLECT_MAP_DATA_MEMBERS_HPP
10 #define EAGINE_REFLECT_MAP_DATA_MEMBERS_HPP
11 
12 #include "../selector.hpp"
13 #include "../string_span.hpp"
14 #include <tuple>
15 #include <type_traits>
16 #include <utility>
17 
18 namespace eagine {
19 //------------------------------------------------------------------------------
20 template <typename C, typename... M>
21 constexpr auto
22 make_data_member_mapping(std::pair<string_view, M C::*>... m) noexcept {
23  return std::make_tuple(m...);
24 }
25 //------------------------------------------------------------------------------
26 template <typename T, typename Selector>
27 struct does_have_data_member_mapping {
28 private:
29  template <
30  typename X,
31  typename = decltype(data_member_mapping(type_identity<X>(), Selector()))>
32  static auto _test(X*) -> std::true_type;
33  static auto _test(...) -> std::false_type;
34 
35 public:
36  // NOLINTNEXTLINE(hicpp-vararg)
37  using type = decltype(_test(static_cast<std::remove_cv_t<T>*>(nullptr)));
38 };
39 //------------------------------------------------------------------------------
40 template <typename T, typename Selector = default_selector_t>
41 using has_data_member_mapping_t =
42  typename does_have_data_member_mapping<T, Selector>::type;
43 
44 template <typename T, typename Selector = default_selector_t>
45 constexpr const bool has_data_member_mapping_v =
46  has_data_member_mapping_t<T, Selector>::value;
47 //------------------------------------------------------------------------------
48 } // namespace eagine
49 
50 #endif // EAGINE_REFLECT_MAP_DATA_MEMBERS_HPP
Common code is placed in this namespace.
Definition: eagine.hpp:21

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