LeviLamina
Loading...
Searching...
No Matches
Concepts.h
1#pragma once
2
3#include <string>
4#include <tuple>
5#include <utility>
6
7#include "ll/api/base/Macro.h"
8#include "ll/api/base/StdInt.h"
9#include "ll/api/base/TypeTraits.h"
10
11namespace ll {
12class Error;
13}
14namespace ll::concepts {
15
16using traits::Require;
17
18template <class T, class U>
19concept IsInTypes = traits::is_in_types_v<T, U>;
20
21template <class T, class... Ts>
22concept IsOneOf = traits::is_one_of_v<T, Ts...>;
23
24template <class T>
25concept IsString = traits::is_string_v<T>;
26
27template <class T>
28concept IsExpected = requires(T e) {
29 typename std::remove_cvref_t<T>::value_type;
30 typename std::remove_cvref_t<T>::error_type;
31 typename std::remove_cvref_t<T>::unexpected_type;
32 e.has_value();
33 e.error();
34 requires std::is_same_v<void, typename std::remove_cvref_t<T>::value_type> || requires(T e) { e.value(); };
35};
36
37template <class T>
38concept IsLeviExpected = IsExpected<T> && std::same_as<typename std::remove_cvref_t<T>::error_type, Error>;
39
40template <class T>
41concept IsOptional = !IsExpected<T> && requires(T o) {
42 o.value();
43 o.has_value();
44 o.operator*();
45 typename std::remove_cvref_t<T>::value_type;
46};
47
48template <class T>
49concept RangeLoopable = std::is_bounded_array_v<std::remove_cvref_t<T>> || requires(T t) {
50 t.begin();
51 t.end();
52} || requires(T t) {
53 begin(t);
54 end(t);
55};
56
57template <class T>
58concept Associative = RangeLoopable<T> && requires {
59 typename std::remove_cvref_t<T>::key_type;
60 typename std::remove_cvref_t<T>::mapped_type;
61};
62
63template <class T>
64concept IsDispatcher = requires(T t) {
65 typename std::remove_cvref_t<T>::storage_type;
66 typename std::remove_cvref_t<T>::listener_type;
67 t.storage;
68 t.call();
69};
70
71struct LL_EBO VectorBaseTag {};
72
73template <typename T>
74concept IsVectorBase = std::is_base_of_v<VectorBaseTag, T>;
75
76template <class T, template <class...> class Z>
77concept Specializes = traits::is_specialization_of_v<T, Z>;
78
79template <class T>
80concept TupleLike = requires(T t) {
81 std::tuple_size<std::remove_cvref_t<T>>::value;
82 std::get<0>(t);
83};
84
85template <class T>
86concept ArrayLike = RangeLoopable<T> && !requires { typename std::remove_cvref_t<T>::mapped_type; };
87
88template <class T, template <class...> class Z>
89concept DerivedFromSpecializes = traits::is_derived_from_specialization_of_v<T, Z>;
90
91template <class T>
92concept Stringable = requires(T t) {
93 requires requires {
94 { t.toString() } -> IsString;
95 } || requires {
96 { t.to_string() } -> IsString;
97 };
98};
99
100template <class T>
101concept VirtualCloneable = traits::is_virtual_cloneable_v<T>;
102
103template <class T>
104concept Awaitable = traits::is_awaitable_v<T>;
105
106} // namespace ll::concepts
Definition Concepts.h:86
Definition Concepts.h:58
Definition Concepts.h:104
Definition Concepts.h:89
Definition Concepts.h:64
Definition Concepts.h:28
Definition Concepts.h:19
Definition Concepts.h:38
Definition Concepts.h:22
Definition Concepts.h:41
Definition Concepts.h:25
Definition Concepts.h:74
Definition Concepts.h:49
Definition Concepts.h:77
Definition Concepts.h:92
Definition Concepts.h:80
Definition Concepts.h:101
Definition Concepts.h:71