di 0.1.0
Loading...
Searching...
No Matches
enumerator.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/core.h"
5#include "di/meta/language.h"
7
8namespace di::reflection {
9template<container::FixedString enumerator_name, auto enumerator_value, container::FixedString enumerator_description>
10requires(concepts::Enum<decltype(enumerator_value)>)
11struct Enumerator {
12 constexpr static auto name = enumerator_name;
13 constexpr static auto value = enumerator_value;
14 constexpr static auto description = enumerator_description;
15
16 using Type = decltype(enumerator_value);
17
18 constexpr static auto get() -> Type { return value; }
19
20 constexpr static auto is_fields() -> bool { return false; }
21 constexpr static auto is_field() -> bool { return false; }
22 constexpr static auto is_enumerator() -> bool { return true; }
23 constexpr static auto is_enumerators() -> bool { return false; }
24 constexpr static auto is_atom() -> bool { return false; }
25 constexpr static auto is_integer() -> bool { return false; }
26 constexpr static auto is_bool() -> bool { return false; }
27 constexpr static auto is_string() -> bool { return false; }
28 constexpr static auto is_list() -> bool { return false; }
29 constexpr static auto is_tuple() -> bool { return false; }
30 constexpr static auto is_map() -> bool { return false; }
31 constexpr static auto is_variant() -> bool { return false; }
32 constexpr static auto is_box() -> bool { return false; }
33 constexpr static auto is_custom_atom() -> bool { return false; }
34
35 auto operator==(Enumerator const&) const -> bool = default;
36 auto operator<=>(Enumerator const&) const = default;
37};
38
39template<container::FixedString enumerator_name, auto enumerator_value, container::FixedString description = "">
40requires(concepts::Enum<decltype(enumerator_value)>)
42}
43
44namespace di::concepts {
45template<typename T>
46concept Enumerator = requires {
47 { T::is_enumerator() } -> concepts::SameAs<bool>;
48} && T::is_enumerator();
49}
50
51namespace di::reflection {
52template<concepts::Constexpr EnumName, concepts::Constexpr Description, concepts::Enumerator... Es>
53struct Enumerators : vocab::Tuple<Es...> {
54 constexpr static auto name = EnumName::value;
55 constexpr static auto description = Description::value;
56
57 constexpr static auto is_fields() -> bool { return false; }
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 true; }
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_tuple() -> bool { return false; }
67 constexpr static auto is_map() -> bool { return false; }
68 constexpr static auto is_variant() -> bool { return false; }
69 constexpr static auto is_box() -> bool { return false; }
70 constexpr static auto is_custom_atom() -> bool { return false; }
71};
72
73namespace detail {
74 template<container::FixedString enum_name, container::FixedString description>
75 struct MakeEnumeratorsFunction {
76 template<concepts::Enumerator... Es>
77 constexpr auto operator()(Es...) const {
79 }
80 };
81}
82
83template<container::FixedString enum_name, container::FixedString description = "">
84constexpr inline auto make_enumerators = detail::MakeEnumeratorsFunction<enum_name, description> {};
85}
86
87namespace di {
88using reflection::Enumerator;
90using reflection::Enumerators;
92}
Definition fixed_string.h:12
Definition tuple.h:27
Checks if T is a Constexpr instance.
Definition constexpr.h:270
Definition language.h:259
Definition enumerator.h:46
Definition core.h:114
Definition any_storable.h:9
FixedString(char const (&)[size]) -> FixedString< size - 1 >
Definition atom.h:10
constexpr auto enumerator
Definition enumerator.h:41
constexpr auto make_enumerators
Definition enumerator.h:84
Definition any_storable.h:9
A wrapper for a constexpr value.
Definition constexpr.h:36
Definition enumerator.h:11
static constexpr auto is_string() -> bool
Definition enumerator.h:27
static constexpr auto is_atom() -> bool
Definition enumerator.h:24
decltype(enumerator_value) Type
Definition enumerator.h:16
static constexpr auto value
Definition enumerator.h:13
static constexpr auto is_field() -> bool
Definition enumerator.h:21
static constexpr auto is_box() -> bool
Definition enumerator.h:32
static constexpr auto is_bool() -> bool
Definition enumerator.h:26
static constexpr auto is_variant() -> bool
Definition enumerator.h:31
static constexpr auto is_custom_atom() -> bool
Definition enumerator.h:33
static constexpr auto is_fields() -> bool
Definition enumerator.h:20
static constexpr auto is_integer() -> bool
Definition enumerator.h:25
auto operator==(Enumerator const &) const -> bool=default
static constexpr auto is_enumerators() -> bool
Definition enumerator.h:23
static constexpr auto description
Definition enumerator.h:14
static constexpr auto name
Definition enumerator.h:12
static constexpr auto is_list() -> bool
Definition enumerator.h:28
static constexpr auto is_enumerator() -> bool
Definition enumerator.h:22
auto operator<=>(Enumerator const &) const =default
static constexpr auto is_tuple() -> bool
Definition enumerator.h:29
static constexpr auto is_map() -> bool
Definition enumerator.h:30
static constexpr auto get() -> Type
Definition enumerator.h:18
Definition enumerator.h:53
static constexpr auto is_list() -> bool
Definition enumerator.h:65
static constexpr auto is_variant() -> bool
Definition enumerator.h:68
static constexpr auto is_integer() -> bool
Definition enumerator.h:62
static constexpr auto description
Definition enumerator.h:55
static constexpr auto is_atom() -> bool
Definition enumerator.h:61
static constexpr auto is_string() -> bool
Definition enumerator.h:64
static constexpr auto is_custom_atom() -> bool
Definition enumerator.h:70
static constexpr auto is_enumerator() -> bool
Definition enumerator.h:59
static constexpr auto is_map() -> bool
Definition enumerator.h:67
static constexpr auto name
Definition enumerator.h:54
static constexpr auto is_field() -> bool
Definition enumerator.h:58
static constexpr auto is_fields() -> bool
Definition enumerator.h:57
static constexpr auto is_enumerators() -> bool
Definition enumerator.h:60
static constexpr auto is_tuple() -> bool
Definition enumerator.h:66
static constexpr auto is_box() -> bool
Definition enumerator.h:69
static constexpr auto is_bool() -> bool
Definition enumerator.h:63