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
108} // namespace ll::concepts
Definition Concepts.h:88
Definition Concepts.h:58
Definition Concepts.h:106
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:25
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