Iros
 
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>
10requires(concepts::Enum<decltype(enumerator_value)>)
11struct Enumerator {
12 constexpr static auto name = enumerator_name;
13 constexpr static auto value = enumerator_value;
14
15 using Type = decltype(enumerator_value);
16
17 constexpr static auto get() -> Type { return value; }
18
19 constexpr static auto is_fields() -> bool { return false; }
20 constexpr static auto is_field() -> bool { return false; }
21 constexpr static auto is_enumerator() -> bool { return true; }
22 constexpr static auto is_enumerators() -> bool { return false; }
23 constexpr static auto is_atom() -> bool { return false; }
24 constexpr static auto is_integer() -> bool { return false; }
25 constexpr static auto is_bool() -> bool { return false; }
26 constexpr static auto is_string() -> bool { return false; }
27 constexpr static auto is_list() -> bool { return false; }
28 constexpr static auto is_map() -> bool { return false; }
29
30 auto operator==(Enumerator const&) const -> bool = default;
31 auto operator<=>(Enumerator const&) const = default;
32};
33
34template<container::FixedString enumerator_name, auto enumerator_value>
35requires(concepts::Enum<decltype(enumerator_value)>)
37}
38
39namespace di::concepts {
40template<typename T>
41concept Enumerator = requires {
42 { T::is_enumerator() } -> concepts::SameAs<bool>;
43} && T::is_enumerator();
44}
45
46namespace di::reflection {
47template<concepts::Constexpr EnumName, concepts::Enumerator... Es>
48struct Enumerators : vocab::Tuple<Es...> {
49 constexpr static auto name = EnumName::value;
50
51 constexpr static auto is_fields() -> bool { return false; }
52 constexpr static auto is_field() -> bool { return false; }
53 constexpr static auto is_enumerator() -> bool { return false; }
54 constexpr static auto is_enumerators() -> bool { return true; }
55 constexpr static auto is_atom() -> bool { return false; }
56 constexpr static auto is_integer() -> bool { return false; }
57 constexpr static auto is_bool() -> bool { return false; }
58 constexpr static auto is_string() -> bool { return false; }
59 constexpr static auto is_list() -> bool { return false; }
60 constexpr static auto is_map() -> bool { return false; }
61};
62
63namespace detail {
64 template<container::FixedString enum_name>
66 template<concepts::Enumerator... Es>
67 constexpr auto operator()(Es...) const {
69 }
70 };
71}
72
73template<container::FixedString enum_name>
75}
76
77namespace di {
78using reflection::Enumerator;
80using reflection::Enumerators;
82}
Definition tuple_forward_declaration.h:5
Checks if T is a Constexpr instance.
Definition constexpr.h:270
Definition language.h:259
Definition enumerator.h:41
Definition core.h:114
Definition any_storable.h:9
Definition json_deserializer.h:532
Definition atom.h:8
constexpr auto enumerator
Definition enumerator.h:36
constexpr auto make_enumerators
Definition enumerator.h:74
Definition zstring_parser.h:9
Definition enumerator.h:11
static constexpr auto is_bool() -> bool
Definition enumerator.h:25
static constexpr auto is_atom() -> bool
Definition enumerator.h:23
static constexpr auto is_list() -> bool
Definition enumerator.h:27
static constexpr auto get() -> Type
Definition enumerator.h:17
auto operator==(Enumerator const &) const -> bool=default
static constexpr auto is_fields() -> bool
Definition enumerator.h:19
auto operator<=>(Enumerator const &) const =default
decltype(enumerator_value) Type
Definition enumerator.h:15
static constexpr auto is_string() -> bool
Definition enumerator.h:26
static constexpr auto value
Definition enumerator.h:13
static constexpr auto is_integer() -> bool
Definition enumerator.h:24
static constexpr auto is_enumerators() -> bool
Definition enumerator.h:22
static constexpr auto is_enumerator() -> bool
Definition enumerator.h:21
static constexpr auto name
Definition enumerator.h:12
static constexpr auto is_field() -> bool
Definition enumerator.h:20
static constexpr auto is_map() -> bool
Definition enumerator.h:28
Definition enumerator.h:48
static constexpr auto is_map() -> bool
Definition enumerator.h:60
static constexpr auto is_atom() -> bool
Definition enumerator.h:55
static constexpr auto is_integer() -> bool
Definition enumerator.h:56
static constexpr auto is_enumerators() -> bool
Definition enumerator.h:54
static constexpr auto is_string() -> bool
Definition enumerator.h:58
static constexpr auto is_fields() -> bool
Definition enumerator.h:51
static constexpr auto is_enumerator() -> bool
Definition enumerator.h:53
static constexpr auto is_field() -> bool
Definition enumerator.h:52
static constexpr auto name
Definition enumerator.h:49
static constexpr auto is_list() -> bool
Definition enumerator.h:59
static constexpr auto is_bool() -> bool
Definition enumerator.h:57
constexpr auto operator()(Es...) const
Definition enumerator.h:67