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, container::FixedString field_description>
11requires(concepts::MemberObjectPointer<decltype(field_pointer)>)
12struct Field {
13 constexpr static auto name = field_name;
14 constexpr static auto pointer = field_pointer;
15 constexpr static auto description = field_description;
16
19
20 template<typename T>
21 requires(concepts::Invocable<decltype(pointer), T>)
22 constexpr static auto get(T&& object) -> decltype(auto) {
23 return function::invoke(pointer, util::forward<T>(object));
24 }
25
26 constexpr static auto is_fields() -> bool { return false; }
27 constexpr static auto is_field() -> bool { return true; }
28 constexpr static auto is_enumerator() -> bool { return false; }
29 constexpr static auto is_enumerators() -> bool { return false; }
30 constexpr static auto is_atom() -> bool { return false; }
31 constexpr static auto is_integer() -> bool { return false; }
32 constexpr static auto is_bool() -> bool { return false; }
33 constexpr static auto is_string() -> bool { return false; }
34 constexpr static auto is_list() -> bool { return false; }
35 constexpr static auto is_tuple() -> bool { return false; }
36 constexpr static auto is_map() -> bool { return false; }
37 constexpr static auto is_variant() -> bool { return false; }
38 constexpr static auto is_box() -> bool { return false; }
39 constexpr static auto is_custom_atom() -> bool { return false; }
40
41 auto operator==(Field const&) const -> bool = default;
42 auto operator<=>(Field const&) const = default;
43};
44
45template<container::FixedString field_name, auto field_pointer, container::FixedString description = "">
46requires(concepts::MemberObjectPointer<decltype(field_pointer)>)
48}
49
50namespace di::concepts {
51template<typename T>
52concept Field = requires {
53 { T::is_field() } -> concepts::SameAs<bool>;
54} && T::is_field();
55}
56
57namespace di::reflection {
58template<concepts::Constexpr ClassName, concepts::Constexpr Description, concepts::Field... Fs>
59struct Fields : vocab::Tuple<Fs...> {
60 constexpr static auto name = ClassName::value;
61 constexpr static auto description = Description::value;
62
63 constexpr static auto is_fields() -> bool { return true; }
64 constexpr static auto is_field() -> bool { return false; }
65 constexpr static auto is_enumerator() -> bool { return false; }
66 constexpr static auto is_enumerators() -> bool { return false; }
67 constexpr static auto is_atom() -> bool { return false; }
68 constexpr static auto is_integer() -> bool { return false; }
69 constexpr static auto is_bool() -> bool { return false; }
70 constexpr static auto is_string() -> bool { return false; }
71 constexpr static auto is_list() -> bool { return false; }
72 constexpr static auto is_tuple() -> bool { return false; }
73 constexpr static auto is_map() -> bool { return false; }
74 constexpr static auto is_variant() -> bool { return false; }
75 constexpr static auto is_box() -> bool { return false; }
76 constexpr static auto is_custom_atom() -> bool { return false; }
77};
78
79namespace detail {
80 template<container::FixedString class_name, container::FixedString description>
81 struct MakeFieldsFunction {
82 template<concepts::Field... Fs>
83 constexpr auto operator()(Fs...) const {
85 }
86 };
87}
88
89template<container::FixedString class_name, container::FixedString description = "">
90constexpr inline auto make_fields = detail::MakeFieldsFunction<class_name, description> {};
91}
92
93namespace di {
94using reflection::Field;
96using reflection::Fields;
98}
Definition fixed_string.h:12
Definition tuple.h:27
Checks if T is a Constexpr instance.
Definition constexpr.h:270
Definition field.h:52
Definition invoke.h:58
Definition language.h:203
Definition core.h:114
Definition any_storable.h:9
FixedString(char const (&)[size]) -> FixedString< size - 1 >
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:90
constexpr auto field
Definition field.h:47
Definition any_storable.h:9
A wrapper for a constexpr value.
Definition constexpr.h:36
Definition field.h:12
static constexpr auto pointer
Definition field.h:14
auto operator<=>(Field const &) const =default
static constexpr auto is_box() -> bool
Definition field.h:38
meta::MemberPointerValue< decltype(pointer)> Type
Definition field.h:18
static constexpr auto is_bool() -> bool
Definition field.h:32
static constexpr auto is_fields() -> bool
Definition field.h:26
static constexpr auto is_variant() -> bool
Definition field.h:37
static constexpr auto is_list() -> bool
Definition field.h:34
static constexpr auto description
Definition field.h:15
static constexpr auto is_custom_atom() -> bool
Definition field.h:39
meta::MemberPointerClass< decltype(pointer)> Object
Definition field.h:17
static constexpr auto is_enumerators() -> bool
Definition field.h:29
static constexpr auto is_integer() -> bool
Definition field.h:31
static constexpr auto name
Definition field.h:13
static constexpr auto is_enumerator() -> bool
Definition field.h:28
static constexpr auto is_string() -> bool
Definition field.h:33
static constexpr auto get(T &&object) -> decltype(auto)
Definition field.h:22
static constexpr auto is_atom() -> bool
Definition field.h:30
static constexpr auto is_tuple() -> bool
Definition field.h:35
static constexpr auto is_map() -> bool
Definition field.h:36
static constexpr auto is_field() -> bool
Definition field.h:27
auto operator==(Field const &) const -> bool=default
Definition field.h:59
static constexpr auto is_map() -> bool
Definition field.h:73
static constexpr auto is_tuple() -> bool
Definition field.h:72
static constexpr auto is_list() -> bool
Definition field.h:71
static constexpr auto is_atom() -> bool
Definition field.h:67
static constexpr auto is_bool() -> bool
Definition field.h:69
static constexpr auto is_string() -> bool
Definition field.h:70
static constexpr auto is_custom_atom() -> bool
Definition field.h:76
static constexpr auto description
Definition field.h:61
static constexpr auto is_enumerator() -> bool
Definition field.h:65
static constexpr auto is_box() -> bool
Definition field.h:75
static constexpr auto is_fields() -> bool
Definition field.h:63
static constexpr auto is_integer() -> bool
Definition field.h:68
static constexpr auto is_variant() -> bool
Definition field.h:74
static constexpr auto is_field() -> bool
Definition field.h:64
static constexpr auto is_enumerators() -> bool
Definition field.h:66
static constexpr auto name
Definition field.h:60