1#ifndef TATOOINE_TYPE_TRAITS_H
2#define TATOOINE_TYPE_TRAITS_H
13template <
typename T, std::
size_t = sizeof(T)>
22static constexpr auto is_pointer = std::is_pointer<T>::value;
26template <
typename T, std::
size_t N>
31template <
typename... Ts>
33template <
typename T0,
typename T1,
typename T2,
typename... Ts>
35 : std::integral_constant<bool, is_same_impl<T0, T1>::value &&
36 is_same_impl<T1, T2, Ts...>::value> {};
37template <
typename T0,
typename T1>
41template <
typename... Ts>
44template <
typename... Ts>
45static constexpr auto is_void = (is_same<Ts, void> && ...);
47template <
typename... Ts>
48static constexpr auto is_float = (is_same<Ts, float> && ...);
50template <
typename... Ts>
51static constexpr auto is_double = (is_same<Ts, double> && ...);
53template <
typename... Ts>
54static constexpr auto is_int = (is_same<Ts, int> && ...);
56template <
typename... Ts>
57static constexpr auto is_size_t = (is_same<Ts, size_t> && ...);
59template <
typename Query,
typename... Others>
60static constexpr auto is_either_of = (is_same<Query, Others> || ...);
62template <
typename F,
typename... Args>
65template <
typename F,
typename... Args>
66static constexpr auto is_invocable = std::is_invocable<F, Args...>::value;
68template <
typename R,
typename F,
typename... Args>
69static constexpr auto is_invocable_r = std::is_invocable<R, F, Args...>::value;
71template <
typename F,
typename... Ts>
75template <
typename... Ts>
79template <
typename... Ts>
80static constexpr auto is_arithmetic = (std::is_arithmetic<Ts>::value && ...);
82template <
typename... Ts>
83static constexpr auto is_integral = (std::is_integral<Ts>::value && ...);
85template <
typename... Ts>
86static constexpr auto is_const = (std::is_const<Ts>::value && ...);
88template <
typename... Ts>
89static constexpr auto is_non_const = (!std::is_const<Ts>::value && ...);
91template <
typename... Ts>
92static constexpr auto is_signed = (std::is_signed<Ts>::value && ...);
94template <
typename... Ts>
95static constexpr auto is_unsigned = (std::is_unsigned<Ts>::value && ...);
97template <
typename... Ts>
99 (is_integral<Ts> && ...));
101template <
typename... Ts>
103 (is_integral<Ts> && ...));
105template <
typename From,
typename To>
108template <
typename From>
110 is_convertible<From, bool> || is_convertible<From, char> ||
111 is_convertible<From, unsigned char> || is_convertible<From, char16_t> ||
112 is_convertible<From, char32_t> || is_convertible<From, wchar_t> ||
113 is_convertible<From, unsigned short> || is_convertible<From, short> ||
114 is_convertible<From, int> || is_convertible<From, unsigned int> ||
115 is_convertible<From, long> || is_convertible<From, unsigned long>;
117template <
typename From>
119 is_convertible<From, float> || is_convertible<From, double> ||
120 is_convertible<From, long double>;
125template <
typename... Ts>
128template <
typename... Ts>
130 is_complex<Ts>)&&...);
135template <
typename T,
typename =
void>
140 decltype(std::declval<T>().end())>>
143template <
typename... Ts>
146template <
typename T,
typename =
void>
151 decltype(std::declval<T>()[size_t{}])>>
154template <
typename... Ts>
157template <
typename T,
typename =
void>
167template <
typename... Ts>
171template <
typename T,
typename =
void>
184template <
typename... Ts>
188template <
typename T,
typename =
void>
205template <
typename T,
typename =
void>
222template <
typename T,
typename =
void>
239template <
typename T,
typename S,
typename =
void>
242template <
typename T,
typename S>
244 T, S,
void_t<decltype(std::declval<T>() == std::declval<S>())>>
247template <
typename T,
typename S>
253 is_pre_incrementable<T>&& is_dereferencable<T>;
257 is_pre_decrementable<T>&& is_dereferencable<T>;
261 are_equality_comparable<T, T>&& is_pre_incrementable<T>&&
262 is_pre_decrementable<T>&& is_dereferencable<T>;
268requires requires {
typename std::decay_t<T>::value_type; }
270 using type =
typename std::decay_t<T>::value_type;
274requires is_arithmetic<T>
285template <
typename First,
typename Second>
Definition: algorithm.h:6
static constexpr auto is_post_decrementable
Definition: type_traits.h:219
static constexpr auto is_either_of
Definition: type_traits.h:60
static constexpr auto is_pre_incrementable
Definition: type_traits.h:202
auto begin(Range &&range)
Definition: iterator_facade.h:318
typename value_type_impl< T >::type value_type
Definition: type_traits.h:280
static constexpr auto is_integral
Definition: type_traits.h:83
static constexpr auto is_unsigned_integral
Definition: type_traits.h:102
static constexpr auto is_indexable
Definition: type_traits.h:155
static constexpr auto is_void
Definition: type_traits.h:45
static constexpr auto is_post_incrementable
Definition: type_traits.h:185
std::invoke_result_t< F, Args... > invoke_result
Definition: concepts.h:127
static constexpr auto is_signed_integral
Definition: type_traits.h:98
static constexpr auto is_arithmetic
Definition: type_traits.h:80
auto type_exists_impl(T *) -> std::true_type
static constexpr auto is_predicate
Definition: type_traits.h:72
void void_t
Definition: void_t.h:7
static constexpr auto is_range
Definition: type_traits.h:144
static constexpr auto is_const
Definition: type_traits.h:86
static constexpr auto is_size_t
Definition: type_traits.h:57
static constexpr auto is_arithmetic_or_complex
Definition: type_traits.h:129
static constexpr auto is_bidirectional_iterator
Definition: type_traits.h:260
static constexpr auto is_floating_point
Definition: type_traits.h:76
static constexpr auto is_convertible_to_floating_point
Definition: type_traits.h:118
static constexpr auto is_backward_iterator
Definition: type_traits.h:256
static constexpr auto is_complex
Definition: type_traits.h:126
static constexpr auto is_convertible
Definition: type_traits.h:106
static auto constexpr is_array
Definition: type_traits.h:29
static constexpr auto is_same
Definition: type_traits.h:42
static constexpr auto is_int
Definition: type_traits.h:54
static constexpr auto is_float
Definition: type_traits.h:48
static constexpr auto is_convertible_to_integral
Definition: type_traits.h:109
static constexpr auto is_dereferencable
Definition: type_traits.h:168
static constexpr auto is_invocable_r
Definition: type_traits.h:69
static constexpr auto is_invocable
Definition: type_traits.h:66
static constexpr auto is_pre_decrementable
Definition: type_traits.h:236
static constexpr auto is_pointer
Definition: type_traits.h:22
static constexpr auto is_pair
Definition: type_traits.h:289
static constexpr auto is_forward_iterator
Definition: type_traits.h:252
static constexpr auto is_unsigned
Definition: type_traits.h:95
static constexpr auto type_exists
Definition: type_traits.h:18
static constexpr auto is_non_const
Definition: type_traits.h:89
static constexpr auto are_equality_comparable
Definition: type_traits.h:248
static constexpr auto is_double
Definition: type_traits.h:51
static constexpr auto is_signed
Definition: type_traits.h:92
Definition: type_traits.h:240
T type
Definition: common_type.h:13
Definition: type_traits.h:25
Definition: type_traits.h:123
Definition: type_traits.h:158
Definition: type_traits.h:147
Definition: type_traits.h:283
Definition: type_traits.h:206
Definition: type_traits.h:172
Definition: type_traits.h:223
Definition: type_traits.h:189
Definition: type_traits.h:136
Definition: type_traits.h:32
typename std::decay_t< T >::value_type type
Definition: type_traits.h:270
Definition: type_traits.h:265