Skip to content
LeviMC
English
AutoLightDark
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::size_t... I>(T&& t, std::index_sequence<I...>) {
83 ((void)std::get<I>(std::forward<T>(t)), ...);
84 }(std::forward<T>(t), std::make_index_sequence<std::tuple_size<std::remove_cvref_t<T>>::value>{});
85};
86
87template <class T>
88concept ArrayLike = RangeLoopable<T> && !requires { typename std::remove_cvref_t<T>::mapped_type; };
89
90template <class T, template <class...> class Z>
91concept DerivedFromSpecializes = traits::is_derived_from_specialization_of_v<T, Z>;
92
93template <class T>
94concept Stringable = requires(T t) {
95 requires requires {
96 { t.toString() } -> IsString;
97 } || requires {
98 { t.to_string() } -> IsString;
99 };
100};
101
102template <class T>
103concept VirtualCloneable = traits::is_virtual_cloneable_v<T>;
104
105template <class T>
106concept Awaitable = traits::is_awaitable_v<T>;
107
108template <typename T>
109concept IsVariant = traits::is_variant_v<std::remove_cvref_t<T>>;
110
111template <typename T>
112concept IsStringConvertible = traits::is_string_convertible_v<std::remove_cvref_t<T>>;
113
114template <class J>
115concept BorrowableStringSource = requires(std::remove_cvref_t<J> const& value) {
116 typename std::remove_cvref_t<J>::string_t;
117 {
118 value.template get_ref<typename std::remove_cvref_t<J>::string_t const&>()
119 } -> std::same_as<typename std::remove_cvref_t<J>::string_t const&>;
120};
121
122} // namespace ll::concepts
Definition Expected.h:34
Definition Concepts.h:88
Definition Concepts.h:58
Definition Concepts.h:106
Definition Concepts.h:115
Definition Concepts.h:91
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:112
Definition Concepts.h:25
Definition Concepts.h:109
Definition Concepts.h:74
Definition Concepts.h:49
Definition Concepts.h:77
Definition Concepts.h:94
Definition Concepts.h:80
Definition Concepts.h:103
Definition Concepts.h:71