Iros
 
Loading...
Searching...
No Matches
field.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/core.h"
6#include "di/meta/language.h"
8
9namespace di::reflection {
10template<container::FixedString field_name, auto field_pointer>
11requires(concepts::MemberObjectPointer<decltype(field_pointer)>)
12struct Field {
13 constexpr static auto name = field_name;
14 constexpr static auto pointer = field_pointer;
15
18
19 template<typename T>
20 requires(concepts::Invocable<decltype(pointer), T>)
21 constexpr static auto get(T&& object) -> decltype(auto) {
22 return function::invoke(pointer, util::forward<T>(object));
23 }
24
25 constexpr static auto is_fields() -> bool { return false; }
26 constexpr static auto is_field() -> bool { return true; }
27 constexpr static auto is_enumerator() -> bool { return false; }
28 constexpr static auto is_enumerators() -> bool { return false; }
29 constexpr static auto is_atom() -> bool { return false; }
30 constexpr static auto is_integer() -> bool { return false; }
31 constexpr static auto is_bool() -> bool { return false; }
32 constexpr static auto is_string() -> bool { return false; }
33 constexpr static auto is_list() -> bool { return false; }
34 constexpr static auto is_map() -> bool { return false; }
35
36 auto operator==(Field const&) const -> bool = default;
37 auto operator<=>(Field const&) const = default;
38};
39
40template<container::FixedString field_name, auto field_pointer>
41requires(concepts::MemberObjectPointer<decltype(field_pointer)>)
43}
44
45namespace di::concepts {
46template<typename T>
47concept Field = requires {
48 { T::is_field() } -> concepts::SameAs<bool>;
49} && T::is_field();
50}
51
52namespace di::reflection {
53template<concepts::Constexpr ClassName, concepts::Field... Fs>
54struct Fields : vocab::Tuple<Fs...> {
55 constexpr static auto name = ClassName::value;
56
57 constexpr static auto is_fields() -> bool { return true; }
58 constexpr static auto is_field() -> bool { return false; }
59 constexpr static auto is_enumerator() -> bool { return false; }
60 constexpr static auto is_enumerators() -> bool { return false; }
61 constexpr static auto is_atom() -> bool { return false; }
62 constexpr static auto is_integer() -> bool { return false; }
63 constexpr static auto is_bool() -> bool { return false; }
64 constexpr static auto is_string() -> bool { return false; }
65 constexpr static auto is_list() -> bool { return false; }
66 constexpr static auto is_map() -> bool { return false; }
67};
68
69namespace detail {
70 template<container::FixedString class_name>
72 template<concepts::Field... Fs>
73 constexpr auto operator()(Fs...) const {
74 return Fields<meta::Constexpr<class_name>, Fs...> {};
75 }
76 };
77}
78
79template<container::FixedString class_name>
81}
82
83namespace di {
84using reflection::Field;
86using reflection::Fields;
88}
Definition tuple_forward_declaration.h:5
Checks if T is a Constexpr instance.
Definition constexpr.h:270
Definition field.h:47
Definition invoke.h:58
Definition language.h:203
Definition core.h:114
Definition any_storable.h:9
constexpr auto invoke
Definition invoke.h:100
Definition json_deserializer.h:532
Type< detail::MemberPointerValueHelper< RemoveCV< T > > > MemberPointerValue
Definition language.h:184
Type< detail::MemberPointerClassHelper< RemoveCV< T > > > MemberPointerClass
Definition language.h:195
Definition atom.h:8
constexpr auto make_fields
Definition field.h:80
constexpr auto field
Definition field.h:42
Definition zstring_parser.h:9
Definition field.h:12
static constexpr auto is_enumerator() -> bool
Definition field.h:27
auto operator==(Field const &) const -> bool=default
static constexpr auto get(T &&object) -> decltype(auto)
Definition field.h:21
static constexpr auto is_fields() -> bool
Definition field.h:25
static constexpr auto is_map() -> bool
Definition field.h:34
static constexpr auto name
Definition field.h:13
static constexpr auto is_list() -> bool
Definition field.h:33
static constexpr auto is_string() -> bool
Definition field.h:32
static constexpr auto is_bool() -> bool
Definition field.h:31
static constexpr auto is_enumerators() -> bool
Definition field.h:28
meta::MemberPointerValue< decltype(pointer)> Type
Definition field.h:17
static constexpr auto pointer
Definition field.h:14
static constexpr auto is_atom() -> bool
Definition field.h:29
auto operator<=>(Field const &) const =default
static constexpr auto is_integer() -> bool
Definition field.h:30
meta::MemberPointerClass< decltype(pointer)> Object
Definition field.h:16
static constexpr auto is_field() -> bool
Definition field.h:26
Definition field.h:54
static constexpr auto is_integer() -> bool
Definition field.h:62
static constexpr auto is_atom() -> bool
Definition field.h:61
static constexpr auto name
Definition field.h:55
static constexpr auto is_map() -> bool
Definition field.h:66
static constexpr auto is_list() -> bool
Definition field.h:65
static constexpr auto is_string() -> bool
Definition field.h:64
static constexpr auto is_enumerator() -> bool
Definition field.h:59
static constexpr auto is_enumerators() -> bool
Definition field.h:60
static constexpr auto is_bool() -> bool
Definition field.h:63
static constexpr auto is_fields() -> bool
Definition field.h:57
static constexpr auto is_field() -> bool
Definition field.h:58
constexpr auto operator()(Fs...) const
Definition field.h:73