HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
concepts.hpp
1// Copyright Take Vos 2020-2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "type_traits.hpp"
8#include <type_traits>
9#include <string>
10#include <concepts>
11#include <limits>
12#include <coroutine>
13
14namespace hi::inline v1 {
15
16template<typename T>
18
19template<typename T>
20concept numeric = is_numeric_v<T>;
21
22template<typename T>
23concept numeric_integral = is_numeric_integral_v<T>;
24
25template<typename T>
26concept numeric_signed_integral = is_numeric_signed_integral_v<T>;
27
28template<typename T>
29concept numeric_unsigned_integral = is_numeric_unsigned_integral_v<T>;
30
31template<typename T>
32concept arithmetic = std::is_arithmetic_v<T>;
33
34template<typename T>
35concept pointer = std::is_pointer_v<T>;
36
37template<typename T>
38concept reference = std::is_reference_v<T>;
39
40template<typename T>
41concept lvalue_reference = std::is_lvalue_reference_v<T>;
42
43template<typename T>
44concept rvalue_reference = std::is_rvalue_reference_v<T>;
45
46template<typename T>
47concept trivially_copyable = std::is_trivially_copyable_v<T>;
48
49template<typename T, typename Other>
50concept different_from = is_different_v<T, Other>;
51
52template<typename BaseType, typename DerivedType>
53concept base_of = std::is_base_of_v<BaseType, DerivedType>;
54
55template<typename BaseType, typename DerivedType>
56concept decayed_base_of = is_decayed_base_of_v<BaseType, DerivedType>;
57
58template<typename DerivedType, typename BaseType>
59concept derived_from = hi::is_derived_from_v<DerivedType, BaseType>;
60
61template<typename DerivedType, typename BaseType>
62concept decayed_derived_from = hi::is_decayed_derived_from_v<DerivedType, BaseType>;
63
64template<typename BaseType, typename DerivedType>
65concept strict_base_of = base_of<BaseType, DerivedType> && !std::same_as<BaseType, DerivedType>;
66
67template<typename BaseType, typename DerivedType>
68concept strict_derived_from = derived_from<BaseType, DerivedType> && !std::same_as<BaseType, DerivedType>;
69
70template<typename T>
71concept pre_incrementable = requires(T a)
72{
73 {++a};
74};
75
76template<typename T>
77concept pre_decrementable = requires(T a)
78{
79 {--a};
80};
81
82template<typename T>
83concept to_stringable = requires(T v)
84{
85 {
86 to_string(v)
87 } -> std::convertible_to<std::string>;
88};
89
90template<typename T>
91concept from_stringable = requires()
92{
93 {
94 from_string<T>(std::string_view{})
95 } -> std::convertible_to<T>;
96};
97
98template<typename From, typename To>
99concept static_castableable = requires(From v)
100{
101 {
102 static_cast<To>(v)
103 } -> std::convertible_to<To>;
104};
105
106template<typename T>
107concept sizeable = requires(T v)
108{
109 {
110 size(v)
111 } -> std::convertible_to<std::size_t>;
112};
113
114template<typename T>
115concept scalar = std::is_scalar_v<T>;
116
121template<typename T>
122concept scoped_enum = std::is_enum_v<T>;
123
124template<typename Forward, typename T>
125concept forward_of = is_forward_of_v<T, Forward>;
126
127
133template<typename T>
134concept awaitable_direct = requires(T a, std::coroutine_handle<> b)
135{
136 // clang-format off
137 { a.await_ready() } -> std::convertible_to<bool>;
138 a.await_suspend(b);
139 a.await_resume();
140 // clang-format on
141};
142
147template<typename T>
148concept awaitable_member = requires(T a)
149{
150 {a.operator co_await()};
151};
152
157template<typename T>
158concept awaitable_non_member = requires(T a)
159{
160 {operator co_await(static_cast<T &&>(a))};
161};
162
169template<typename T>
171
172
173} // namespace hi::inline v1
Definition concepts.hpp:17
Definition concepts.hpp:20
Definition concepts.hpp:23
Definition concepts.hpp:26
Definition concepts.hpp:29
Definition concepts.hpp:32
Definition concepts.hpp:35
Definition concepts.hpp:38
Definition concepts.hpp:41
Definition concepts.hpp:44
Definition concepts.hpp:47
Definition concepts.hpp:50
Definition concepts.hpp:53
Definition concepts.hpp:56
Definition concepts.hpp:59
Definition concepts.hpp:62
Definition concepts.hpp:65
Definition concepts.hpp:68
Definition concepts.hpp:71
Definition concepts.hpp:77
Definition concepts.hpp:83
Definition concepts.hpp:91
Definition concepts.hpp:99
Definition concepts.hpp:107
Definition concepts.hpp:115
Concept for std::is_scoped_enum_v<T>.
Definition concepts.hpp:122
Definition concepts.hpp:125
Check if type can be directly co_await on.
Definition concepts.hpp:134
Check if type can be indirectly co_await on.
Definition concepts.hpp:148
Check if type can be indirectly co_await on.
Definition concepts.hpp:158
Check if type can be directly or indirectly co_await on.
Definition concepts.hpp:170