FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
taskflow/taskflow/utility/traits.hpp at master · PentaBug/taskflow · GitHub
PentaBug
taskflow
Repository navigation
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
taskflow
/
taskflow
/
utility
/
traits.hpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
303 lines (229 loc) · 8.49 KB
Breadcrumbs
taskflow
/
taskflow
/
utility
/
traits.hpp
Copy path
File metadata and controls
303 lines (229 loc) · 8.49 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#
pragma
once
#
if
__has_include(<version>)
#
include
<
version
>
#
endif
#
include
<
type_traits
>
#
include
<
iterator
>
#
include
<
iostream
>
#
include
<
fstream
>
#
include
<
mutex
>
#
include
<
stack
>
#
include
<
queue
>
#
include
<
vector
>
#
include
<
algorithm
>
#
include
<
memory
>
#
include
<
atomic
>
#
include
<
thread
>
#
include
<
future
>
#
include
<
functional
>
#
include
<
unordered_map
>
#
include
<
unordered_set
>
#
include
<
sstream
>
#
include
<
list
>
#
include
<
numeric
>
#
include
<
random
>
#
include
<
iomanip
>
#
include
<
cassert
>
#
include
<
cmath
>
#
include
<
array
>
#
include
<
string
>
#
include
<
variant
>
#
include
<
optional
>
#
include
"
os.hpp
"
namespace
tf
{
//
-----------------------------------------------------------------------------
//
Traits
//
-----------------------------------------------------------------------------
//
// Struct: dependent_false
//
template <typename... T>
//
struct dependent_false {
//
static constexpr bool value = false;
//
};
//
//
template <typename... T>
//
constexpr auto dependent_false_v = dependent_false<T...>::value;
template
<
typename
>
inline
constexpr
bool
dependent_false_v =
false
;
//
----------------------------------------------------------------------------
//
is_pod
//
-----------------------------------------------------------------------------
template
<
typename
T>
struct
is_pod
{
static
const
bool
value = std::is_trivial_v<T> &&
std::is_standard_layout_v<T>;
};
template
<
typename
T>
constexpr
bool
is_pod_v = is_pod<T>::value;
//
-----------------------------------------------------------------------------
//
NoInit
//
-----------------------------------------------------------------------------
template
<
typename
T>
struct
NoInit
{
//
static_assert(is_pod_v<T>, "NoInit only supports POD type");
//
constructor without initialization
NoInit
()
noexcept
{}
//
implicit conversion T -> NoInit<T>
constexpr
NoInit
(T value)
noexcept
: v{value} {}
//
implicit conversion NoInit<T> -> T
constexpr
operator
T
()
const
noexcept
{
return
v; }
T v;
};
//
-----------------------------------------------------------------------------
//
Move-On-Copy
//
-----------------------------------------------------------------------------
//
Struct: MoveOnCopyWrapper
template
<
typename
T>
struct
MoC
{
MoC
(T&& rhs) : object(std::move(rhs)) {}
MoC
(
const
MoC& other) : object(std::move(other.object)) {}
T&
get
() {
return
object; }
mutable
T object;
};
template
<
typename
T>
auto
make_moc
(T&& m) {
return
MoC<T>(std::forward<T>(m));
}
//
-----------------------------------------------------------------------------
//
Visitors.
//
-----------------------------------------------------------------------------
//
// Overloadded.
//
template <typename... Ts>
//
struct Visitors : Ts... {
//
using Ts::operator()... ;
//
};
//
//
template <typename... Ts>
//
Visitors(Ts...) -> Visitors<Ts...>;
//
----------------------------------------------------------------------------
//
std::variant
//
----------------------------------------------------------------------------
template
<
typename
T,
typename
>
struct
get_index
;
template
<
size_t
I,
typename
... Ts>
struct
get_index_impl
{};
template
<
size_t
I,
typename
T,
typename
... Ts>
struct
get_index_impl
<I, T, T, Ts...> : std::integral_constant<
size_t
, I>{};
template
<
size_t
I,
typename
T,
typename
U,
typename
... Ts>
struct
get_index_impl
<I, T, U, Ts...> : get_index_impl<I+
1
, T, Ts...>{};
template
<
typename
T,
typename
... Ts>
struct
get_index
<T, std::variant<Ts...>> : get_index_impl<
0
, T, Ts...>{};
template
<
typename
T,
typename
... Ts>
constexpr
auto
get_index_v = get_index<T, Ts...>::value;
//
----------------------------------------------------------------------------
//
unwrap_reference
//
----------------------------------------------------------------------------
template
<
class
T
>
struct
unwrap_reference
{
using
type = T; };
template
<
class
U
>
struct
unwrap_reference
<std::reference_wrapper<U>> {
using
type = U&; };
template
<
class
T
>
using
unwrap_reference_t
=
typename
unwrap_reference<T>::type;
template
<
class
T
>
struct
unwrap_ref_decay
: unwrap_reference<std::
decay_t
<T>> {};
template
<
class
T
>
using
unwrap_ref_decay_t
=
typename
unwrap_ref_decay<T>::type;
//
----------------------------------------------------------------------------
//
stateful iterators
//
----------------------------------------------------------------------------
//
STL-styled iterator
template
<
typename
B,
typename
E>
struct
stateful_iterator
{
using
TB
= std::
decay_t
<
unwrap_ref_decay_t
<B>>;
using
TE
= std::
decay_t
<
unwrap_ref_decay_t
<E>>;
static_assert
(std::is_same_v<
TB
,
TE
>,
"
decayed iterator types must match
"
);
using
type =
TB
;
};
template
<
typename
B,
typename
E>
using
stateful_iterator_t
=
typename
stateful_iterator<B, E>::type;
//
raw integral index
template
<
typename
B,
typename
E,
typename
S>
struct
stateful_index
{
using
TB
= std::
decay_t
<
unwrap_ref_decay_t
<B>>;
using
TE
= std::
decay_t
<
unwrap_ref_decay_t
<E>>;
using
TS
= std::
decay_t
<
unwrap_ref_decay_t
<S>>;
static_assert
(
std::is_integral_v<
TB
>,
"
decayed beg index must be an integral type
"
);
static_assert
(
std::is_integral_v<
TE
>,
"
decayed end index must be an integral type
"
);
static_assert
(
std::is_integral_v<
TS
>,
"
decayed step must be an integral type
"
);
static_assert
(
std::is_same_v<
TB
,
TE
> && std::is_same_v<
TE
,
TS
>,
"
decayed index and step types must match
"
);
using
type =
TB
;
};
template
<
typename
B,
typename
E,
typename
S>
using
stateful_index_t
=
typename
stateful_index<B, E, S>::type;
//
----------------------------------------------------------------------------
//
visit a tuple with a functor at runtime
//
----------------------------------------------------------------------------
template
<
typename
Func,
typename
Tuple,
size_t
N =
0
>
void
visit_tuple
(Func func, Tuple& tup,
size_t
idx) {
if
(N == idx) {
std::invoke
(func, std::get<N>(tup));
return
;
}
if
constexpr
(N +
1
< std::tuple_size_v<Tuple>) {
return
visit_tuple<Func, Tuple, N +
1
>(func, tup, idx);
}
}
//
----------------------------------------------------------------------------
//
unroll loop
//
----------------------------------------------------------------------------
//
Template unrolled looping construct.
template
<
auto
beg,
auto
end,
auto
step,
bool
valid = (beg < end)>
struct
Unroll
{
template
<
typename
F>
static
void
eval
(F f) {
f
(beg);
Unroll<beg + step, end, step>::
eval
(f);
}
};
template
<
auto
beg,
auto
end,
auto
step>
struct
Unroll
<beg, end, step,
false
> {
template
<
typename
F>
static
void
eval
(F) { }
};
template
<
auto
beg,
auto
end,
auto
step,
typename
F>
void
unroll
(F f) {
Unroll<beg, end, step>::
eval
(f);
}
//
----------------------------------------------------------------------------
//
make types of variant unique
//
----------------------------------------------------------------------------
template
<
typename
T,
typename
... Ts>
struct
filter_duplicates
{
using
type = T; };
template
<
template
<
typename
...>
class
C
,
typename
... Ts,
typename
U,
typename
... Us>
struct
filter_duplicates
<C<Ts...>, U, Us...>
: std::
conditional_t
<(std::is_same_v<U, Ts> || ...)
, filter_duplicates<C<Ts...>, Us...>
, filter_duplicates<C<Ts..., U>, Us...>> {};
template
<
typename
T>
struct
unique_variant
;
template
<
typename
... Ts>
struct
unique_variant
<std::variant<Ts...>> : filter_duplicates<std::variant<>, Ts...> {};
template
<
typename
T>
using
unique_variant_t
=
typename
unique_variant<T>::type;
//
----------------------------------------------------------------------------
//
check if it is default compare
//
----------------------------------------------------------------------------
template
<
typename
T>
struct
is_std_compare
: std::false_type { };
template
<
typename
T>
struct
is_std_compare
<std::less<T>> : std::true_type { };
template
<
typename
T>
struct
is_std_compare
<std::greater<T>> : std::true_type { };
template
<
typename
T>
constexpr
static
bool
is_std_compare_v = is_std_compare<T>::value;
//
----------------------------------------------------------------------------
//
check if all types are the same
//
----------------------------------------------------------------------------
template
<
bool
...>
struct
bool_pack
;
template
<
bool
... bs>
using
all_true = std::is_same<bool_pack<bs...,
true
>, bool_pack<
true
, bs...>>;
template
<
typename
T,
typename
... Ts>
using
all_same = all_true<std::is_same_v<T, Ts>...>;
template
<
typename
T,
typename
... Ts>
constexpr
bool
all_same_v = all_same<T, Ts...>::value;
}
//
end of namespace tf. ----------------------------------------------------
Back
|
FazBrowse Home
|
New Git URL