32#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
53#ifndef ETL_TYPE_TRAITS_INCLUDED
54#define ETL_TYPE_TRAITS_INCLUDED
58#include "static_assert.h"
68#if ETL_USING_STL && ETL_USING_CPP11
69 #include <type_traits>
75 template <
typename...>
79#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
87 template <
typename T, T VALUE>
90 static const T value = VALUE;
105 template <
typename T, T VALUE>
106 const T integral_constant<T, VALUE>::value;
109 template <
typename T, T VALUE>
110 inline constexpr T integral_constant_v = etl::integral_constant<T, VALUE>::value;
114 template <
bool BValue>
117 template <
bool BValue>
118 struct bool_constant : etl::integral_constant<bool, BValue> { };
122 template <
bool BValue>
123 inline constexpr bool bool_constant_v = bool_constant<BValue>::value;
128 template <
typename T>
129 struct negation : etl::bool_constant<!bool(T::value)>
134 template <
typename T>
135 inline constexpr bool negation_v = negation<T>::value;
147 template <
typename T>
148 using remove_reference_t =
typename remove_reference<T>::type;
153 template <
typename T>
struct remove_pointer {
typedef T type; };
156 template <
typename T>
struct remove_pointer<volatile T*> {
typedef volatile T type; };
157 template <
typename T>
struct remove_pointer<const volatile T*> {
typedef const volatile T type; };
159 template <
typename T>
struct remove_pointer<const T*
const> {
typedef const T type; };
160 template <
typename T>
struct remove_pointer<volatile T*
const> {
typedef volatile T type; };
161 template <
typename T>
struct remove_pointer<const volatile T*
const> {
typedef const volatile T type; };
164 template <
typename T>
165 using remove_pointer_t =
typename remove_pointer<T>::type;
170 template <
typename T>
struct add_pointer {
typedef typename remove_reference<T>::type*
type; };
173 template <
typename T>
174 using add_pointer_t =
typename add_pointer<T>::type;
179 template <
typename T>
struct is_const :
false_type {};
180 template <
typename T>
struct is_const<const T> : true_type {};
181 template <
typename T>
struct is_const<const volatile T> : true_type {};
184 template <
typename T>
185 inline constexpr bool is_const_v = is_const<T>::value;
191 template <
typename T>
struct remove_const<const T> {
typedef T type; };
194 template <
typename T>
195 using remove_const_t =
typename remove_const<T>::type;
200 template <
typename T>
struct add_const {
typedef const T
type; };
201 template <
typename T>
struct add_const<const T> {
typedef const T type; };
204 template <
typename T>
205 using add_const_t =
typename add_const<T>::type;
211 template <
typename T>
struct is_volatile<volatile T> : true_type {};
212 template <
typename T>
struct is_volatile<const volatile T> : true_type {};
215 template <
typename T>
216 inline constexpr bool is_volatile_v = is_volatile<T>::value;
225 template <
typename T>
226 using remove_volatile_t =
typename remove_volatile<T>::type;
232 template <
typename T>
struct add_volatile<volatile T> {
typedef volatile T type; };
235 template <
typename T>
236 using add_volatile_t =
typename add_volatile<T>::type;
247 template <
typename T>
248 using remove_cv_t =
typename remove_cv<T>::type;
253 template <
typename T>
struct add_cv
255 typedef typename add_volatile<typename add_const<T>::type>::type type;
259 template <
typename T>
260 using add_cv_t =
typename add_cv<T>::type;
267 typedef typename remove_cv<typename remove_reference<T>::type>::type type;
271 template <
typename T>
272 using remove_cvref_t =
typename remove_cvref<T>::type;
290 template <>
struct is_integral<unsigned long long> : true_type {};
291#if ETL_HAS_NATIVE_CHAR8_T
292 template <>
struct is_integral<char8_t> : true_type {};
294#if ETL_HAS_NATIVE_CHAR16_T
295 template <>
struct is_integral<char16_t> : true_type {};
297#if ETL_HAS_NATIVE_CHAR32_T
298 template <>
struct is_integral<char32_t> : true_type {};
305 template <
typename T>
306 inline constexpr bool is_integral_v = is_integral<T>::value;
313 template <> struct is_signed<wchar_t> : public etl::bool_constant<wchar_t(-1) < wchar_t(0)> {};
314 template <> struct is_signed<signed char> : true_type {};
315 template <> struct is_signed<short> : true_type {};
316 template <> struct is_signed<int> : true_type {};
317 template <> struct is_signed<long> : true_type {};
318 template <> struct is_signed<long long> : true_type {};
319 template <> struct is_signed<float> : true_type {};
320 template <> struct is_signed<double> : true_type {};
321 template <> struct is_signed<long double> : true_type {};
322#if ETL_HAS_NATIVE_CHAR8_T
323 template <> struct is_signed<char8_t> : true_type {};
325#if ETL_HAS_NATIVE_CHAR16_T
326 template <> struct is_signed<char16_t> : true_type {};
328#if ETL_HAS_NATIVE_CHAR32_T
329 template <> struct is_signed<char32_t> : true_type {};
331 template <typename T> struct is_signed<const T> : is_signed<T> {};
332 template <typename T> struct is_signed<volatile T> : is_signed<T> {};
333 template <typename T> struct is_signed<const volatile T> : is_signed<T> {};
336 template <typename T>
337 inline constexpr bool is_signed_v = is_signed<T>::value;
342 template <typename T> struct is_unsigned : false_type {};
343 template <> struct is_unsigned<bool> : true_type {};
344 template <> struct is_unsigned<char> : etl::bool_constant<(char(255) > 0)> {};
345 template <> struct is_unsigned<unsigned char> : true_type {};
346 template <> struct is_unsigned<wchar_t> : public etl::bool_constant<(wchar_t(-1) > wchar_t(0))> {};
347 template <>
struct is_unsigned<unsigned short> : true_type {};
348 template <>
struct is_unsigned<unsigned int> : true_type {};
349 template <>
struct is_unsigned<unsigned long> : true_type {};
350 template <>
struct is_unsigned<unsigned long long> : true_type {};
356 template <
typename T>
371 template <
typename T>
378 template <
typename T>
struct is_same<T, T> :
public true_type {};
381 template <
typename T1,
typename T2>
388 template<>
struct is_void<void> : true_type {};
391 template <
typename T>
397 template<
typename T>
struct is_arithmetic : etl::bool_constant<is_integral<T>::value || is_floating_point<T>::value> {};
400 template <
typename T>
406 template <
typename T>
struct is_fundamental : etl::bool_constant<is_arithmetic<T>::value || is_void<T>::value> {};
409 template <
typename T>
415 template <
typename T>
struct is_compound : etl::bool_constant<!is_fundamental<T>::value> {};
418 template <
typename T>
425 template <
typename T>
struct is_array<T[]> : true_type {};
426 template <
typename T,
size_t Size>
struct is_array<T[Size]> : true_type {};
429 template <
typename T>
435 template<
typename T>
struct is_pointer_helper :
false_type {};
436 template<
typename T>
struct is_pointer_helper<T*> : true_type {};
437 template<
typename T>
struct is_pointer_helper<const T*> : is_pointer_helper<T*> {};
438 template<
typename T>
struct is_pointer_helper<volatile T*> : is_pointer_helper<T*> {};
439 template<
typename T>
struct is_pointer_helper<const volatile T*> : is_pointer_helper<T*> {};
440 template<
typename T>
struct is_pointer : is_pointer_helper<typename remove_cv<T>::type> {};
443 template <
typename T>
449 template<
typename T>
struct is_lvalue_reference_helper :
false_type {};
450 template<
typename T>
struct is_lvalue_reference_helper<T&> : true_type {};
451 template<
typename T>
struct is_lvalue_reference : is_lvalue_reference_helper<typename remove_cv<T>::type> {};
454 template <
typename T>
455 inline constexpr bool is_lvalue_reference_v = etl::is_lvalue_reference<T>::value;
461 template<
typename T>
struct is_rvalue_reference_helper :
false_type {};
462 template<
typename T>
struct is_rvalue_reference_helper<T&&> : true_type {};
463 template<
typename T>
struct is_rvalue_reference : is_rvalue_reference_helper<typename remove_cv<T>::type> {};
466 template <
typename T>
467 inline constexpr bool is_rvalue_reference_v = etl::is_rvalue_reference<T>::value;
475 is_lvalue_reference<T>::value
477 || is_rvalue_reference<T>::value
482 template <
typename T>
489 template <
typename T>
struct is_pod : etl::bool_constant<etl::is_fundamental<T>::value || etl::is_pointer<T>::value> {};
492 template <
typename T>
493 inline constexpr bool is_pod_v = etl::is_pod<T>::value;
498 template <
bool BValue,
typename T,
typename F>
struct conditional {
typedef T type; };
499 template <
typename T,
typename F>
struct conditional<false, T, F> {
typedef F type; };
502 template <
bool BValue,
typename T,
typename F>
503 using conditional_t =
typename conditional<BValue, T, F>::type;
508 template <
typename T>
struct make_signed {
typedef T type; };
509 template <>
struct make_signed<char> {
typedef signed char type; };
510 template <>
struct make_signed<unsigned char> {
typedef signed char type; };
514 typedef etl::conditional<
sizeof(wchar_t) ==
sizeof(int16_t),
516 etl::conditional<
sizeof(wchar_t) ==
sizeof(int32_t),
518 void>::type>::type type;
521 template <>
struct make_signed<unsigned short> {
typedef short type; };
522 template <>
struct make_signed<unsigned int> {
typedef int type; };
523 template <>
struct make_signed<unsigned long> {
typedef long type; };
524 template <>
struct make_signed<unsigned long long> {
typedef long long type; };
525 template <
typename T>
struct make_signed<const T> :
add_const<typename make_signed<T>::type> {};
527 template <
typename T>
struct make_signed<const volatile T> :
add_const<typename add_volatile<typename make_signed<T>::type>::type> {};
530 template <
typename T>
536 template <
typename T>
struct make_unsigned {
typedef T type; };
537 template <>
struct make_unsigned<char> {
typedef unsigned char type; };
538 template <>
struct make_unsigned<signed char> {
typedef unsigned char type; };
539 template <>
struct make_unsigned<short> {
typedef unsigned short type; };
543 typedef etl::conditional<
sizeof(wchar_t) ==
sizeof(uint16_t),
545 etl::conditional<
sizeof(wchar_t) ==
sizeof(uint32_t),
547 void>::type>::type type;
550 template <>
struct make_unsigned<int> {
typedef unsigned int type; };
551 template <>
struct make_unsigned<long> {
typedef unsigned long type; };
552 template <>
struct make_unsigned<long long> {
typedef unsigned long long type; };
555 template <
typename T>
struct make_unsigned<const volatile T> :
add_const<typename add_volatile<typename make_unsigned<T>::type>::type> {};
558 template <
typename T>
564 template <
bool BValue,
typename T =
void>
struct enable_if {};
565 template <
typename T>
struct enable_if<true, T> {
typedef T type; };
568 template <
bool BValue,
typename T =
void>
574 template <
typename T,
unsigned Size = 0U>
577 template <
typename T>
580 template <
typename T,
unsigned Size>
583 template <
typename T,
unsigned Size>
586 template <
typename T,
unsigned I,
unsigned Size>
590 template <
typename T,
unsigned Size = 0U>
596 template <
typename T>
struct remove_extent {
typedef T type; };
597 template <
typename T>
struct remove_extent<T[]> {
typedef T type; };
598 template <
typename T,
size_t Size>
struct remove_extent<T[Size]> {
typedef T type; };
601 template <
typename T>
608 template <
typename T>
struct remove_all_extents<T[]> {
typedef typename remove_all_extents<T>::type type; };
609 template <
typename T,
size_t Size>
struct remove_all_extents<T[Size]> {
typedef typename remove_all_extents<T>::type type; };
612 template <
typename T>
620 template <
typename T,
size_t Size>
struct rank<T[Size]> :
public integral_constant<size_t, rank<T>::value + 1> {};
623 template <
typename T>
629 template <
typename T>
632 typedef typename etl::remove_reference<T>::type U;
633 typedef typename etl::conditional<etl::is_array<U>::value,
634 typename etl::remove_extent<U>::type*,
635 typename etl::remove_cv<U>::type>::type type;
639 template <
typename T>
645 template<
typename TBase,
647 const bool IsFundamental = (etl::is_fundamental<TBase>::value || etl::is_fundamental<TDerived>::value || etl::is_array<TDerived>::value)>
652 static TBase* check(TBase*) {
return (TBase*)0; }
653 static char check(...) {
return 0; }
657 static const bool value = (
sizeof(check((TDerived*)0)) ==
sizeof(TBase*));
661 template<
typename TBase,
typename TDerived>
664 static const bool value =
false;
668 template <
typename T1,
typename T2>
676 template <
typename T>
char test(
int T::*);
678 struct dummy {
char c[2]; };
679 template <
typename T> dummy test(...);
682 template <
typename T>
683 struct is_class : etl::bool_constant<sizeof(private_type_traits::test<T>(0)) == 1U> {};
686 template <
typename T>
700 template <
typename T>
701 using add_lvalue_reference_t =
typename etl::add_lvalue_reference<T>::type;
707 template <
typename T>
struct add_rvalue_reference {
using type = T && ; };
708 template <
typename T>
struct add_rvalue_reference<T&> {
using type = T & ; };
709 template <>
struct add_rvalue_reference<void> {
using type = void; };
710 template <>
struct add_rvalue_reference<const void> {
using type =
const void; };
711 template <>
struct add_rvalue_reference<volatile void> {
using type =
volatile void; };
712 template <>
struct add_rvalue_reference<const volatile void> {
using type =
const volatile void; };
716 template <
typename T>
717 using add_rvalue_reference_t =
typename etl::add_rvalue_reference<T>::type;
723 template <
typename T>
724 typename etl::add_rvalue_reference<T>::type declval() ETL_NOEXCEPT;
736 template <
typename T,
typename =
int>
737 struct is_convertible_to_int
744 template <
typename T>
745 struct is_convertible_to_int<T, decltype(static_cast<int>(declval<T>()))>
751 template <
typename T>
761 template <
typename T>
762 inline constexpr bool is_enum_v = etl::is_enum<T>::value;
768 template <
typename T>
769 struct is_convertible_to_int
771 static char test(
int);
772 static double test(...);
774 static const bool value =
sizeof(test(
static_cast<T
>(0))) ==
sizeof(
char);
779 template <
typename T>
782 static const bool value = private_type_traits::is_convertible_to_int<T>::value &&
783 !is_class<T>::value &&
784 !is_arithmetic<T>::value &&
785 !is_reference<T>::value;
796 using true_type_for = etl::true_type;
798 template <
typename T>
799 auto returnable(
int)->true_type_for<T()>;
802 auto returnable(...)->etl::false_type;
804 template <
typename TFrom,
typename TTo>
805 auto nonvoid_convertible(
int)->true_type_for<
decltype(etl::declval<void(&)(TTo)>()(etl::declval<TFrom>()))
807 template <
typename,
typename>
808 auto nonvoid_convertible(...)->etl::false_type;
811#if defined(ETL_COMPILER_ARM5)
812 template <
typename TFrom,
typename TTo>
813 struct is_convertible : etl::bool_constant<__is_convertible_to(TFrom, TTo)> {};
815 template <
typename TFrom,
typename TTo>
816 struct is_convertible : etl::bool_constant<(decltype(private_type_traits::returnable<TTo>(0))::value &&
817 decltype(private_type_traits::nonvoid_convertible<TFrom, TTo>(0))::value) ||
818 (etl::is_void<TFrom>::value && etl::is_void<TTo>::value)> {};
822 template <
typename TFrom,
typename TTo>
823 struct is_nothrow_convertible
827 static void sink(TTo)
noexcept;
830 template <
typename F>
831 static auto test(
int) -> etl::bool_constant<noexcept(sink(etl::declval<F>()))>;
838 static ETL_CONSTANT
bool value =
decltype(test<TFrom>(0))::value;
843 template <
typename TFrom,
typename TTo >
844 inline constexpr bool is_convertible_v = etl::is_convertible<TFrom, TTo>::value;
846 template <
typename TFrom,
typename TTo >
847 inline constexpr bool is_nothrow_convertible_v = etl::is_nothrow_convertible<TFrom, TTo>::value;
853#if ETL_USING_CPP11 && !defined(ETL_COMPILER_ARM5)
855#elif defined(ETL_COMPILER_MICROSOFT)
857#elif defined(ETL_COMPILER_IAR) || defined(ETL_COMPILER_TI)
869 template <
typename T>
870 inline constexpr size_t alignment_of_v = etl::alignment_of<T>::value;
882 template <
typename T, T VALUE>
891 template <
typename T, T VALUE>
892 inline constexpr T integral_constant_v = std::integral_constant<T, VALUE>::value;
896 template <
bool BValue>
899 template <
bool BValue>
900 struct bool_constant : std::integral_constant<bool, BValue> { };
904 template <
bool BValue>
905 inline constexpr bool bool_constant_v = bool_constant<BValue>::value;
912 template <
typename T>
915 template <
typename T>
916 struct negation : etl::bool_constant<!bool(T::value)>
922 template <
typename T>
923 inline constexpr bool negation_v = std::negation_v<T>;
929 template <
typename T>
struct remove_reference : std::remove_reference<T> {};
932 template <
typename T>
933 using remove_reference_t =
typename std::remove_reference<T>::type;
939 template <
typename T>
struct remove_pointer : std::remove_pointer<T> {};
942 template <
typename T>
943 using remove_pointer_t =
typename std::remove_pointer<T>::type;
949 template <
typename T>
struct add_pointer : std::add_pointer<T> {};
952 template <
typename T>
953 using add_pointer_t =
typename std::add_pointer<T>::type;
959 template <
typename T>
struct is_const : std::is_const<T> {};
962 template <
typename T>
963 inline constexpr bool is_const_v = std::is_const_v<T>;
969 template <
typename T>
struct remove_const : std::remove_const<T> {};
972 template <
typename T>
973 using remove_const_t =
typename std::remove_const<T>::type;
979 template <
typename T>
struct add_const : std::add_const<T> {};
982 template <
typename T>
983 using add_const_t =
typename std::add_const<T>::type;
989 template <
typename T>
struct is_volatile : std::is_volatile<T> {};
992 template <
typename T>
993 inline constexpr bool is_volatile_v = std::is_volatile_v<T>;
999 template <
typename T>
struct remove_volatile : std::remove_volatile<T> {};
1002 template <
typename T>
1003 using remove_volatile_t =
typename std::remove_volatile<T>::type;
1009 template <
typename T>
struct add_volatile : std::add_volatile<T> {};
1012 template <
typename T>
1013 using add_volatile_t =
typename std::add_volatile<T>::type;
1019 template <
typename T>
struct remove_cv : std::remove_cv<T> {};
1022 template <
typename T>
1023 using remove_cv_t =
typename std::remove_cv<T>::type;
1029 template <
typename T>
struct add_cv : std::add_cv<T> {};
1032 template <
typename T>
1033 using add_cv_t =
typename std::add_cv<T>::type;
1041 typedef typename std::remove_cv<typename std::remove_reference<T>::type>::type type;
1045 template <
typename T>
1046 using remove_cvref_t =
typename etl::remove_cvref<T>::type;
1052 template <
typename T>
struct is_integral : std::is_integral<T> {};
1055 template <
typename T>
1056 inline constexpr bool is_integral_v = std::is_integral_v<T>;
1062 template <
typename T>
struct is_signed : std::is_signed<T> {};
1065 template <
typename T>
1066 inline constexpr bool is_signed_v = std::is_signed_v<T>;
1072 template <
typename T>
struct is_unsigned : std::is_unsigned<T> {};
1075 template <
typename T>
1076 inline constexpr bool is_unsigned_v = std::is_unsigned_v<T>;
1085 template <
typename T>
1086 inline constexpr bool is_floating_point_v = std::is_floating_point_v<T>;
1092 template <
typename T1,
typename T2>
struct is_same : std::is_same<T1, T2> {};
1095 template <
typename T1,
typename T2>
1096 inline constexpr bool is_same_v = std::is_same_v<T1, T2>;
1102 template<
typename T>
struct is_void : std::is_void<T> {};
1105 template <
typename T>
1106 inline constexpr bool is_void_v = std::is_void_v<T>;
1112 template<
typename T>
struct is_arithmetic : std::is_arithmetic<T> {};
1115 template <
typename T>
1116 inline constexpr bool is_arithmetic_v = std::is_arithmetic_v<T>;
1122 template <
typename T>
struct is_fundamental : std::is_fundamental<T> {};
1125 template <
typename T>
1126 inline constexpr bool is_fundamental_v = std::is_fundamental_v<T>;
1132 template <
typename T>
struct is_compound : std::is_compound<T> {};
1135 template <
typename T>
1136 inline constexpr bool is_compound_v = std::is_compound_v<T>;
1142 template <
typename T>
struct is_array : std::is_array<T> {};
1145 template <
typename T>
1146 inline constexpr bool is_array_v = std::is_array_v<T>;
1152 template<
typename T>
struct is_pointer : std::is_pointer<T> {};
1155 template <
typename T>
1156 inline constexpr bool is_pointer_v = std::is_pointer_v<T>;
1162 template<
typename T>
struct is_reference : std::is_reference<T> {};
1165 template <
typename T>
1166 inline constexpr bool is_reference_v = std::is_reference_v<T>;
1175 template <
typename T>
1176 inline constexpr bool is_lvalue_reference_v = std::is_lvalue_reference_v<T>;
1183 template<
typename T>
struct is_rvalue_reference : std::is_rvalue_reference<T> {};
1186 template <
typename T>
1187 inline constexpr bool is_rvalue_reference_v = std::is_rvalue_reference_v<T>;
1194 template <
typename T>
1195 struct is_pod : std::integral_constant<bool, std::is_standard_layout<T>::value && std::is_trivial<T>::value> {};
1198 template <
typename T>
1199 inline constexpr bool is_pod_v = std::is_standard_layout_v<T> && std::is_trivial_v<T>;
1202#if defined(ETL_COMPILER_GCC)
1203 #if ETL_COMPILER_VERSION >= 5
1204 #define ETL_GCC_V5_TYPE_TRAITS_SUPPORTED
1211 template <
bool BValue,
typename T,
typename F>
struct conditional {
typedef T type; };
1212 template <
typename T,
typename F>
struct conditional<false, T, F> {
typedef F type; };
1215 template <
bool BValue,
typename T,
typename F>
1216 using conditional_t =
typename conditional<BValue, T, F>::type;
1222 template <
typename T>
struct make_signed : std::make_signed<T> {};
1225 template <
typename T>
1226 using make_signed_t =
typename std::make_signed<T>::type;
1232 template <
typename T>
struct make_unsigned : std::make_unsigned<T> {};
1235 template <
typename T>
1236 using make_unsigned_t =
typename std::make_unsigned<T>::type;
1242 template <
bool BValue,
typename T =
void>
struct enable_if : std::enable_if<BValue, T> {};
1245 template <
bool BValue,
typename T =
void>
1246 using enable_if_t =
typename std::enable_if<BValue, T>::type;
1252 template <
typename T,
unsigned Size = 0U>
1253 struct extent : std::extent<T, Size> {};
1256 template <
typename T,
unsigned Size = 0U>
1257 inline constexpr size_t extent_v = std::extent_v<T, Size>;
1263 template <
typename T>
struct remove_extent : std::remove_extent<T> { };
1266 template <
typename T>
1267 using remove_extent_t =
typename std::remove_extent<T>::type;
1276 template <
typename T>
1277 using remove_all_extents_t =
typename std::remove_all_extents<T>::type;
1283 template <
typename T>
struct rank : std::rank<T> {};
1286 template <
typename T>
1287 inline constexpr size_t rank_v = std::rank_v<T>;
1293 template <
typename T>
struct decay : std::decay<T> {};
1296 template <
typename T>
1297 using decay_t =
typename std::decay<T>::type;
1303 template<
typename TBase,
typename TDerived>
struct is_base_of : std::is_base_of<TBase, TDerived> {};
1306 template <
typename TBase,
typename TDerived>
1307 inline constexpr bool is_base_of_v = std::is_base_of_v<TBase, TDerived>;
1312 template <
typename T>
struct is_class : std::is_class<T>{};
1315 template <
typename T>
1324 template <
typename T>
1325 using add_lvalue_reference_t =
typename std::add_lvalue_reference<T>::type;
1331 template <
typename T>
struct add_rvalue_reference : std::add_rvalue_reference<T> {};
1335 template <
typename T>
1336 using add_rvalue_reference_t =
typename std::add_rvalue_reference<T>::type;
1342 template <
typename T>
1343 typename std::add_rvalue_reference<T>::type declval() ETL_NOEXCEPT;
1350 template <
typename T>
1351 struct is_enum : std::is_enum<T>
1356 template <
typename T>
1357 inline constexpr bool is_enum_v = etl::is_enum<T>::value;
1366 template <
typename TFrom,
typename TTo>
1367 struct is_convertible : std::is_convertible<TFrom, TTo> {};
1370 template <
typename TFrom,
typename TTo>
1371 struct is_nothrow_convertible
1375 static void sink(TTo)
noexcept;
1378 template <
typename F>
1379 static auto test(
int) -> etl::bool_constant<noexcept(sink(etl::declval<F>()))>;
1386 static ETL_CONSTANT
bool value =
decltype(test<TFrom>(0))::value;
1391 template <
typename TFrom,
typename TTo>
1392 inline constexpr bool is_convertible_v = std::is_convertible_v<TFrom, TTo>;
1394 template <
typename TFrom,
typename TTo >
1395 inline constexpr bool is_nothrow_convertible_v = is_nothrow_convertible<TFrom, TTo>::value;
1401 template <
typename T>
struct alignment_of : std::alignment_of<T> {};
1402 template <>
struct alignment_of<void> : std::integral_constant<size_t, 0> {};
1403 template <>
struct alignment_of<const void> : std::integral_constant <size_t, 0> {};
1406 template <
typename T>
1407 inline constexpr size_t alignment_of_v = std::alignment_of_v<T>;
1420 template <
typename...>
1421 struct conjunction :
public etl::true_type
1425 template <
typename T1,
typename... Tn>
1426 struct conjunction<T1, Tn...> :
public etl::conditional_t<bool(T1::value), etl::conjunction<Tn...>, T1>
1430 template <
typename T>
1431 struct conjunction<T> :
public T
1437 template <
typename... T>
1438 inline constexpr bool conjunction_v = conjunction<T...>::value;
1444 template <
typename...>
1449 template <
typename T1,
typename... Tn>
1450 struct disjunction<T1, Tn...> :
public etl::conditional_t<bool(T1::value), T1, disjunction<Tn...>>
1454 template <
typename T1>
struct disjunction<T1> :
public T1
1460 template <
typename... T>
1461 inline constexpr bool disjunction_v = etl::disjunction<T...>::value;
1469 template <
typename... TTypes>
1470 struct exclusive_disjunction;
1472 template <
typename T>
1473 struct exclusive_disjunction<T> :
public etl::bool_constant<T::value>
1478 template <
typename T1,
typename T2,
typename... TRest>
1479 struct exclusive_disjunction<T1, T2, TRest...> :
public etl::exclusive_disjunction<etl::integral_constant<bool, etl::disjunction<T1, T2>::value && !etl::conjunction<T1, T2>::value>, TRest...>
1485 template <
typename... T>
1486 inline constexpr bool exclusive_disjunction_v = etl::exclusive_disjunction<T...>::value;
1492 template <
bool BValue,
typename T, T TRUE_VALUE, T FALSE_VALUE>
1495 template <
typename T, T TRUE_VALUE, T FALSE_VALUE>
1498 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
1499 static const T value = TRUE_VALUE;
1502 template <
typename T, T TRUE_VALUE, T FALSE_VALUE>
1505 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
1506 static const T value = FALSE_VALUE;
1513 template <
typename T,
typename... TRest>
1514 struct is_one_of : etl::disjunction<etl::is_same<T, TRest>...>
1521 template <
typename T,
1522 typename T1,
typename T2 = void,
typename T3 = void,
typename T4 = void,
1523 typename T5 = void,
typename T6 = void,
typename T7 = void,
typename T8 = void,
1524 typename T9 = void,
typename T10 = void,
typename T11 = void,
typename T12 = void,
1525 typename T13 = void,
typename T14 = void,
typename T15 = void,
typename T16 =
void>
1528 static const bool value =
1529 etl::is_same<T, T1>::value ||
1530 etl::is_same<T, T2>::value ||
1531 etl::is_same<T, T3>::value ||
1532 etl::is_same<T, T4>::value ||
1533 etl::is_same<T, T5>::value ||
1534 etl::is_same<T, T6>::value ||
1535 etl::is_same<T, T7>::value ||
1536 etl::is_same<T, T8>::value ||
1537 etl::is_same<T, T9>::value ||
1538 etl::is_same<T, T10>::value ||
1539 etl::is_same<T, T11>::value ||
1540 etl::is_same<T, T12>::value ||
1541 etl::is_same<T, T13>::value ||
1542 etl::is_same<T, T14>::value ||
1543 etl::is_same<T, T15>::value ||
1544 etl::is_same<T, T16>::value;
1549 template <
typename T,
typename... TRest>
1550 inline constexpr bool is_one_of_v = etl::is_one_of<T, TRest...>::value;
1558 template<
typename T,
typename... TTypes>
1562 template<
typename T>
1563 struct count_type<T> : etl::integral_constant<size_t, 0>
1568 template<
typename T,
typename THead,
typename... TTail>
1569 struct count_type<T, THead, TTail...> : etl::integral_constant<size_t, (etl::is_same<T, THead>::value ? 1 : 0) + count_type<T, TTail...>::value>
1574 template<
typename T,
typename... TTypes>
1575 struct has_duplicates_of
1576 : etl::integral_constant<bool, (private_type_traits::count_type<T, TTypes...>::value > 1)>
1582 template <
typename T,
typename... TRest>
1583 inline constexpr bool has_duplicates_of_v = etl::has_duplicates_of<T, TRest...>::value;
1590 template <
typename TBase,
typename... TDerived>
1591 struct is_base_of_all : etl::conjunction<etl::is_base_of<TBase, TDerived>...>
1597 template <
typename T,
typename... TRest>
1598 inline constexpr bool is_base_of_all_v = etl::is_base_of_all<T, TRest...>::value;
1605 template <
typename TBase,
typename... TDerived>
1606 struct is_base_of_any : etl::disjunction<etl::is_base_of<TBase, TDerived>...>
1613 template <
typename T,
typename... TRest>
1614 inline constexpr bool is_base_of_any_v = etl::is_base_of_any<T, TRest...>::value;
1622 template <
size_t Index,
typename TType>
1625 typedef typename nth_base<Index - 1U,
typename TType::base_type>::type type;
1628 template <
typename TType>
1635 template <
size_t Index,
typename TType>
1636 using nth_base_t =
typename nth_base<Index, TType>::type;
1644 template <
typename T>
1649 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
1653 typedef type_t type;
1654 typedef type_t& reference;
1655 typedef const type_t& const_reference;
1656 typedef type_t* pointer;
1657 typedef const type_t* const_pointer;
1658 typedef const type_t*
const const_pointer_const;
1661 typedef type_t&& rvalue_reference;
1666 template <
typename T>
1671 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
1675 typedef type_t
type;
1677 typedef const type_t& const_reference;
1679 typedef const type_t* const_pointer;
1680 typedef const type_t*
const const_pointer_const;
1683 typedef type_t&& rvalue_reference;
1688 template <
typename T>
1689 struct types<T*
const>
1693 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
1697 typedef type_t
type;
1699 typedef const type_t& const_reference;
1701 typedef const type_t* const_pointer;
1702 typedef const type_t*
const const_pointer_const;
1705 typedef type_t&& rvalue_reference;
1710 template <
typename T>
1715 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
1719 typedef type_t
type;
1721 typedef const type_t& const_reference;
1723 typedef const type_t* const_pointer;
1724 typedef const type_t*
const const_pointer_const;
1727 typedef type_t&& rvalue_reference;
1733 template <
typename T>
1738 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
1742 typedef type_t
type;
1744 typedef const type_t& const_reference;
1746 typedef const type_t* const_pointer;
1747 typedef const type_t*
const const_pointer_const;
1750 typedef type_t&& rvalue_reference;
1756 template <
typename T>
1757 using types_t =
typename types<T>::type;
1759 template <
typename T>
1760 using types_r =
typename types<T>::reference;
1762 template <
typename T>
1763 using types_cr =
typename types<T>::const_reference;
1765 template <
typename T>
1768 template <
typename T>
1769 using types_p =
typename types<T>::pointer;
1771 template <
typename T>
1772 using types_cp =
typename types<T>::const_pointer;
1774 template <
typename T>
1775 using types_cpc =
typename types<T>::const_pointer_const;
1781 template <
typename T>
struct size_of : etl::integral_constant<size_t, sizeof(T)> {};
1782 template <>
struct size_of<void> : etl::integral_constant<size_t, 1U> {};
1785 template <
typename T>
1786 inline constexpr size_t size_of_v = etl::size_of<T>::value;
1792 template <
typename T,
typename... TRest>
1793 struct are_all_same : etl::conjunction<etl::is_same<T, TRest>...>
1799 template <
typename T,
typename... TRest>
1800 inline constexpr bool are_all_same_v = are_all_same<T, TRest...>::value;
1804#if ETL_USING_STL && ETL_USING_CPP11 && !defined(ETL_USE_TYPE_TRAITS_BUILTINS) && !defined(ETL_USER_DEFINED_TYPE_TRAITS) && ((!defined(ARDUINO) && ETL_NOT_USING_STLPORT) || defined(ETL_GCC_V5_TYPE_TRAITS_SUPPORTED))
1812 template<
typename T1,
typename T2>
1817 template<
typename T,
typename... TArgs>
1818 using is_constructible = std::is_constructible<T, TArgs...>;
1822 template <
typename T>
1827 template <
typename T>
1832#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1833 template <
typename T>
1836 template <
typename T>
1842#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1843 template <
typename T>
1846 template <
typename T>
1852#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1853 template <
typename T>
1856 template <
typename T>
1862#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1863 template <
typename T>
1866 template <
typename T>
1872#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1873 template <
typename T>
1876 template <
typename T>
1877 using is_trivially_copyable = etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>;
1880#elif defined(ETL_USE_TYPE_TRAITS_BUILTINS) && !defined(ETL_USER_DEFINED_TYPE_TRAITS)
1888 template<
typename T1,
typename T2>
1891 static ETL_CONSTANT
bool value = __is_assignable(T1, T2);
1897 template<
typename T,
typename... TArgs>
1898 struct is_constructible
1900 static ETL_CONSTANT
bool value = __is_constructible(T, TArgs...);
1905 template<
typename T,
typename TArgs =
void>
1906 struct is_constructible
1908 static ETL_CONSTANT
bool value = __is_constructible(T, TArgs);
1913 template<
typename T>
1914 struct is_constructible<T, void>
1916 static ETL_CONSTANT
bool value = __is_constructible(T);
1922 template <
typename T>
1923 struct is_copy_constructible :
public etl::is_constructible<T, typename etl::add_lvalue_reference<const T>::type>
1929 template <
typename T>
1937 template <
typename T,
typename... TArgs>
1940#if defined(ETL_COMPILER_GCC)
1941 static ETL_CONSTANT
bool value = __has_trivial_constructor(T);
1943 static ETL_CONSTANT
bool value = __is_trivially_constructible(T, TArgs...);
1949 template <
typename T,
typename TArgs =
void>
1952#if defined(ETL_COMPILER_GCC)
1953 static ETL_CONSTANT
bool value = __has_trivial_constructor(T);
1955 static ETL_CONSTANT
bool value = __is_trivially_constructible(T, TArgs);
1961 template <
typename T>
1964#if defined(ETL_COMPILER_GCC)
1965 static ETL_CONSTANT
bool value = __has_trivial_constructor(T);
1967 static ETL_CONSTANT
bool value = __is_trivially_constructible(T);
1974 template <
typename T>
1981 template <
typename T>
1984#if defined(ETL_COMPILER_GCC)
1985 static ETL_CONSTANT
bool value = __has_trivial_destructor(T);
1987 static ETL_CONSTANT
bool value = __is_trivially_destructible(T);
1993 template <
typename T>
1996#if defined(ETL_COMPILER_GCC)
1997 static ETL_CONSTANT
bool value = __has_trivial_copy(T);
1999 static ETL_CONSTANT
bool value = __is_trivially_copyable(T);
2005 template <
typename T>
2008#if defined(ETL_COMPILER_GCC)
2009 static ETL_CONSTANT
bool value = __has_trivial_copy(T);
2011 static ETL_CONSTANT
bool value = __is_trivially_copyable(T);
2015#elif defined(ETL_USER_DEFINED_TYPE_TRAITS) && !defined(ETL_USE_TYPE_TRAITS_BUILTINS)
2024 template <
typename T1,
2026 bool BValue = (etl::is_arithmetic<T1>::value || etl::is_pointer<T1>::value) && (etl::is_arithmetic<T2>::value || etl::is_pointer<T2>::value)>
2029 template <
typename T1,
typename T2>
2034 template <
typename T1,
typename T2>
2040 template <
typename T,
bool BValue,
typename... TArgs>
2041 struct is_constructible_helper;
2043 template <
typename T,
typename... TArgs>
2044 struct is_constructible_helper<T, true, TArgs...> :
public etl::true_type
2048 template <
typename T,
typename... TArgs>
2049 struct is_constructible_helper<T, false, TArgs...>;
2051 template <
typename T,
typename... TArgs>
2052 struct is_constructible :
public is_constructible_helper<T, etl::is_arithmetic<T>::value || etl::is_pointer<T>::value, TArgs...>
2059 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2062 template <
typename T>
2067 template <
typename T>
2072 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2075 template <
typename T>
2080 template <
typename T>
2085 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2088 template <
typename T>
2093 template <
typename T>
2098 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2101 template <
typename T>
2106 template <
typename T>
2111 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2114 template <
typename T>
2119 template <
typename T>
2124 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2127 template <
typename T>
2132 template <
typename T>
2137 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2140 template <
typename T>
2145 template <
typename T>
2157 template <
typename T1,
typename T2>
2158 struct is_assignable :
public etl::bool_constant<(etl::is_arithmetic<T1>::value || etl::is_pointer<T1>::value) && (etl::is_arithmetic<T2>::value || etl::is_pointer<T2>::value)>
2167 template <
class,
class T,
class... TArgs>
2170 template <
class T,
class... TArgs>
2171 struct is_constructible_<void_t<decltype(T(etl::declval<TArgs>()...))>, T, TArgs...> : etl::true_type {};
2176 template <
class T,
class... TArgs>
2177 using is_constructible = private_type_traits::is_constructible_<void_t<>, T, TArgs...>;
2181 template <
class T>
struct is_copy_constructible :
public is_constructible<T, typename etl::add_lvalue_reference<typename etl::add_const<T>::type>::type>{};
2189 template <
typename T>
struct is_move_constructible:
public is_constructible<T, typename etl::add_rvalue_reference<T>::type>{};
2199 template <
typename T>
2200 struct is_copy_constructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2206 template <
typename T>
2207 struct is_move_constructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2214 template <
typename T>
2221 template <
typename T>
2228 template <
typename T>
2235 template <
typename T>
2242 template <
typename T>
2243 struct is_trivially_copyable :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2249 template <
typename T1,
typename T2>
2250 struct is_lvalue_assignable :
public etl::is_assignable<typename etl::add_lvalue_reference<T1>::type,
2251 typename etl::add_lvalue_reference<typename etl::add_const<T2>::type>::type>
2258 template<
typename T,
typename =
void>
2261 template<
typename T>
2264 template <
typename T>
2265 struct is_default_constructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2272 template <
typename T1,
typename T2>
2273 inline constexpr bool is_assignable_v = etl::is_assignable<T1, T2>::value;
2275 template <
typename T1,
typename T2>
2276 inline constexpr bool is_lvalue_assignable_v = etl::is_lvalue_assignable<T1, T2>::value;
2278 template<
typename T,
typename... TArgs>
2279 inline constexpr bool is_constructible_v = etl::is_constructible<T, TArgs...>::value;
2281 template<
typename T,
typename... TArgs>
2282 inline constexpr bool is_default_constructible_v = etl::is_default_constructible<T, TArgs...>::value;
2284 template<
typename T>
2285 inline constexpr bool is_copy_constructible_v = etl::is_copy_constructible<T>::value;
2287 template<
typename T>
2288 inline constexpr bool is_move_constructible_v = etl::is_move_constructible<T>::value;
2290 template <
typename T>
2291 inline constexpr bool is_trivially_constructible_v = etl::is_trivially_constructible<T>::value;
2293 template <
typename T>
2294 inline constexpr bool is_trivially_copy_constructible_v = etl::is_trivially_copy_constructible<T>::value;
2296 template <
typename T>
2297 inline constexpr bool is_trivially_destructible_v = etl::is_trivially_destructible<T>::value;
2299 template <
typename T>
2300 inline constexpr bool is_trivially_copy_assignable_v = etl::is_trivially_copy_assignable<T>::value;
2302 template <
typename T>
2303 inline constexpr bool is_trivially_copyable_v = etl::is_trivially_copyable<T>::value;
2315 template<
typename...>
2322 template <
typename T>
2323 struct common_type<T> : common_type<T, T>
2327 namespace private_common_type
2329 template <
typename T1,
typename T2>
2330 using conditional_result_t =
decltype(
false ? declval<T1>() : declval<T2>());
2332 template <
typename,
typename,
typename =
void>
2333 struct decay_conditional_result
2337 template <
typename T1,
typename T2>
2338 struct decay_conditional_result<T1, T2, void_t<conditional_result_t<T1, T2>>>
2339 : etl::decay<conditional_result_t<T1, T2>>
2343 template <
typename T1,
typename T2,
typename =
void>
2344 struct common_type_2_impl
2345 : decay_conditional_result<const T1&, const T2&>
2349 template <
typename T1,
typename T2>
2350 struct common_type_2_impl<T1, T2, void_t<conditional_result_t<T1, T2>>>
2351 : decay_conditional_result<T1, T2>
2358 template <
typename T1,
typename T2>
2359 struct common_type<T1, T2>
2360 : etl::conditional<etl::is_same<T1, typename etl::decay<T1>::type>::value&& etl::is_same<T2, typename etl::decay<T2>::type>::value,
2361 private_common_type::common_type_2_impl<T1, T2>,
2362 common_type<typename etl::decay<T2>::type,
2363 typename etl::decay<T2>::type>>::type
2369 namespace private_common_type
2371 template <
typename AlwaysVoid,
typename T1,
typename T2,
typename... TRest>
2372 struct common_type_multi_impl
2376 template <
typename T1,
typename T2,
typename... TRest>
2377 struct common_type_multi_impl<void_t<typename common_type<T1, T2>::type>, T1, T2, TRest...>
2378 : common_type<typename common_type<T1, T2>::type, TRest...>
2383 template<
typename T1,
typename T2,
typename... TRest>
2384 struct common_type<T1, T2, TRest...>
2385 : private_common_type::common_type_multi_impl<void, T1, T2, TRest...>
2389 template <
typename... T>
2390 using common_type_t =
typename common_type<T...>::type;
2396 template <
typename T>
2399 typedef typename etl::conditional<
sizeof(T) ==
sizeof(
unsigned char),
unsigned char,
2400 typename etl::conditional<
sizeof(T) ==
sizeof(
unsigned short),
unsigned short,
2401 typename etl::conditional<
sizeof(T) ==
sizeof(
unsigned int),
unsigned int,
2402 typename etl::conditional<
sizeof(T) ==
sizeof(
unsigned long),
unsigned long,
2403 unsigned long long>::type>::type>::type>::type type;
2407 template <
typename T>
2408 using unsigned_type_t =
typename unsigned_type<T>::type;
2414 template <
typename T>
2417 typedef typename etl::conditional<
sizeof(T) ==
sizeof(char), char,
2418 typename etl::conditional<
sizeof(T) ==
sizeof(short), short,
2419 typename etl::conditional<
sizeof(T) ==
sizeof(int), int,
2420 typename etl::conditional<
sizeof(T) ==
sizeof(long), long,
2421 long long>::type>::type>::type>::type type;
2425 template <
typename T>
2426 using signed_type_t =
typename signed_type<T>::type;
2432 template <
typename T>
2436 template <
typename T>
2437 using type_identity_t =
typename type_identity<T>::type;
2442#if ETL_USING_BUILTIN_UNDERLYING_TYPE
2444 template <typename T, bool = etl::is_enum<T>::value>
2448 template <
typename T>
2452 ETL_STATIC_ASSERT(etl::is_enum<T>::value,
"etl::underlying_type can only be used with enumeration types.");
2455 template <
typename T>
2458 typedef __underlying_type(T) type;
2463 template <
typename T>
2471 template <
typename T>
2472 using underlying_type_t =
typename underlying_type<T>::type;
2478 template <
typename... TTypes>
2479 struct has_duplicates;
2481 template <
typename TFirst,
typename... TRest>
2482 struct has_duplicates<TFirst, TRest...> : etl::conditional_t<etl::is_one_of<TFirst, TRest...>::value,
2484 has_duplicates<TRest...>> {};
2486 template <
typename T>
2494 template <
typename... TTypes>
2495 inline constexpr bool has_duplicates_v = etl::has_duplicates<TTypes...>::value;
2501 template <
typename T,
typename... TTypes>
2504 template <
typename T,
typename U,
typename... URest>
2505 struct count_of<T, U, URest...> : etl::integral_constant<size_t,
2506 etl::is_same<T, U>::value +
2507 count_of<T, URest...>::value> {};
2509 template <
typename T>
2510 struct count_of<T> : etl::integral_constant<size_t, 0> {};
2514 template <
typename T,
typename... TTypes>
2515 inline constexpr size_t count_of_v = etl::count_of<T, TTypes...>::value;
2521 template <
typename T,
template <
typename...>
class Template>
2524 template <
template <
typename...>
class Template,
typename... TArgs>
2525 struct is_specialization<Template<TArgs...>, Template> : etl::true_type {};
2529 template <
typename T,
template <
typename...>
class Template>
2530 inline constexpr bool is_specialization_v = etl::is_specialization<T, Template>::value;
2535 ETL_CONSTEXPR
inline bool is_constant_evaluated() ETL_NOEXCEPT
2546#elif ETL_USING_BUILTIN_IS_CONSTANT_EVALUATED == 1
2548 return __builtin_is_constant_evaluated();
2559 template<
typename T>
2565 template<
typename TReturn,
typename... TArgs>
2566 struct is_function<TReturn(TArgs...)> : etl::true_type {};
2568 template<
typename TReturn,
typename... TArgs>
2569 struct is_function<TReturn(TArgs...) const> : etl::true_type {};
2571 template<
typename TReturn,
typename... TArgs>
2572 struct is_function<TReturn(TArgs...) volatile> : etl::true_type {};
2574 template<
typename TReturn,
typename... TArgs>
2575 struct is_function<TReturn(TArgs...) const volatile> : etl::true_type {};
2578 template<
typename TReturn,
typename... TArgs>
2579 struct is_function<TReturn(TArgs..., ...)> : etl::true_type {};
2581 template<
typename TReturn,
typename... TArgs>
2582 struct is_function<TReturn(TArgs..., ...) const> : etl::true_type {};
2584 template<
typename TReturn,
typename... TArgs>
2585 struct is_function<TReturn(TArgs..., ...) volatile> : etl::true_type {};
2587 template<
typename TReturn,
typename... TArgs>
2588 struct is_function<TReturn(TArgs..., ...) const volatile> : etl::true_type {};
2591#if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
2592 template<
typename TReturn,
typename... TArgs>
2593 struct is_function<TReturn(TArgs...) noexcept> : etl::true_type {};
2595 template<
typename TReturn,
typename... TArgs>
2596 struct is_function<TReturn(TArgs...) const noexcept> : etl::true_type {};
2598 template<
typename TReturn,
typename... TArgs>
2599 struct is_function<TReturn(TArgs...) volatile noexcept> : etl::true_type {};
2601 template<
typename TReturn,
typename... TArgs>
2602 struct is_function<TReturn(TArgs...) const volatile noexcept> : etl::true_type {};
2605 template<
typename TReturn,
typename... TArgs>
2606 struct is_function<TReturn(TArgs..., ...) noexcept> : etl::true_type {};
2608 template<
typename TReturn,
typename... TArgs>
2609 struct is_function<TReturn(TArgs..., ...) const noexcept> : etl::true_type {};
2611 template<
typename TReturn,
typename... TArgs>
2612 struct is_function<TReturn(TArgs..., ...) volatile noexcept> : etl::true_type {};
2614 template<
typename TReturn,
typename... TArgs>
2615 struct is_function<TReturn(TArgs..., ...) const volatile noexcept> : etl::true_type {};
2619 template <
typename T>
2620 inline constexpr bool is_function_v = etl::is_function<T>::value;
2628 template <
typename T, etl::enable_if_t<etl::is_
class<etl::decay_t<T>>::value,
int> = 0>
2629 struct has_call_operator
2631 template <
typename U>
2632 static auto test(
int) ->
decltype(&U::operator(), etl::true_type());
2637 static const bool value = etl::is_same<decltype(test<T>(0)), etl::true_type>::value;
2641 template <
typename T>
2642 inline constexpr bool has_call_operator_v = etl::has_call_operator<T>::value;
2650 template <
typename T, etl::enable_if_t<etl::is_
class<etl::decay_t<T>>::value,
int> = 0>
2651 struct has_unique_call_operator
2656 template <
typename U>
2657 static auto test(
int) ->
decltype(&U::operator(), etl::true_type());
2668 static constexpr bool value =
decltype(test<etl::decay_t<T>>(0))::value;
2672 template <
typename T>
2673 inline constexpr bool has_unique_call_operator_v = etl::has_unique_call_operator<T>::value;
2682 template<
typename T>
2685 template<
typename T,
typename TObject>
2689 template<
typename T>
2693 template <
typename T>
2694 inline constexpr bool is_member_pointer_v = etl::is_member_pointer<T>::value;
2701 template <
typename T>
struct is_member_function_pointer :
etl::false_type {};
2703 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...)> : etl::true_type {};
2704 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const> : etl::true_type {};
2705 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) volatile> : etl::true_type {};
2706 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const volatile> : etl::true_type {};
2708#if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
2709 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) noexcept> : etl::true_type {};
2710 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const noexcept> : etl::true_type {};
2711 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) volatile noexcept> : etl::true_type {};
2712 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const volatile noexcept> : etl::true_type {};
2715 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) &> : etl::true_type {};
2716 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const &> : etl::true_type {};
2717 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) volatile &> : etl::true_type {};
2718 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const volatile &> : etl::true_type {};
2720 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) &&> : etl::true_type {};
2721 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const &&> : etl::true_type {};
2722 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) volatile &&> : etl::true_type {};
2723 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const volatile &&>: etl::true_type {};
2725#if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
2726 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) & noexcept> : etl::true_type {};
2727 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const & noexcept> : etl::true_type {};
2728 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) volatile & noexcept> : etl::true_type {};
2729 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const volatile & noexcept> : etl::true_type {};
2731 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) && noexcept> : etl::true_type {};
2732 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const && noexcept> : etl::true_type {};
2733 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) volatile && noexcept> : etl::true_type {};
2734 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs...) const volatile && noexcept>: etl::true_type {};
2737 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...)> : etl::true_type {};
2738 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const> : etl::true_type {};
2739 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) volatile> : etl::true_type {};
2740 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const volatile> : etl::true_type {};
2742#if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
2743 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) noexcept> : etl::true_type {};
2744 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const noexcept> : etl::true_type {};
2745 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) volatile noexcept> : etl::true_type {};
2746 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const volatile noexcept> : etl::true_type {};
2749 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) &> : etl::true_type {};
2750 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const &> : etl::true_type {};
2751 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) volatile &> : etl::true_type {};
2752 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const volatile &> : etl::true_type {};
2753 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) &&> : etl::true_type {};
2754 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const &&> : etl::true_type {};
2755 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) volatile &&> : etl::true_type {};
2756 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const volatile &&>: etl::true_type {};
2758#if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
2759 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) & noexcept> : etl::true_type {};
2760 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const & noexcept> : etl::true_type {};
2761 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) volatile & noexcept> : etl::true_type {};
2762 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const volatile & noexcept> : etl::true_type {};
2764 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) && noexcept> : etl::true_type {};
2765 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const && noexcept> : etl::true_type {};
2766 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) volatile && noexcept> : etl::true_type {};
2767 template <
typename TReturn,
typename TObject,
typename... TArgs>
struct is_member_function_pointer<TReturn(TObject::*)(TArgs..., ...) const volatile && noexcept>: etl::true_type {};
2772 template <
typename T>
2773 inline constexpr bool is_member_function_pointer_v = etl::is_member_function_pointer<T>::value;
2785 template<
typename T,
typename TObject>
2786 struct is_member_object_pointer_helper<T TObject::*> :
public etl::negation<etl::is_function<T>> {};
2789 template<
typename T>
struct is_member_object_pointer :
public private_type_traits::is_member_object_pointer_helper<etl::remove_cv_t<T>>::type {};
2793 template <
typename T>
2794 inline constexpr bool is_member_object_pointer_v = etl::is_member_object_pointer<T>::value;
2799#define ETL_IS_CHAR_TYPE(type) (etl::is_same<char, type>::value || etl::is_same<signed char, type>::value || etl::is_same<unsigned char, type>::value)
2800#define ETL_IS_NOT_CHAR_TYPE(type) (!ETL_IS_CHAR_TYPE(type))
2802#define ETL_IS_POINTER_TYPE(type) (etl::is_pointer<type>::value)
2803#define ETL_IS_NOT_POINTER_TYPE(type) (!ETL_IS_POINTER_TYPE(type))
2805#define ETL_TARGET_IS_TRIVIALLY_COPYABLE(type) (etl::is_trivially_copyable<typename etl::iterator_traits<type>::value_type>::value)
2806#define ETL_TARGET_IS_NOT_TRIVIALLY_COPYABLE(type) (!ETL_TARGET_IS_TRIVIALLY_COPYABLE(type))
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits_generator.h:899
add_const
Definition type_traits_generator.h:991
add_cv
Definition type_traits_generator.h:1041
add_pointer
Definition type_traits_generator.h:961
add_volatile
Definition type_traits_generator.h:1021
add_rvalue_reference
Definition type_traits_generator.h:1413
conditional
Definition type_traits_generator.h:1223
decay
Definition type_traits_generator.h:1305
enable_if
Definition type_traits_generator.h:1254
extent
Definition type_traits_generator.h:1265
integral_constant
Definition type_traits_generator.h:895
is_arithmetic
Definition type_traits_generator.h:1124
is_array
Definition type_traits_generator.h:1154
is_base_of
Definition type_traits_generator.h:1315
is_compound
Definition type_traits_generator.h:1144
is_const
Definition type_traits_generator.h:971
is_floating_point
Definition type_traits_generator.h:1094
is_fundamental
Definition type_traits_generator.h:1134
is_integral
Definition type_traits_generator.h:1064
is_lvalue_reference
Definition type_traits_generator.h:1184
is_rvalue_reference
Definition type_traits_generator.h:1207
is_pointer
Definition type_traits_generator.h:1164
is_reference
Definition type_traits_generator.h:1174
is_same
Definition type_traits_generator.h:1104
is_signed
Definition type_traits_generator.h:1074
is_unsigned
Definition type_traits_generator.h:1084
is_void
Definition type_traits_generator.h:1114
is_volatile
Definition type_traits_generator.h:1001
make_signed
Definition type_traits_generator.h:1234
make_unsigned
Definition type_traits_generator.h:1244
negation
Definition type_traits_generator.h:929
rank
Definition type_traits_generator.h:1295
remove_all_extents
Definition type_traits_generator.h:1285
remove_const
Definition type_traits_generator.h:981
remove_cv
Definition type_traits_generator.h:1031
remove_cvref
Definition type_traits_generator.h:1052
remove_extent
Definition type_traits_generator.h:1275
remove_pointer
Definition type_traits_generator.h:951
remove_reference
Definition type_traits_generator.h:941
remove_volatile
Definition type_traits_generator.h:1011
Is T a member pointer.
Definition type_traits_generator.h:2688
bitset_ext
Definition absolute.h:39
add_lvalue_reference
Definition type_traits_generator.h:1333
Definition type_traits_generator.h:912
exclusive_disjunction
Definition type_traits_generator.h:1505
Definition type_traits_generator.h:2166
is_class
Definition type_traits_generator.h:1324
Definition type_traits_generator.h:2208
Definition type_traits_generator.h:2273
Definition type_traits_generator.h:2259
Definition type_traits_generator.h:2697
Definition type_traits_generator.h:2215
Definition type_traits_generator.h:2223
Definition type_traits_generator.h:2244
Definition type_traits_generator.h:2230
Definition type_traits_generator.h:2251
Definition type_traits_generator.h:2237
Get the Nth base of a recursively inherited type. Requires that the class has defined 'base_type'.
Definition type_traits_generator.h:1631
Definition type_traits_generator.h:2690
Defines one of five signed types that has the same size as T.
Definition type_traits_generator.h:2423
size_of
Definition type_traits_generator.h:1788
Definition type_traits_generator.h:2440
A set of templates to allow related types to be derived.
Definition type_traits_generator.h:1653
Primary template for etl::underlying_type Users must specialise this template for their enumerations.
Definition type_traits_generator.h:2472
Defines one of five unsigned types that has the same size as T.
Definition type_traits_generator.h:2405