36#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
65#ifndef ETL_TYPE_TRAITS_INCLUDED
66#define ETL_TYPE_TRAITS_INCLUDED
70#include "static_assert.h"
80#if ETL_USING_STL && ETL_USING_CPP11
81 #include <type_traits>
87 template <
typename...>
91#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
99 template <
typename T, T VALUE>
100 struct integral_constant
102 static const T value =
VALUE;
104 typedef T value_type;
107 operator value_type()
const
117 template <
typename T, T VALUE>
118 const T integral_constant<T, VALUE>::value;
121 template <
typename T, T VALUE>
127 using bool_constant = integral_constant<bool, B>;
140 template <
typename T>
146 template <
typename T>
147 inline constexpr bool negation_v = negation<T>::value;
152 template <
typename T>
struct remove_reference {
typedef T type; };
153 template <
typename T>
struct remove_reference<
T&> {
typedef T type; };
155 template <
typename T>
struct remove_reference<
T&&> {
typedef T type; };
159 template <
typename T>
165 template <
typename T>
struct remove_pointer {
typedef T type; };
166 template <
typename T>
struct remove_pointer<
T*> {
typedef T type; };
167 template <
typename T>
struct remove_pointer<
const T*> {
typedef const T type; };
168 template <
typename T>
struct remove_pointer<
volatile T*> {
typedef volatile T type; };
169 template <
typename T>
struct remove_pointer<
const volatile T*> {
typedef const volatile T type; };
170 template <
typename T>
struct remove_pointer<
T*
const> {
typedef T type; };
171 template <
typename T>
struct remove_pointer<
const T*
const> {
typedef const T type; };
172 template <
typename T>
struct remove_pointer<
volatile T*
const> {
typedef volatile T type; };
173 template <
typename T>
struct remove_pointer<
const volatile T*
const> {
typedef const volatile T type; };
176 template <
typename T>
182 template <
typename T>
struct add_pointer {
typedef typename remove_reference<T>::type* type; };
185 template <
typename T>
191 template <
typename T>
struct is_const :
false_type {};
192 template <
typename T>
struct is_const<
const T> : true_type {};
193 template <
typename T>
struct is_const<
const volatile T> : true_type {};
196 template <
typename T>
197 inline constexpr bool is_const_v = is_const<T>::value;
202 template <
typename T>
struct remove_const {
typedef T type; };
203 template <
typename T>
struct remove_const<
const T> {
typedef T type; };
206 template <
typename T>
212 template <
typename T>
struct add_const {
typedef const T type; };
213 template <
typename T>
struct add_const<
const T> {
typedef const T type; };
216 template <
typename T>
222 template <
typename T>
struct is_volatile :
false_type {};
223 template <
typename T>
struct is_volatile<
volatile T> : true_type {};
224 template <
typename T>
struct is_volatile<
const volatile T> : true_type {};
227 template <
typename T>
233 template <
typename T>
struct remove_volatile {
typedef T type; };
234 template <
typename T>
struct remove_volatile<
volatile T> {
typedef T type; };
237 template <
typename T>
243 template <
typename T>
struct add_volatile {
typedef volatile T type; };
244 template <
typename T>
struct add_volatile<
volatile T> {
typedef volatile T type; };
247 template <
typename T>
253 template <
typename T>
struct remove_cv
259 template <
typename T>
265 template <
typename T>
struct add_cv
271 template <
typename T>
272 using add_cv_t =
typename add_cv<T>::type;
277 template <
typename T>
struct remove_cvref
283 template <
typename T>
289 template <
typename T>
struct is_integral :
false_type {};
290 template <>
struct is_integral<
bool> : true_type {};
291 template <>
struct is_integral<
char> : true_type {};
292 template <>
struct is_integral<
unsigned char> : true_type {};
293 template <>
struct is_integral<
signed char> : true_type {};
294 template <>
struct is_integral<
wchar_t> : true_type {};
295 template <>
struct is_integral<
short> : true_type {};
296 template <>
struct is_integral<
unsigned short> : true_type {};
297 template <>
struct is_integral<
int> : true_type {};
298 template <>
struct is_integral<
unsigned int> : true_type {};
299 template <>
struct is_integral<
long> : true_type {};
300 template <>
struct is_integral<
unsigned long> : true_type {};
301 template <>
struct is_integral<
long long> : true_type {};
303#if ETL_HAS_NATIVE_CHAR8_T
304 template <>
struct is_integral<char8_t> : true_type {};
306#if ETL_HAS_NATIVE_CHAR16_T
307 template <>
struct is_integral<char16_t> : true_type {};
309#if ETL_HAS_NATIVE_CHAR32_T
310 template <>
struct is_integral<char32_t> : true_type {};
312 template <
typename T>
struct is_integral<
const T> : is_integral<T> {};
313 template <
typename T>
struct is_integral<
volatile T> : is_integral<T> {};
314 template <
typename T>
struct is_integral<
const volatile T> : is_integral<T> {};
317 template <
typename T>
323 template <
typename T>
struct is_signed :
false_type {};
325 template <> struct is_signed<wchar_t> : public etl::bool_constant<wchar_t(-1) < wchar_t(0)> {};
326 template <> struct is_signed<signed char> : true_type {};
327 template <> struct is_signed<short> : true_type {};
328 template <> struct is_signed<int> : true_type {};
329 template <> struct is_signed<long> : true_type {};
330 template <> struct is_signed<long long> : true_type {};
331 template <> struct is_signed<float> : true_type {};
332 template <> struct is_signed<double> : true_type {};
333 template <> struct is_signed<long double> : true_type {};
334#if ETL_HAS_NATIVE_CHAR8_T
335 template <> struct is_signed<char8_t> : true_type {};
337#if ETL_HAS_NATIVE_CHAR16_T
338 template <> struct is_signed<char16_t> : true_type {};
340#if ETL_HAS_NATIVE_CHAR32_T
341 template <> struct is_signed<char32_t> : true_type {};
343 template <typename T> struct is_signed<const T> : is_signed<T> {};
344 template <typename T> struct is_signed<volatile T> : is_signed<T> {};
345 template <typename T> struct is_signed<const volatile T> : is_signed<T> {};
348 template <typename T>
349 inline constexpr bool is_signed_v = is_signed<T>::value;
354 template <typename T> struct is_unsigned : false_type {};
355 template <> struct is_unsigned<bool> : true_type {};
356 template <> struct is_unsigned<char> : etl::bool_constant<(char(255) > 0)> {};
357 template <> struct is_unsigned<unsigned char> : true_type {};
358 template <> struct is_unsigned<wchar_t> : public etl::bool_constant<(wchar_t(-1) > wchar_t(0))> {};
359 template <>
struct is_unsigned<
unsigned short> : true_type {};
360 template <>
struct is_unsigned<
unsigned int> : true_type {};
361 template <>
struct is_unsigned<
unsigned long> : true_type {};
363 template <
typename T>
struct is_unsigned<
const T> : is_unsigned<T> {};
364 template <
typename T>
struct is_unsigned<
volatile T> : is_unsigned<T> {};
365 template <
typename T>
struct is_unsigned<
const volatile T> : is_unsigned<T> {};
368 template <
typename T>
374 template <
typename T>
struct is_floating_point :
false_type {};
375 template <>
struct is_floating_point<
float> : true_type {};
376 template <>
struct is_floating_point<
double> : true_type {};
377 template <>
struct is_floating_point<
long double> : true_type {};
378 template <
typename T>
struct is_floating_point<
const T> : is_floating_point<T> {};
379 template <
typename T>
struct is_floating_point<
volatile T> : is_floating_point<T> {};
380 template <
typename T>
struct is_floating_point<
const volatile T> : is_floating_point<T> {};
383 template <
typename T>
389 template <
typename T1,
typename T2>
struct is_same :
public false_type {};
390 template <
typename T>
struct is_same<
T,
T> :
public true_type {};
393 template <
typename T1,
typename T2>
394 inline constexpr bool is_same_v = is_same<T1, T2>::value;
399 template<
typename T>
struct is_void :
false_type {};
400 template<>
struct is_void<
void> : true_type {};
403 template <
typename T>
404 inline constexpr bool is_void_v = is_void<T>::value;
409 template<
typename T>
struct is_arithmetic :
etl::bool_constant<is_integral<T>::value || is_floating_point<T>::value> {};
412 template <
typename T>
418 template <
typename T>
struct is_fundamental :
etl::bool_constant<is_arithmetic<T>::value || is_void<T>::value> {};
421 template <
typename T>
427 template <
typename T>
struct is_compound :
etl::bool_constant<!is_fundamental<T>::value> {};
430 template <
typename T>
436 template <
typename T>
struct is_array :
false_type {};
437 template <
typename T>
struct is_array<
T[]> : true_type {};
438 template <
typename T,
size_t MAXN>
struct is_array<
T[
MAXN]> : true_type {};
441 template <
typename T>
442 inline constexpr bool is_array_v = is_array<T>::value;
452 template<
typename T>
struct is_pointer :
is_pointer_helper<typename remove_cv<T>::type> {};
455 template <
typename T>
456 inline constexpr bool is_pointer_v = is_pointer<T>::value;
466 template <
typename T>
478 template <
typename T>
486 template<
typename T>
struct is_reference : integral_constant<bool,
487 is_lvalue_reference<T>::value
489 || is_rvalue_reference<T>::value
494 template <
typename T>
501 template <
typename T>
struct is_pod :
etl::bool_constant<etl::is_fundamental<T>::value || etl::is_pointer<T>::value> {};
504 template <
typename T>
510 template <
bool B,
typename T,
typename F>
struct conditional {
typedef T type; };
511 template <
typename T,
typename F>
struct conditional<false,
T,
F> {
typedef F type; };
514 template <
bool B,
typename T,
typename F>
520 template <
typename T>
struct make_signed {
typedef T type; };
521 template <>
struct make_signed<
char> {
typedef signed char type; };
522 template <>
struct make_signed<
unsigned char> {
typedef signed char type; };
524 template <>
struct make_signed<
wchar_t>
530 void>::type>::type type;
533 template <>
struct make_signed<
unsigned short> {
typedef short type; };
534 template <>
struct make_signed<
unsigned int> {
typedef int type; };
535 template <>
struct make_signed<
unsigned long> {
typedef long type; };
536 template <>
struct make_signed<
unsigned long long> {
typedef long long type; };
537 template <
typename T>
struct make_signed<
const T> : add_const<typename make_signed<T>::type> {};
538 template <
typename T>
struct make_signed<
volatile T> : add_volatile<typename make_signed<T>::type> {};
539 template <
typename T>
struct make_signed<
const volatile T> : add_const<typename add_volatile<typename make_signed<T>::type>::type> {};
542 template <
typename T>
548 template <
typename T>
struct make_unsigned {
typedef T type; };
549 template <>
struct make_unsigned<
char> {
typedef unsigned char type; };
550 template <>
struct make_unsigned<
signed char> {
typedef unsigned char type; };
551 template <>
struct make_unsigned<
short> {
typedef unsigned short type; };
553 template <>
struct make_unsigned<
wchar_t>
559 void>::type>::type type;
562 template <>
struct make_unsigned<
int> {
typedef unsigned int type; };
563 template <>
struct make_unsigned<
long> {
typedef unsigned long type; };
564 template <>
struct make_unsigned<
long long> {
typedef unsigned long long type; };
565 template <
typename T>
struct make_unsigned<
const T> : add_const<typename make_unsigned<T>::type> {};
566 template <
typename T>
struct make_unsigned<
volatile T> : add_volatile<typename make_unsigned<T>::type> {};
567 template <
typename T>
struct make_unsigned<
const volatile T> : add_const<typename add_volatile<typename make_unsigned<T>::type>::type> {};
570 template <
typename T>
576 template <
bool B,
typename T =
void>
struct enable_if {};
577 template <
typename T>
struct enable_if<true,
T> {
typedef T type; };
580 template <
bool B,
typename T =
void>
581 using enable_if_t =
typename enable_if<B, T>::type;
586 template <
typename T,
unsigned MAXN = 0U>
587 struct extent : integral_constant<size_t, 0U> {};
589 template <
typename T>
590 struct extent<
T[], 0> : integral_constant<size_t, 0U> {};
592 template <
typename T,
unsigned MAXN>
593 struct extent<
T[],
MAXN> : integral_constant<size_t, extent<T, MAXN - 1>::value> {};
595 template <
typename T,
unsigned MAXN>
596 struct extent<
T[
MAXN], 0> : integral_constant<size_t, MAXN> {};
598 template <
typename T,
unsigned I,
unsigned MAXN>
599 struct extent<
T[
I],
MAXN> : integral_constant<size_t, extent<T, MAXN - 1>::value> {};
602 template <
typename T,
unsigned N = 0U>
603 inline constexpr size_t extent_v = extent<T, N>::value;
608 template <
typename T>
struct remove_extent {
typedef T type; };
609 template <
typename T>
struct remove_extent<
T[]> {
typedef T type; };
610 template <
typename T,
size_t MAXN>
struct remove_extent<
T[
MAXN]> {
typedef T type; };
613 template <
typename T>
619 template <
typename T>
struct remove_all_extents {
typedef T type; };
620 template <
typename T>
struct remove_all_extents<
T[]> {
typedef typename remove_all_extents<T>::type type; };
621 template <
typename T,
size_t MAXN>
struct remove_all_extents<
T[
MAXN]> {
typedef typename remove_all_extents<T>::type type; };
624 template <
typename T>
630 template <
typename T>
struct rank : integral_constant<size_t, 0> {};
631 template <
typename T>
struct rank<
T[]> :
public integral_constant<size_t, rank<T>::value + 1> {};
632 template <
typename T,
size_t MAXN>
struct rank<
T[
MAXN]> :
public integral_constant<size_t, rank<T>::value + 1> {};
635 template <
typename T>
636 inline constexpr size_t rank_v = rank<T>::value;
641 template <
typename T>
644 typedef typename etl::remove_reference<T>::type
U;
647 typename etl::remove_cv<U>::type>::type type;
651 template <
typename T>
652 using decay_t =
typename decay<T>::type;
657 template<
typename TBase,
665 static char check(...) {
return 0; }
673 template<
typename TBase,
typename TDerived>
676 static const bool value =
false;
680 template <
typename T1,
typename T2>
681 inline constexpr bool is_base_of_v = is_base_of<T1, T2>::value;
688 template <
typename T>
char test(
int T::*);
690 struct dummy {
char c[2]; };
691 template <
typename T> dummy test(...);
694 template <
typename T>
698 template <
typename T>
699 inline constexpr bool is_class_v = is_class<T>::value;
704 template <
typename T>
struct add_lvalue_reference {
typedef T& type; };
712 template <
typename T>
728 template <
typename T>
735 template <
typename T>
736 typename etl::add_rvalue_reference<T>::type
declval() ETL_NOEXCEPT;
748 template <
typename T,
typename =
int>
756 template <
typename T>
763 template <
typename T>
766 !is_class<T>::value &&
767 !is_arithmetic<T>::value &&
768 !is_reference<T>::value>
773 template <
typename T>
774 inline constexpr bool is_enum_v = etl::is_enum<T>::value;
780 template <
typename T>
783 static char test(
int);
784 static double test(...);
786 static const bool value =
sizeof(test(
static_cast<T
>(0))) ==
sizeof(
char);
791 template <
typename T>
794 static const bool value = private_type_traits::is_convertible_to_int<T>::value &&
795 !is_class<T>::value &&
796 !is_arithmetic<T>::value &&
797 !is_reference<T>::value;
809 template <
typename T>
815 template <
typename TFrom,
typename TTo>
818 template <
typename,
typename>
822#if defined(ETL_COMPILER_ARM5)
823 template <
typename TFrom,
typename TTo>
826 template <
typename TFrom,
typename TTo>
828 decltype(private_type_traits::nonvoid_convertible<TFrom, TTo>(0))::value) ||
829 (etl::is_void<TFrom>::value && etl::is_void<TTo>::value)> {};
834 template <
typename TFrom,
typename TTo >
835 inline constexpr bool is_convertible_v = etl::is_convertible<TFrom, TTo>::value;
841#if ETL_USING_CPP11 && !defined(ETL_COMPILER_ARM5)
842 template <
typename T>
struct alignment_of : integral_constant<size_t, alignof(T)> { };
843#elif defined(ETL_COMPILER_MICROSOFT)
844 template <
typename T>
struct alignment_of : integral_constant<size_t, size_t(__alignof(T))> {};
845#elif defined(ETL_COMPILER_IAR) || defined(ETL_COMPILER_TI)
846 template <
typename T>
struct alignment_of : integral_constant<size_t, size_t(__ALIGNOF__(T))> {};
848 template <
typename T>
struct alignment_of : integral_constant<size_t, size_t(__alignof__(T))> {};
853 template <>
struct alignment_of<
void> : integral_constant <size_t, 0> {};
854 template <>
struct alignment_of<
const void> : integral_constant <size_t, 0> {};
857 template <
typename T>
870 template <
typename T, T VALUE>
879 template <
typename T, T VALUE>
900 template <
typename T>
903 template <
typename T>
910 template <
typename T>
911 inline constexpr bool negation_v = std::negation_v<T>;
920 template <
typename T>
930 template <
typename T>
937 template <
typename T>
struct add_pointer : std::add_pointer<T> {};
940 template <
typename T>
947 template <
typename T>
struct is_const : std::is_const<T> {};
950 template <
typename T>
951 inline constexpr bool is_const_v = std::is_const_v<T>;
960 template <
typename T>
967 template <
typename T>
struct add_const : std::add_const<T> {};
970 template <
typename T>
971 using add_const_t =
typename std::add_const<T>::type;
977 template <
typename T>
struct is_volatile : std::is_volatile<T> {};
980 template <
typename T>
990 template <
typename T>
1000 template <
typename T>
1007 template <
typename T>
struct remove_cv : std::remove_cv<T> {};
1010 template <
typename T>
1011 using remove_cv_t =
typename std::remove_cv<T>::type;
1017 template <
typename T>
struct add_cv : std::add_cv<T> {};
1020 template <
typename T>
1021 using add_cv_t =
typename std::add_cv<T>::type;
1029 typedef typename std::remove_cv<typename std::remove_reference<T>::type>::type type;
1033 template <
typename T>
1043 template <
typename T>
1044 inline constexpr bool is_integral_v = std::is_integral_v<T>;
1050 template <
typename T>
struct is_signed : std::is_signed<T> {};
1053 template <
typename T>
1054 inline constexpr bool is_signed_v = std::is_signed_v<T>;
1063 template <
typename T>
1064 inline constexpr bool is_unsigned_v = std::is_unsigned_v<T>;
1073 template <
typename T>
1080 template <
typename T1,
typename T2>
struct is_same : std::is_same<T1, T2> {};
1083 template <
typename T1,
typename T2>
1084 inline constexpr bool is_same_v = std::is_same_v<T1, T2>;
1090 template<
typename T>
struct is_void : std::is_void<T> {};
1093 template <
typename T>
1094 inline constexpr bool is_void_v = std::is_void_v<T>;
1103 template <
typename T>
1113 template <
typename T>
1123 template <
typename T>
1124 inline constexpr bool is_compound_v = std::is_compound_v<T>;
1130 template <
typename T>
struct is_array : std::is_array<T> {};
1133 template <
typename T>
1134 inline constexpr bool is_array_v = std::is_array_v<T>;
1143 template <
typename T>
1144 inline constexpr bool is_pointer_v = std::is_pointer_v<T>;
1153 template <
typename T>
1163 template <
typename T>
1174 template <
typename T>
1182 template <
typename T>
1183 struct is_pod : std::integral_constant<bool, std::is_standard_layout<T>::value && std::is_trivial<T>::value> {};
1186 template <
typename T>
1187 inline constexpr bool is_pod_v = std::is_standard_layout_v<T> && std::is_trivial_v<T>;
1190#if defined(ETL_COMPILER_GCC)
1191 #if ETL_COMPILER_VERSION >= 5
1192 #define ETL_GCC_V5_TYPE_TRAITS_SUPPORTED
1199 template <
bool B,
typename T,
typename F>
struct conditional {
typedef T type; };
1200 template <
typename T,
typename F>
struct conditional<false,
T,
F> {
typedef F type; };
1203 template <
bool B,
typename T,
typename F>
1213 template <
typename T>
1223 template <
typename T>
1230 template <
bool B,
typename T =
void>
struct enable_if : std::enable_if<B, T> {};
1233 template <
bool B,
typename T =
void>
1234 using enable_if_t =
typename std::enable_if<B, T>::type;
1240 template <
typename T,
unsigned MAXN = 0U>
1244 template <
typename T,
unsigned MAXN = 0U>
1245 inline constexpr size_t extent_v = std::extent_v<T, MAXN>;
1254 template <
typename T>
1264 template <
typename T>
1271 template <
typename T>
struct rank : std::rank<T> {};
1274 template <
typename T>
1275 inline constexpr size_t rank_v = std::rank_v<T>;
1281 template <
typename T>
struct decay : std::decay<T> {};
1284 template <
typename T>
1285 using decay_t =
typename std::decay<T>::type;
1291 template<
typename TBase,
typename TDerived>
struct is_base_of : std::is_base_of<TBase, TDerived> {};
1294 template <
typename TBase,
typename TDerived>
1295 inline constexpr bool is_base_of_v = std::is_base_of_v<TBase, TDerived>;
1300 template <
typename T>
struct is_class : std::is_class<T>{};
1303 template <
typename T>
1312 template <
typename T>
1323 template <
typename T>
1330 template <
typename T>
1331 typename std::add_rvalue_reference<T>::type
declval() ETL_NOEXCEPT;
1338 template <
typename T>
1339 struct is_enum : std::is_enum<T>
1344 template <
typename T>
1345 inline constexpr bool is_enum_v = etl::is_enum<T>::value;
1354 template <
typename TFrom,
typename TTo>
1359 template <
typename TFrom,
typename TTo>
1360 inline constexpr bool is_convertible_v = std::is_convertible_v<TFrom, TTo>;
1371 template <
typename T>
1385 template <
typename...>
1390 template <
typename T1,
typename...
Tn>
1395 template <
typename T>
1402 template <
typename...
T>
1409 template <
typename...>
1414 template <
typename T1,
typename...
Tn>
1425 template <
typename...
T>
1434 template <
typename...
TTypes>
1437 template <
typename T>
1443 template <
typename T1,
typename T2,
typename...
TRest>
1450 template <
typename...
T>
1457 template <
bool B,
typename T, T TRUE_VALUE, T FALSE_VALUE>
1460 template <
typename T, T TRUE_VALUE, T FALSE_VALUE>
1467 template <
typename T, T TRUE_VALUE, T FALSE_VALUE>
1478 template <
typename T,
typename...
TRest>
1509 template <
typename T,
typename...
TRest>
1518 template<
typename T,
typename...
TTypes>
1522 template<
typename T>
1528 template<
typename T,
typename THead,
typename...
TTail>
1534 template<
typename T,
typename...
TTypes>
1542 template <
typename T,
typename...
TRest>
1557 template <
typename T,
typename...
TRest>
1573 template <
typename T,
typename...
TRest>
1582 template <
size_t N,
typename TType>
1585 typedef typename nth_base<
N - 1U,
typename TType::base_type>::type type;
1588 template <
typename TType>
1595 template <
size_t N,
typename TType>
1596 using nth_base_t =
typename nth_base<N, TType>::type;
1604 template <
typename T>
1613 typedef type_t type;
1614 typedef type_t& reference;
1615 typedef const type_t& const_reference;
1616 typedef type_t* pointer;
1617 typedef const type_t* const_pointer;
1618 typedef const type_t*
const const_pointer_const;
1626 template <
typename T>
1635 typedef type_t type;
1636 typedef type_t& reference;
1637 typedef const type_t& const_reference;
1638 typedef type_t* pointer;
1639 typedef const type_t* const_pointer;
1640 typedef const type_t*
const const_pointer_const;
1648 template <
typename T>
1657 typedef type_t type;
1658 typedef type_t& reference;
1659 typedef const type_t& const_reference;
1660 typedef type_t* pointer;
1661 typedef const type_t* const_pointer;
1662 typedef const type_t*
const const_pointer_const;
1670 template <
typename T>
1679 typedef type_t type;
1680 typedef type_t& reference;
1681 typedef const type_t& const_reference;
1682 typedef type_t* pointer;
1683 typedef const type_t* const_pointer;
1684 typedef const type_t*
const const_pointer_const;
1693 template <
typename T>
1702 typedef type_t type;
1703 typedef type_t& reference;
1704 typedef const type_t& const_reference;
1705 typedef type_t* pointer;
1706 typedef const type_t* const_pointer;
1707 typedef const type_t*
const const_pointer_const;
1716 template <
typename T>
1717 using types_t =
typename types<T>::type;
1719 template <
typename T>
1720 using types_r =
typename types<T>::reference;
1722 template <
typename T>
1723 using types_cr =
typename types<T>::const_reference;
1725 template <
typename T>
1726 using types_rr =
typename types<T>::rvalue_reference;
1728 template <
typename T>
1729 using types_p =
typename types<T>::pointer;
1731 template <
typename T>
1732 using types_cp =
typename types<T>::const_pointer;
1734 template <
typename T>
1735 using types_cpc =
typename types<T>::const_pointer_const;
1745 template <
typename T>
1752 template <
typename T,
typename...
TRest>
1759 template <
typename T,
typename...
TRest>
1764#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))
1772 template<
typename T1,
typename T2>
1773 using is_assignable = std::is_assignable<T1, T2>;
1777 template<
typename T,
typename...
TArgs>
1782 template <
typename T>
1783 using is_copy_constructible = std::is_copy_constructible<T>;
1787 template <
typename T>
1788 using is_move_constructible = std::is_move_constructible<T>;
1792#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1793 template <
typename T>
1794 using is_trivially_constructible = std::is_trivially_constructible<T>;
1796 template <
typename T>
1802#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1803 template <
typename T>
1804 using is_trivially_copy_constructible = std::is_trivially_copy_constructible<T>;
1806 template <
typename T>
1812#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1813 template <
typename T>
1814 using is_trivially_destructible = std::is_trivially_destructible<T>;
1816 template <
typename T>
1822#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1823 template <
typename T>
1824 using is_trivially_copy_assignable = std::is_trivially_copy_assignable<T>;
1826 template <
typename T>
1832#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
1833 template <
typename T>
1834 using is_trivially_copyable = std::is_trivially_copyable<T>;
1836 template <
typename T>
1840#elif defined(ETL_USE_TYPE_TRAITS_BUILTINS) && !defined(ETL_USER_DEFINED_TYPE_TRAITS)
1848 template<
typename T1,
typename T2>
1849 struct is_assignable
1857 template<
typename T,
typename...
TArgs>
1865 template<
typename T,
typename TArgs =
void>
1873 template<
typename T>
1882 template <
typename T>
1883 struct is_copy_constructible :
public etl::is_constructible<T, typename etl::add_lvalue_reference<const T>::type>
1889 template <
typename T>
1897 template <
typename T,
typename...
TArgs>
1898 struct is_trivially_constructible
1900#if defined(ETL_COMPILER_GCC)
1909 template <
typename T,
typename TArgs =
void>
1910 struct is_trivially_constructible
1912#if defined(ETL_COMPILER_GCC)
1921 template <
typename T>
1922 struct is_trivially_constructible<
T,
void>
1924#if defined(ETL_COMPILER_GCC)
1934 template <
typename T>
1935 struct is_trivially_copy_constructible :
public is_trivially_constructible<T, typename add_lvalue_reference<const T>::type>
1941 template <
typename T>
1942 struct is_trivially_destructible
1944#if defined(ETL_COMPILER_GCC)
1953 template <
typename T>
1954 struct is_trivially_copy_assignable
1956#if defined(ETL_COMPILER_GCC)
1965 template <
typename T>
1966 struct is_trivially_copyable
1968#if defined(ETL_COMPILER_GCC)
1975#elif defined(ETL_USER_DEFINED_TYPE_TRAITS) && !defined(ETL_USE_TYPE_TRAITS_BUILTINS)
1984 template <
typename T1,
1987 struct is_assignable;
1989 template <
typename T1,
typename T2>
1994 template <
typename T1,
typename T2>
1995 struct is_assignable<
T1,
T2, false>;
2000 template <
typename T,
bool B,
typename...
TArgs>
2003 template <
typename T,
typename...
TArgs>
2008 template <
typename T,
typename...
TArgs>
2011 template <
typename T,
typename...
TArgs>
2020 struct is_copy_constructible;
2022 template <
typename T>
2027 template <
typename T>
2028 struct is_copy_constructible<
T, false>;
2033 struct is_move_constructible;
2035 template <
typename T>
2040 template <
typename T>
2041 struct is_move_constructible<
T, false>;
2046 struct is_trivially_constructible;
2048 template <
typename T>
2053 template <
typename T>
2054 struct is_trivially_constructible<
T, false>;
2059 struct is_trivially_copy_constructible;
2061 template <
typename T>
2062 struct is_trivially_copy_constructible<
T, true> :
public etl::true_type
2066 template <
typename T>
2067 struct is_trivially_copy_constructible<
T, false>;
2072 struct is_trivially_destructible;
2074 template <
typename T>
2079 template <
typename T>
2080 struct is_trivially_destructible<
T, false>;
2085 struct is_trivially_copy_assignable;
2087 template <
typename T>
2092 template <
typename T>
2093 struct is_trivially_copy_assignable<
T, false>;
2098 struct is_trivially_copyable;
2100 template <
typename T>
2105 template <
typename T>
2106 struct is_trivially_copyable<
T, false>;
2117 template <
typename T1,
typename T2>
2118 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)>
2127 template <
class,
class T,
class...
Args>
2130 template <
class T,
class...
Args>
2136 template <
class T,
class...
Args>
2141 template <
class T>
struct is_copy_constructible :
public is_constructible<T, typename etl::add_lvalue_reference<typename etl::add_const<T>::type>::type>{};
2142 template <>
struct is_copy_constructible<
void> :
public false_type{};
2149 template <
typename T>
struct is_move_constructible:
public is_constructible<T, typename etl::add_rvalue_reference<T>::type>{};
2150 template <>
struct is_move_constructible<
void> :
public false_type{};
2159 template <
typename T>
2166 template <
typename T>
2174 template <
typename T>
2181 template <
typename T>
2188 template <
typename T>
2195 template <
typename T>
2202 template <
typename T>
2209 template <
typename T1,
typename T2>
2211 typename etl::add_lvalue_reference<typename etl::add_const<T2>::type>::type>
2218 template<
typename T,
typename =
void>
2221 template<
typename T>
2224 template <
typename T>
2232 template <
typename T1,
typename T2>
2235 template <
typename T1,
typename T2>
2238 template<
typename T,
typename...
TArgs>
2241 template<
typename T,
typename...
TArgs>
2244 template<
typename T>
2247 template<
typename T>
2250 template <
typename T>
2253 template <
typename T>
2256 template <
typename T>
2259 template <
typename T>
2262 template <
typename T>
2275 template<
typename...>
2282 template <
typename T>
2289 template <
typename T1,
typename T2>
2292 template <
typename,
typename,
typename =
void>
2297 template <
typename T1,
typename T2>
2303 template <
typename T1,
typename T2,
typename =
void>
2309 template <
typename T1,
typename T2>
2318 template <
typename T1,
typename T2>
2320 :
etl::conditional<etl::is_same<T1, typename etl::decay<T1>::type>::value&& etl::is_same<T2, typename etl::decay<T2>::type>::value,
2321 private_common_type::common_type_2_impl<T1, T2>,
2322 common_type<typename etl::decay<T2>::type,
2323 typename etl::decay<T2>::type>>::type
2336 template <
typename T1,
typename T2,
typename...
TRest>
2338 :
common_type<typename common_type<T1, T2>::type, TRest...>
2343 template<
typename T1,
typename T2,
typename...
TRest>
2345 : private_common_type::common_type_multi_impl<void, T1, T2, TRest...>
2349 template <
typename...
T>
2356 template <
typename T>
2363 unsigned long long>::type>::type>::type>::type type;
2367 template <
typename T>
2374 template <
typename T>
2381 long long>::type>::type>::type>::type type;
2385 template <
typename T>
2392 template <
typename T>
2396 template <
typename T>
2402#if ETL_USING_BUILTIN_UNDERLYING_TYPE
2408 template <
typename T>
2412 ETL_STATIC_ASSERT(etl::is_enum<T>::value,
"etl::underlying_type can only be used with enumeration types.");
2415 template <
typename T>
2416 struct underlying_type<
T, true>
2423 template <
typename T>
2431 template <
typename T>
2438 template <
typename...
TTypes>
2444 has_duplicates<TRest...>> {};
2446 template <
typename T>
2454 template <
typename...
TTypes>
2461 template <
typename T,
typename...
TTypes>
2464 template <
typename T,
typename U,
typename...
URest>
2466 etl::is_same<T, U>::value +
2467 count_of<T, URest...>::value> {};
2469 template <
typename T>
2474 template <
typename T,
typename...
TTypes>
2481 template <
typename T,
template <
typename...>
class Template>
2484 template <
template <
typename...>
class Template,
typename...
TArgs>
2489 template <
typename T,
template <
typename...>
class Template>
2495#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)
2496#define ETL_IS_NOT_CHAR_TYPE(type) (!ETL_IS_CHAR_TYPE(type))
2498#define ETL_IS_POINTER_TYPE(type) (etl::is_pointer<type>::value)
2499#define ETL_IS_NOT_POINTER_TYPE(type) (!ETL_IS_POINTER_TYPE(type))
2501#define ETL_TARGET_IS_TRIVIALLY_COPYABLE(type) (etl::is_trivially_copyable<typename etl::iterator_traits<type>::value_type>::value)
2502#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:875
add_const
Definition type_traits_generator.h:967
add_cv
Definition type_traits_generator.h:1017
add_pointer
Definition type_traits_generator.h:937
add_volatile
Definition type_traits_generator.h:997
add_rvalue_reference
Definition type_traits_generator.h:1366
conditional
Definition type_traits_generator.h:1199
decay
Definition type_traits_generator.h:1281
enable_if
Definition type_traits_generator.h:1230
extent
Definition type_traits_generator.h:1241
integral_constant
Definition type_traits_generator.h:871
is_arithmetic
Definition type_traits_generator.h:1100
is_array
Definition type_traits_generator.h:1130
is_base_of
Definition type_traits_generator.h:1291
is_compound
Definition type_traits_generator.h:1120
is_const
Definition type_traits_generator.h:947
is_floating_point
Definition type_traits_generator.h:1070
is_fundamental
Definition type_traits_generator.h:1110
is_integral
Definition type_traits_generator.h:1040
is_lvalue_reference
Definition type_traits_generator.h:1160
is_rvalue_reference
Definition type_traits_generator.h:1183
is_pointer
Definition type_traits_generator.h:1140
is_reference
Definition type_traits_generator.h:1150
is_same
Definition type_traits_generator.h:1080
is_signed
Definition type_traits_generator.h:1050
is_unsigned
Definition type_traits_generator.h:1060
is_void
Definition type_traits_generator.h:1090
is_volatile
Definition type_traits_generator.h:977
make_signed
Definition type_traits_generator.h:1210
make_unsigned
Definition type_traits_generator.h:1220
negation
Definition type_traits_generator.h:905
rank
Definition type_traits_generator.h:1271
remove_all_extents
Definition type_traits_generator.h:1261
remove_const
Definition type_traits_generator.h:957
remove_cv
Definition type_traits_generator.h:1007
remove_cvref
Definition type_traits_generator.h:1028
remove_extent
Definition type_traits_generator.h:1251
remove_pointer
Definition type_traits_generator.h:927
remove_reference
Definition type_traits_generator.h:917
remove_volatile
Definition type_traits_generator.h:987
bitset_ext
Definition absolute.h:38
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:314
add_lvalue_reference
Definition type_traits_generator.h:1309
Definition type_traits_generator.h:888
exclusive_disjunction
Definition type_traits_generator.h:1458
Definition type_traits_generator.h:2119
is_class
Definition type_traits_generator.h:1300
Definition type_traits_generator.h:2161
Definition type_traits_generator.h:2226
Definition type_traits_generator.h:2212
Definition type_traits_generator.h:2168
Definition type_traits_generator.h:2176
Definition type_traits_generator.h:2197
Definition type_traits_generator.h:2183
Definition type_traits_generator.h:2204
Definition type_traits_generator.h:2190
Get the Nth base of a recursively inherited type. Requires that the class has defined 'base_type'.
Definition type_traits_generator.h:1584
Defines one of five signed types that has the same size as T.
Definition type_traits_generator.h:2376
size_of
Definition type_traits_generator.h:1741
Definition type_traits_generator.h:2393
A set of templates to allow related types to be derived.
Definition type_traits_generator.h:1606
Primary template for etl::underlying_type Users must specialise this template for their enumerations.
Definition type_traits_generator.h:2425
Defines one of five unsigned types that has the same size as T.
Definition type_traits_generator.h:2358
void add_pointer(const volatile void *value, TIString &str, const etl::basic_format_spec< TIString > &format, const bool append)
Helper function for pointers.
Definition to_string_helper.h:443