di 0.1.0
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_tuple() -> bool { return false; }
35 constexpr static auto is_map() -> bool { return false; }
36 constexpr static auto is_variant() -> bool { return false; }
37 constexpr static auto is_box() -> bool { return false; }
38 constexpr static auto is_custom_atom() -> bool { return false; }
39
40 auto operator==(Field const&) const -> bool = default;
41 auto operator<=>(Field const&) const = default;
42};
43
44template<container::FixedString field_name, auto field_pointer>
45requires(concepts::MemberObjectPointer<decltype(field_pointer)>)
47}
48
49namespace di::concepts {
50template<typename T>
51concept Field = requires {
52 { T::is_field() } -> concepts::SameAs<bool>;
53} && T::is_field();
54}
55
56namespace di::reflection {
57template<concepts::Constexpr ClassName, concepts::Field... Fs>
58struct Fields : vocab::Tuple<Fs...> {
59 constexpr static auto name = ClassName::value;
60
61 constexpr static auto is_fields() -> bool { return true; }
62 constexpr static auto is_field() -> bool { return false; }
63 constexpr static auto is_enumerator() -> bool { return false; }
64 constexpr static auto is_enumerators() -> bool { return false; }
65 constexpr static auto is_atom() -> bool { return false; }
66 constexpr static auto is_integer() -> bool { return false; }
67 constexpr static auto is_bool() -> bool { return false; }
68 constexpr static auto is_string() -> bool { return false; }
69 constexpr static auto is_list() -> bool { return false; }
70 constexpr static auto is_tuple() -> bool { return false; }
71 constexpr static auto is_map() -> bool { return false; }
72 constexpr static auto is_variant() -> bool { return false; }
73 constexpr static auto is_box() -> bool { return false; }
74 constexpr static auto is_custom_atom() -> bool { return false; }
75};
76
77namespace detail {
78 template<container::FixedString class_name>
79 struct MakeFieldsFunction {
80 template<concepts::Field... Fs>
81 constexpr auto operator()(Fs...) const {
82 return Fields<meta::Constexpr<class_name>, Fs...> {};
83 }
84 };
85}
86
87template<container::FixedString class_name>
88constexpr inline auto make_fields = detail::MakeFieldsFunction<class_name> {};
89}
90
91namespace di {
92using reflection::Field;
94using reflection::Fields;
96}
Definition tuple.h:27
Checks if T is a Constexpr instance.
Definition constexpr.h:270
Definition field.h:51
Definition invoke.h:58
Definition language.h:203
Definition core.h:114
Definition any_storable.h:9
constexpr auto invoke
Definition invoke.h:100
Type< detail::MemberPointerValueHelper< RemoveCV< T > > > MemberPointerValue
Definition language.h:184
Type< detail::MemberPointerClassHelper< RemoveCV< T > > > MemberPointerClass
Definition language.h:195
Definition atom.h:10
constexpr auto make_fields
Definition field.h:88
constexpr auto field
Definition field.h:46
Definition any_storable.h:9
Definition field.h:12
static constexpr auto is_enumerator() -> bool
Definition field.h:27
static constexpr auto is_box() -> bool
Definition field.h:37
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:35
static constexpr auto name
Definition field.h:13
static constexpr auto is_list() -> bool
Definition field.h:33
static constexpr auto is_custom_atom() -> bool
Definition field.h:38
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_variant() -> bool
Definition field.h:36
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
static constexpr auto is_tuple() -> bool
Definition field.h:34
Definition field.h:58
static constexpr auto is_integer() -> bool
Definition field.h:66
static constexpr auto is_atom() -> bool
Definition field.h:65
static constexpr auto name
Definition field.h:59
static constexpr auto is_map() -> bool
Definition field.h:71
static constexpr auto is_list() -> bool
Definition field.h:69
static constexpr auto is_string() -> bool
Definition field.h:68
static constexpr auto is_variant() -> bool
Definition field.h:72
static constexpr auto is_enumerator() -> bool
Definition field.h:63
static constexpr auto is_enumerators() -> bool
Definition field.h:64
static constexpr auto is_bool() -> bool
Definition field.h:67
static constexpr auto is_fields() -> bool
Definition field.h:61
static constexpr auto is_custom_atom() -> bool
Definition field.h:74
static constexpr auto is_tuple() -> bool
Definition field.h:70
static constexpr auto is_field() -> bool
Definition field.h:62
static constexpr auto is_box() -> bool
Definition field.h:73