di 0.1.0
Loading...
Searching...
No Matches
atom.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/language.h"
6#include "di/meta/util.h"
9
10namespace di::reflection {
11template<typename T>
12struct Atom {
13 using Type = T;
14
15 template<typename U>
17 constexpr static auto get(U&& value) -> decltype(auto) {
19 return (util::forward<U>(value));
20 } else {
21 return T(util::forward<U>(value));
22 }
23 }
24
25 constexpr static auto is_fields() -> bool { return false; }
26 constexpr static auto is_field() -> bool { return false; }
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 true; }
30 constexpr static auto is_integer() -> bool { return concepts::Integer<T>; }
31 constexpr static auto is_bool() -> bool { return concepts::SameAs<T, bool>; }
32 constexpr static auto is_string() -> bool { return concepts::detail::ConstantString<T>; }
33 constexpr static auto is_list() -> bool {
34 return concepts::Container<T> && !is_string() && !is_box() && !is_map() && !is_tuple();
35 }
36 constexpr static auto is_tuple() -> bool {
37 return !is_box() && !is_string() && !is_map() && concepts::TupleLike<T>;
38 }
39 constexpr static auto is_map() -> bool {
40 return requires {
43 };
44 }
45 constexpr static auto is_variant() -> bool { return concepts::VariantLike<T>; }
46 constexpr static auto is_box() -> bool { return concepts::InstanceOf<T, Box>; }
47 constexpr static auto is_custom_atom() -> bool {
48 return requires { typename T::IsAtom; };
49 }
50
51 auto operator==(Atom const&) const -> bool = default;
52 auto operator<=>(Atom const&) const = default;
53};
54
55template<typename T>
56constexpr inline auto atom = Atom<T> {};
57}
58
59namespace di {
60using reflection::Atom;
62}
Definition operations.h:11
Definition container.h:8
Definition core.h:139
Definition language.h:215
Definition core.h:114
Definition tuple_like.h:38
Definition variant_like.h:37
constexpr auto TupleSize
Definition tuple_size.h:23
Definition atom.h:10
constexpr auto atom
Definition atom.h:56
Definition any_storable.h:9
Definition atom.h:12
static constexpr auto is_enumerator() -> bool
Definition atom.h:27
static constexpr auto is_map() -> bool
Definition atom.h:39
static constexpr auto is_custom_atom() -> bool
Definition atom.h:47
static constexpr auto is_integer() -> bool
Definition atom.h:30
static constexpr auto is_fields() -> bool
Definition atom.h:25
static constexpr auto is_string() -> bool
Definition atom.h:32
static constexpr auto is_variant() -> bool
Definition atom.h:45
auto operator==(Atom const &) const -> bool=default
static constexpr auto is_list() -> bool
Definition atom.h:33
auto operator<=>(Atom const &) const =default
static constexpr auto is_bool() -> bool
Definition atom.h:31
static constexpr auto is_field() -> bool
Definition atom.h:26
static constexpr auto get(U &&value) -> decltype(auto)
Definition atom.h:17
T Type
Definition atom.h:13
static constexpr auto is_tuple() -> bool
Definition atom.h:36
static constexpr auto is_enumerators() -> bool
Definition atom.h:28
static constexpr auto is_atom() -> bool
Definition atom.h:29
static constexpr auto is_box() -> bool
Definition atom.h:46