Tatooine
concepts.h
Go to the documentation of this file.
1#ifndef TATOOINE_CONCEPTS_H
2#define TATOOINE_CONCEPTS_H
3//==============================================================================
6
7#include <concepts>
8#include <ranges>
9//==============================================================================
10namespace tatooine {
11//==============================================================================
12// typedefs
13//==============================================================================
14template <typename T0, typename T1>
15concept same_as = std::same_as<T0, T1>;
16//------------------------------------------------------------------------------
17template <typename T, typename... Ts>
18concept either_of = (same_as<T, Ts> || ...);
19//------------------------------------------------------------------------------
20template <typename T>
21concept integral = std::integral<T>;
22//------------------------------------------------------------------------------
23template <typename T>
24concept signed_integral = std::signed_integral<T>;
25//------------------------------------------------------------------------------
26template <typename T>
27concept unsigned_integral = std::unsigned_integral<T>;
28//------------------------------------------------------------------------------
29template <typename T>
30concept floating_point = std::floating_point<T>;
31//------------------------------------------------------------------------------
32template <typename T>
34//------------------------------------------------------------------------------
35template <typename T>
36concept arithmetic_or_complex = arithmetic<T> || is_complex<T>;
37//------------------------------------------------------------------------------
38template <typename From, typename To>
39concept convertible_to = std::convertible_to<From, To>;
40//------------------------------------------------------------------------------
41template <typename From>
45//------------------------------------------------------------------------------
46template <typename From>
56//------------------------------------------------------------------------------
57template <typename T>
58concept has_defined_real_type = requires { typename T::real_type; };
59//------------------------------------------------------------------------------
60template <typename T>
61concept has_defined_iterator = requires { typename T::iterator; };
62//------------------------------------------------------------------------------
63template <typename T>
64concept has_defined_this_type = requires { typename T::this_type; };
65//------------------------------------------------------------------------------
66template <typename T>
67concept has_defined_parent_type = requires { typename T::parent_type; };
68//------------------------------------------------------------------------------
69template <typename T>
70concept has_defined_tensor_type = requires { typename T::tensor_type; };
71//------------------------------------------------------------------------------
72template <typename T>
73concept has_defined_pos_type = requires { typename T::pos_type; };
74//==============================================================================
75// ranges etc.
76//==============================================================================
77template <typename T>
78concept forward_iterator = std::forward_iterator<T>;
79//------------------------------------------------------------------------------
80template <typename T>
81concept bidirectional_iterator = std::bidirectional_iterator<T>;
82//------------------------------------------------------------------------------
83template <typename T>
84concept range = std::ranges::range<T>;
85//------------------------------------------------------------------------------
86template <typename T>
89//------------------------------------------------------------------------------
90template <typename T>
92//------------------------------------------------------------------------------
93template <typename T>
96//------------------------------------------------------------------------------
97template <typename T, typename S>
99//------------------------------------------------------------------------------
100template <typename T>
103//------------------------------------------------------------------------------
104template <typename T>
107//------------------------------------------------------------------------------
108template <typename T, typename... Ss>
111//==============================================================================
112// indexable
113//==============================================================================
114template <typename T>
115concept indexable = requires(T const t, std::size_t i) {
116 { t[i] };
117 { t.at(i) };
118 };
119//==============================================================================
120template <typename F, typename... Args>
121concept invocable = std::invocable<F, Args...>;
122//-----------------------------------------------------------------------------
123template <typename F, typename... Args>
124concept regular_invocable = std::regular_invocable<F, Args...>;
125//-----------------------------------------------------------------------------
126template <typename F, typename... Args>
127using invoke_result = std::invoke_result_t<F, Args...>;
128//-----------------------------------------------------------------------------
129template <typename T>
131 requires {
132 { T::num_dimensions() } -> std::convertible_to<std::size_t>;
133 };
134//-----------------------------------------------------------------------------
135template <typename T>
136concept has_static_rank_method = requires {
137 {
138 T::rank()
139 } -> std::convertible_to<std::size_t>;
140 };
141//-----------------------------------------------------------------------------
142template <typename F, typename... Is>
143concept invocable_with_integrals = std::invocable<F, Is...> &&
144 (integral<Is> && ...);
145//==============================================================================
146// misc
147//==============================================================================
148template <typename Reader, typename Readable>
149concept can_read =
150 requires(Reader reader, Readable readable) { reader.read(readable); };
151//------------------------------------------------------------------------------
152template <typename T>
153concept has_real_type = requires { typename std::decay_t<T>::real_type; };
154//------------------------------------------------------------------------------
155template <typename T>
156concept has_pos_type = requires { typename std::decay_t<T>::pos_type; };
157//------------------------------------------------------------------------------
158template <typename T>
159concept has_tensor_type = requires { typename std::decay_t<T>::tensor_type; };
160//------------------------------------------------------------------------------
161template <typename T>
162concept has_num_dimensions = requires {
163 {
164 std::decay_t<T>::num_dimensions()
165 } -> integral;
166 };
167//==============================================================================
168} // namespace tatooine
169//==============================================================================
170#endif
Definition: concepts.h:36
Definition: concepts.h:87
Definition: concepts.h:33
Definition: concepts.h:81
Definition: concepts.h:149
Definition: concepts.h:47
Definition: concepts.h:39
Definition: concepts.h:18
Definition: concepts.h:94
Definition: concepts.h:30
Definition: concepts.h:78
Definition: concepts.h:61
Definition: concepts.h:67
Definition: concepts.h:73
Definition: concepts.h:58
Definition: concepts.h:70
Definition: concepts.h:64
Definition: concepts.h:162
Definition: concepts.h:156
Definition: concepts.h:153
Definition: concepts.h:136
Definition: concepts.h:159
Definition: concepts.h:115
Definition: concepts.h:105
Definition: concepts.h:101
Definition: concepts.h:91
Definition: concepts.h:21
Definition: concepts.h:143
Definition: concepts.h:121
Definition: concepts.h:109
Definition: concepts.h:98
Definition: concepts.h:84
Definition: concepts.h:124
Definition: concepts.h:15
Definition: concepts.h:24
Definition: concepts.h:27
Definition: algorithm.h:6
std::invoke_result_t< F, Args... > invoke_result
Definition: concepts.h:127