11 #ifndef EMP_TYPE_TRAITS_H 12 #define EMP_TYPE_TRAITS_H 18 #include "../base/Ptr.h" 38 template <
typename T1,
typename T2>
struct ptr_pair {
39 static constexpr
bool Same() {
return false; }
40 static constexpr
bool SameBase() {
return false; }
41 static bool ConvertOK(T1 * ptr) {
return dynamic_cast<T2*
>(ptr); }
44 static constexpr
bool Same() {
return true; }
45 static constexpr
bool SameBase() {
return true; }
46 static constexpr
bool ConvertOK(T *) {
return true; }
48 template <
typename T>
struct ptr_pair<T, const T> {
49 static constexpr
bool Same() {
return false; }
50 static constexpr
bool SameBase() {
return true; }
51 static constexpr
bool ConvertOK(T *) {
return true; }
53 template <
typename T>
struct ptr_pair<const T, T> {
54 static constexpr
bool Same() {
return false; }
55 static constexpr
bool SameBase() {
return true; }
56 static constexpr
bool ConvertOK(T *) {
return false; }
60 template <
typename Fn,
typename... Args>
69 static std::true_type check(
71 std::decay_t<decltype(std::declval<U>()(std::declval<Args>()...))> * =
79 static std::false_type check(...) {
84 static constexpr decltype(check<Fn>(std::declval<Fn>()))
value() {
90 template <
typename Fn,
typename... Args>
92 : decltype(detail::is_invocable_helper<Fn, Args...>::value()) {};
97 namespace __impl_variadics_type_traits {
99 template <
typename...>
101 template <
template <
typename...>
class Variadic,
typename Pack>
104 template <
template <
typename...>
class Variadic,
typename Pack>
107 template <
template <
typename...>
class Variadic,
typename... U>
112 template <
template <
typename...>
class Variadic,
typename Pack>
115 template <
template <
typename...>
class Variadic,
typename Pack>
118 template <
template <
typename...>
class Variadic,
typename... U>
119 struct ToPack<Variadic, Variadic<U...>> {
123 template <bool,
typename Needle,
typename Haystack,
124 template <
typename,
typename>
class Cmp>
127 template <
typename Needle,
typename Haystack,
128 template <
typename,
typename>
class Cmp>
132 template <
typename Needle,
template <
typename,
typename>
class Cmp>
134 : std::false_type {};
137 template <
typename Needle,
typename U0,
typename... U,
138 template <
typename,
typename>
class Cmp>
140 __impl_variadics_type_traits::
pack<U0, U...>, Cmp>
142 Cmp<Needle, U0>::value, Needle,
143 __impl_variadics_type_traits::pack<U...>, Cmp> {};
145 template <
typename Needle,
typename Haystack,
146 template <
typename,
typename>
class Cmp>
150 template <
typename Needle,
typename Haystack,
151 template <
typename,
typename>
class Cmp>
161 template <
typename Needle,
typename Haystack,
162 template <
typename,
typename>
class Cmp = std::is_same>
166 template <
typename Needle,
template <
typename...>
class Variadic,
167 typename... U,
template <
typename,
typename>
class Cmp>
170 Needle, __impl_variadics_type_traits::pack<U...>, Cmp> {};
172 template <
typename Needle,
typename Haystack,
173 template <
typename,
typename>
class... Cmp>
178 template <
typename... Variadics>
180 template <
typename... Variadics>
183 namespace __impl_variadics_type_traits {
185 template <
template <
typename...>
class Variadic,
typename Pack>
188 template <
template <
typename...>
class Variadic,
class... U>
193 template <
template <
typename...>
class Variadic,
class... A,
class... B,
196 pack<
pack<A...>, Variadic<B...>, Rest...>> {
203 template <
template <
typename...>
class Variadic,
class... A,
class... Rest>
213 template <
typename Variadic,
template <
typename>
class Filter>
216 template <
typename Variadic,
template <
typename>
class Filter>
219 namespace __impl_variadics_type_traits {
221 template <
typename Filtered,
typename Unfiltered,
222 template <
typename>
class Filter>
225 template <bool,
typename Filtered,
typename Unfiltered,
226 template <
typename>
class Filter>
229 template <
typename Filtered,
typename... Unfiltered,
230 template <
typename>
class Filter>
235 template <
typename... Filtered,
typename R0,
typename... Rest,
236 template <
typename>
class Filter>
239 pack<R0, Rest...>, Filter> {};
241 template <
typename... Filtered,
typename R0,
typename... Rest,
242 template <
typename>
class Filter>
249 template <
typename... Filtered,
typename R0,
typename... Rest,
250 template <
typename>
class Filter>
258 template <
template <
typename...>
class Variadic,
typename... U,
259 template <
typename>
class Filter>
268 template <
typename Variadic,
269 template <
typename,
typename>
class Cmp = std::is_same>
272 template <
typename Variadic,
template <
typename,
typename>
class... Cmp>
276 namespace __impl_variadics_type_traits {
278 template <
typename Unique,
typename Remaining,
279 template <
typename,
typename>
class Cmp>
282 template <bool,
typename Unique,
typename Remaining,
283 template <
typename,
typename>
class Cmp>
286 template <
typename Unique,
typename... Rest,
287 template <
typename,
typename>
class Cmp>
292 template <
typename... Unique,
typename R0,
typename... Rest,
293 template <
typename,
typename>
class Cmp>
296 variadic_contains_v<R0, pack<Unique...>, Cmp>, pack<Unique...>,
297 pack<R0, Rest...>, Cmp> {};
299 template <
typename... Unique,
typename R0,
typename... Rest,
300 template <
typename,
typename>
class Cmp>
302 pack<R0, Rest...>, Cmp> {
308 template <
typename... Unique,
typename R0,
typename... Rest,
309 template <
typename,
typename>
class Cmp>
311 pack<R0, Rest...>, Cmp> {
318 template <
template <
typename...>
class Variadic,
typename... U,
319 template <
typename,
typename>
class Cmp>
332 template <
template <
typename,
typename>
class Cmp,
typename...>
335 template <
template <
typename,
typename>
class Cmp,
typename... U>
338 namespace __impl_variadics_type_traits {
339 template <
template <
typename,
typename>
class Cmp,
typename...>
342 template <
template <
typename,
typename>
class Cmp,
typename U>
347 template <
template <
typename,
typename>
class Cmp,
typename U0,
typename U1,
354 template <
typename T>
356 : std::integral_constant<bool, !variadic_contains_v<T, first_t, Cmp>> {
369 template <
template <
typename...>
class Variadic,
370 template <
typename,
typename>
class Cmp,
typename... U>
373 Variadic, variadic_remove_duplicates_t<
377 template <
template <
typename...>
class Variadic,
378 template <
typename,
typename>
class Cmp,
typename... U0,
379 typename U1,
typename... U>
392 template <
template <
typename,
typename>
class Cmp,
typename...>
395 template <
template <
typename,
typename>
class Cmp,
typename... U>
399 namespace __impl_variadics_type_traits {
401 template <
template <
typename,
typename>
class Cmp,
typename...>
403 template <
template <
typename,
typename>
class Cmp,
typename U>
408 template <
template <
typename,
typename>
class Cmp,
typename U0,
typename U1,
415 template <
typename T>
417 : std::integral_constant<bool, variadic_contains_v<T, second_t, Cmp>> {
430 template <
template <
typename...>
class Variadic,
431 template <
typename,
typename>
class Cmp,
typename... U>
434 Variadic, variadic_remove_duplicates_t<
438 template <
template <
typename...>
class Variadic,
439 template <
typename,
typename>
class Cmp,
typename... U0,
440 typename U1,
typename... U>
452 template <
typename Needle,
typename Haystack,
453 template <
typename,
typename>
class Cmp = std::is_same>
456 template <
typename Needle,
typename Haystack,
457 template <
typename,
typename>
class... Cmp>
461 namespace __impl_variadics_type_traits {
463 template <
size_t I,
typename Needle,
typename Haystack,
464 template <
typename,
typename>
class Cmp>
467 template <bool, size_t,
typename Needle,
typename Haystack,
468 template <
typename,
typename>
class Cmp>
471 template <
size_t I,
typename Needle,
typename... U,
472 template <
typename,
typename>
class Cmp>
474 : std::integral_constant<size_t, I> {};
476 template <
size_t I,
typename Needle,
typename... U,
477 template <
typename,
typename>
class Cmp>
481 template <
size_t I,
typename Needle,
typename U0,
typename... U,
482 template <
typename,
typename>
class Cmp>
489 template <
typename Needle,
template <
typename...>
class Haystack,
490 typename... U,
template <
typename,
typename>
class Cmp>
493 0, Needle, __impl_variadics_type_traits::pack<U...>, Cmp> {};
Definition: type_traits.h:454
Definition: type_traits.h:100
Definition: type_traits.h:163
Definition: type_traits.h:186
Definition: type_traits.h:179
Definition: type_traits.h:91
__impl_variadics_type_traits::FromPackType< Variadic, typename __impl_variadics_type_traits::variadic_union< Cmp, __impl_variadics_type_traits::pack< U0... >, __impl_variadics_type_traits::ToPackType< Variadic, U1 >, __impl_variadics_type_traits::ToPackType< Variadic, U >... >::type > type
Definition: type_traits.h:386
U type
Definition: type_traits.h:405
Definition: type_traits.h:280
typename variadic_concat< Variadic, pack< pack< A..., B... >, Rest... >>::type type
Definition: type_traits.h:199
typename ToPack< Variadic, Pack >::type ToPackType
Definition: type_traits.h:116
__impl_variadics_type_traits::FromPackType< Variadic, variadic_remove_duplicates_t< __impl_variadics_type_traits::pack< U... >, Cmp >> type
Definition: type_traits.h:374
typename FromPack< Variadic, Pack >::type FromPackType
Definition: type_traits.h:105
static constexpr bool SameBase()
Definition: type_traits.h:55
typename variadic_remove_duplicates< Variadic, Cmp... >::type variadic_remove_duplicates_t
Definition: type_traits.h:274
Unique type
Definition: type_traits.h:289
Definition: type_traits.h:61
typename remove_ptr_type< T >::type remove_ptr_type_t
Definition: type_traits.h:34
Definition: type_traits.h:38
static constexpr bool Same()
Definition: type_traits.h:39
typename variadic_remove_duplicates< pack< Unique..., R0 >, pack< Rest... >, Cmp >::type type
Definition: type_traits.h:305
T type
Definition: type_traits.h:31
Definition: type_traits.h:113
typename variadic_intersection< Cmp, U... >::type variadic_intersection_t
Definition: type_traits.h:397
Variadic< U... > type
Definition: type_traits.h:109
typename variadic_intersection< Cmp, intersection_t, U... >::type type
Definition: type_traits.h:426
U type
Definition: type_traits.h:344
static constexpr bool Same()
Definition: type_traits.h:44
T type
Definition: type_traits.h:32
typename variadic_filter< Variadic, Filter >::type variadic_filter_t
Definition: type_traits.h:217
Definition: type_traits.h:465
Definition: type_traits.h:284
static constexpr bool Same()
Definition: type_traits.h:54
__impl_variadics_type_traits::FromPackType< Variadic, variadic_remove_duplicates_t< __impl_variadics_type_traits::pack< U... >, Cmp >> type
Definition: type_traits.h:435
Definition: type_traits.h:129
Filtered type
Definition: type_traits.h:232
Definition: type_traits.h:223
Definition: type_traits.h:270
Definition: type_traits.h:393
typename variadic_union< Cmp, U... >::type variadic_union_t
Definition: type_traits.h:336
static constexpr bool ConvertOK(T *)
Definition: type_traits.h:46
static constexpr bool Same()
Definition: type_traits.h:49
static bool ConvertOK(T1 *ptr)
Definition: type_traits.h:41
static constexpr bool ConvertOK(T *)
Definition: type_traits.h:51
Definition: type_traits.h:214
static constexpr bool SameBase()
Definition: type_traits.h:40
typename variadic_concat< Variadics... >::type variadic_concat_t
Definition: type_traits.h:181
constexpr bool variadic_contains_v
Definition: type_traits.h:174
Definition: type_traits.h:340
static constexpr bool SameBase()
Definition: type_traits.h:45
T type
Definition: type_traits.h:30
Definition: type_traits.h:23
Definition: type_traits.h:402
__impl_variadics_type_traits::FromPackType< Variadic, typename __impl_variadics_type_traits::variadic_intersection< Cmp, __impl_variadics_type_traits::pack< U0... >, __impl_variadics_type_traits::ToPackType< Variadic, U1 >, __impl_variadics_type_traits::ToPackType< Variadic, U >... >::type > type
Definition: type_traits.h:447
If we are in emscripten, make sure to include the header.
Definition: array.h:37
Definition: type_traits.h:333
Definition: type_traits.h:227
__impl_variadics_type_traits::FromPackType< Variadic, typename __impl_variadics_type_traits::variadic_filter< __impl_variadics_type_traits::pack<>, __impl_variadics_type_traits::pack< U... >, Filter >::type > type
Definition: type_traits.h:264
__impl_variadics_type_traits::FromPackType< Variadic, typename __impl_variadics_type_traits::variadic_concat< Variadic, __impl_variadics_type_traits::pack< __impl_variadics_type_traits::pack< A... >, Rest... >>::type > type
Definition: type_traits.h:209
typename variadic_remove_duplicates< pack< Unique... >, pack< Rest... >, Cmp >::type type
Definition: type_traits.h:314
typename variadic_union< Cmp, head_t, U... >::type type
Definition: type_traits.h:365
typename variadic_filter< pack< Filtered..., R0 >, pack< Rest... >, Filter >::type type
Definition: type_traits.h:254
Definition: type_traits.h:125
Definition: type_traits.h:23
Definition: type_traits.h:30
Definition: type_traits.h:469
static constexpr bool ConvertOK(T *)
Definition: type_traits.h:56
typename variadic_filter< pack< Filtered... >, pack< Rest... >, Filter >::type type
Definition: type_traits.h:246
constexpr bool is_ptr_type_v(const T &)
Definition: type_traits.h:28
Definition: type_traits.h:102
__impl_variadics_type_traits::FromPackType< Variadic, typename __impl_variadics_type_traits::variadic_remove_duplicates< __impl_variadics_type_traits::pack<>, __impl_variadics_type_traits::pack< U... >, Cmp >::type > type
Definition: type_traits.h:325
static constexpr bool SameBase()
Definition: type_traits.h:50
static constexpr auto variadic_index_of_v
Definition: type_traits.h:458