31#ifndef ETL_TYPE_TRAITS_INCLUDED
32#define ETL_TYPE_TRAITS_INCLUDED
36#include "static_assert.h"
46#if ETL_USING_STL && ETL_USING_CPP11
47 #include <type_traits>
53 template <
typename...>
57#if ETL_NOT_USING_STL || ETL_CPP11_NOT_SUPPORTED
65 template <
typename T, T VALUE>
68 static const T value = VALUE;
73 operator value_type()
const
83 template <
typename T, T VALUE>
84 const T integral_constant<T, VALUE>::value;
87 template <
typename T, T VALUE>
88 inline constexpr T integral_constant_v = etl::integral_constant<T, VALUE>::value;
92 template <
bool BValue>
95 template <
bool BValue>
102 template <
bool BValue>
103 inline constexpr bool bool_constant_v = bool_constant<BValue>::value;
108 template <
typename T>
114 template <
typename T>
115 inline constexpr bool negation_v = negation<T>::value;
120 template <
typename T>
125 template <
typename T>
131 template <
typename T>
139 template <
typename T>
140 using remove_reference_t =
typename remove_reference<T>::type;
145 template <
typename T>
150 template <
typename T>
155 template <
typename T>
158 typedef const T type;
160 template <
typename T>
163 typedef volatile T type;
165 template <
typename T>
168 typedef const volatile T type;
170 template <
typename T>
175 template <
typename T>
178 typedef const T type;
180 template <
typename T>
183 typedef volatile T type;
185 template <
typename T>
188 typedef const volatile T type;
192 template <
typename T>
193 using remove_pointer_t =
typename remove_pointer<T>::type;
198 template <
typename T>
201 typedef typename remove_reference<T>::type* type;
205 template <
typename T>
206 using add_pointer_t =
typename add_pointer<T>::type;
211 template <
typename T>
215 template <
typename T>
219 template <
typename T>
225 template <
typename T>
226 inline constexpr bool is_const_v = is_const<T>::value;
231 template <
typename T>
236 template <
typename T>
243 template <
typename T>
244 using remove_const_t =
typename remove_const<T>::type;
249 template <
typename T>
252 typedef const T type;
254 template <
typename T>
257 typedef const T type;
261 template <
typename T>
262 using add_const_t =
typename add_const<T>::type;
267 template <
typename T>
271 template <
typename T>
275 template <
typename T>
281 template <
typename T>
282 inline constexpr bool is_volatile_v = is_volatile<T>::value;
287 template <
typename T>
292 template <
typename T>
299 template <
typename T>
300 using remove_volatile_t =
typename remove_volatile<T>::type;
305 template <
typename T>
308 typedef volatile T type;
310 template <
typename T>
313 typedef volatile T type;
317 template <
typename T>
318 using add_volatile_t =
typename add_volatile<T>::type;
323 template <
typename T>
330 template <
typename T>
331 using remove_cv_t =
typename remove_cv<T>::type;
336 template <
typename T>
343 template <
typename T>
344 using add_cv_t =
typename add_cv<T>::type;
349 template <
typename T>
356 template <
typename T>
357 using remove_cvref_t =
typename remove_cvref<T>::type;
362 template <
typename T>
418 #if ETL_HAS_NATIVE_CHAR8_T
424 #if ETL_HAS_NATIVE_CHAR16_T
426 struct is_integral<char16_t> : true_type
430 #if ETL_HAS_NATIVE_CHAR32_T
436 template <
typename T>
440 template <
typename T>
444 template <
typename T>
450 template <
typename T>
451 inline constexpr bool is_integral_v = is_integral<T>::value;
456 template <
typename T>
465 struct is_signed<wchar_t> : public etl::bool_constant<wchar_t(-1) < wchar_t(0)>
469 struct is_signed<signed char> : true_type
473 struct is_signed<short> : true_type
477 struct is_signed<int> : true_type
481 struct is_signed<long> : true_type
485 struct is_signed<long long> : true_type
489 struct is_signed<float> : true_type
493 struct is_signed<double> : true_type
497 struct is_signed<long double> : true_type
500 #if ETL_HAS_NATIVE_CHAR8_T
502 struct is_signed<char8_t> : true_type
506 #if ETL_HAS_NATIVE_CHAR16_T
508 struct is_signed<char16_t> : true_type
512 #if ETL_HAS_NATIVE_CHAR32_T
514 struct is_signed<char32_t> : true_type
518 template <typename T>
519 struct is_signed<const T> : is_signed<T>
522 template <typename T>
523 struct is_signed<volatile T> : is_signed<T>
526 template <typename T>
527 struct is_signed<const volatile T> : is_signed<T>
532 template <typename T>
533 inline constexpr bool is_signed_v = is_signed<T>::value;
538 template <typename T>
539 struct is_unsigned : false_type
543 struct is_unsigned<bool> : true_type
547 struct is_unsigned<char> : etl::bool_constant<(char(255) > 0)>
551 struct is_unsigned<unsigned char> : true_type
555 struct is_unsigned<wchar_t> : public etl::bool_constant<(wchar_t(-1) > wchar_t(0))>{};
557 struct is_unsigned<unsigned short> : true_type
561 struct is_unsigned<unsigned int> : true_type
565 struct is_unsigned<unsigned long> : true_type
569 struct is_unsigned<unsigned long long> : true_type
572 template <
typename T>
573 struct is_unsigned<const T> : is_unsigned<T>
576 template <
typename T>
577 struct is_unsigned<volatile T> : is_unsigned<T>
580 template <
typename T>
581 struct is_unsigned<const volatile T> : is_unsigned<T>
586 template <
typename T>
587 inline constexpr bool is_unsigned_v = is_unsigned<T>::value;
592 template <
typename T>
597 struct is_floating_point<float> : true_type
601 struct is_floating_point<double> : true_type
605 struct is_floating_point<long double> : true_type
608 template <
typename T>
609 struct is_floating_point<const T> : is_floating_point<T>
612 template <
typename T>
613 struct is_floating_point<volatile T> : is_floating_point<T>
616 template <
typename T>
617 struct is_floating_point<const volatile T> : is_floating_point<T>
622 template <
typename T>
623 inline constexpr bool is_floating_point_v = is_floating_point<T>::value;
628 template <
typename T1,
typename T2>
632 template <
typename T>
633 struct is_same<T, T> :
public true_type
638 template <
typename T1,
typename T2>
639 inline constexpr bool is_same_v = is_same<T1, T2>::value;
644 template <
typename T>
649 struct is_void<void> : true_type
654 template <
typename T>
655 inline constexpr bool is_void_v = is_void<T>::value;
660 template <
typename T>
661 struct is_arithmetic : etl::bool_constant<is_integral<T>::value || is_floating_point<T>::value>
666 template <
typename T>
667 inline constexpr bool is_arithmetic_v = is_arithmetic<T>::value;
672 template <
typename T>
673 struct is_fundamental : etl::bool_constant<is_arithmetic<T>::value || is_void<T>::value>
678 template <
typename T>
679 inline constexpr bool is_fundamental_v = is_fundamental<T>::value;
684 template <
typename T>
685 struct is_compound : etl::bool_constant<!is_fundamental<T>::value>
690 template <
typename T>
691 inline constexpr bool is_compound_v = is_compound<T>::value;
696 template <
typename T>
700 template <
typename T>
701 struct is_array<T[]> : true_type
704 template <
typename T,
size_t Size>
705 struct is_array<T[Size]> : true_type
710 template <
typename T>
711 inline constexpr bool is_array_v = is_array<T>::value;
716 template <
typename T>
720 template <
typename T>
721 struct is_pointer_helper<T*> : true_type
724 template <
typename T>
725 struct is_pointer_helper<const T*> : is_pointer_helper<T*>
728 template <
typename T>
729 struct is_pointer_helper<volatile T*> : is_pointer_helper<T*>
732 template <
typename T>
733 struct is_pointer_helper<const volatile T*> : is_pointer_helper<T*>
736 template <
typename T>
737 struct is_pointer : is_pointer_helper<typename remove_cv<T>::type>
742 template <
typename T>
743 inline constexpr bool is_pointer_v = is_pointer<T>::value;
748 template <
typename T>
749 struct is_lvalue_reference_helper :
false_type
752 template <
typename T>
753 struct is_lvalue_reference_helper<T&> : true_type
756 template <
typename T>
757 struct is_lvalue_reference : is_lvalue_reference_helper<typename remove_cv<T>::type>
762 template <
typename T>
763 inline constexpr bool is_lvalue_reference_v = etl::is_lvalue_reference<T>::value;
769 template <
typename T>
770 struct is_rvalue_reference_helper :
false_type
773 template <
typename T>
774 struct is_rvalue_reference_helper<T&&> : true_type
777 template <
typename T>
778 struct is_rvalue_reference : is_rvalue_reference_helper<typename remove_cv<T>::type>
783 template <
typename T>
784 inline constexpr bool is_rvalue_reference_v = etl::is_rvalue_reference<T>::value;
791 template <
typename T>
795 || is_rvalue_reference<T>::value
802 template <
typename T>
803 inline constexpr bool is_reference_v = is_reference<T>::value;
809 template <
typename T>
810 struct is_pod : etl::bool_constant<etl::is_fundamental<T>::value || etl::is_pointer<T>::value>
815 template <
typename T>
816 inline constexpr bool is_pod_v = etl::is_pod<T>::value;
821 template <
bool BValue,
typename T,
typename F>
826 template <
typename T,
typename F>
827 struct conditional<false, T, F>
833 template <
bool BValue,
typename T,
typename F>
834 using conditional_t =
typename conditional<BValue, T, F>::type;
839 template <
typename T>
845 struct make_signed<char>
847 typedef signed char type;
850 struct make_signed<unsigned char>
852 typedef signed char type;
856 struct make_signed<wchar_t>
858 typedef etl::conditional<
sizeof(wchar_t) ==
sizeof(int16_t), int16_t,
859 etl::conditional<
sizeof(wchar_t) ==
sizeof(int32_t), int32_t,
void>::type>::type type;
863 struct make_signed<unsigned short>
868 struct make_signed<unsigned int>
873 struct make_signed<unsigned long>
878 struct make_signed<unsigned long long>
880 typedef long long type;
882 template <
typename T>
883 struct make_signed<const T> :
add_const<typename make_signed<T>::type>
886 template <
typename T>
887 struct make_signed<volatile T> :
add_volatile<typename make_signed<T>::type>
890 template <
typename T>
891 struct make_signed<const volatile T> :
add_const<typename add_volatile<typename make_signed<T>::type>::type>
896 template <
typename T>
897 using make_signed_t =
typename make_signed<T>::type;
902 template <
typename T>
908 struct make_unsigned<char>
910 typedef unsigned char type;
913 struct make_unsigned<signed char>
915 typedef unsigned char type;
918 struct make_unsigned<short>
920 typedef unsigned short type;
924 struct make_unsigned<wchar_t>
926 typedef etl::conditional<
sizeof(wchar_t) ==
sizeof(uint16_t), uint16_t,
927 etl::conditional<
sizeof(wchar_t) ==
sizeof(uint32_t), uint32_t,
void>::type>::type type;
931 struct make_unsigned<int>
933 typedef unsigned int type;
936 struct make_unsigned<long>
938 typedef unsigned long type;
941 struct make_unsigned<long long>
943 typedef unsigned long long type;
945 template <
typename T>
946 struct make_unsigned<const T> :
add_const<typename make_unsigned<T>::type>
949 template <
typename T>
950 struct make_unsigned<volatile T> :
add_volatile<typename make_unsigned<T>::type>
953 template <
typename T>
954 struct make_unsigned<const volatile T> :
add_const<typename add_volatile<typename make_unsigned<T>::type>::type>
959 template <
typename T>
960 using make_unsigned_t =
typename make_unsigned<T>::type;
965 template <
bool BValue,
typename T =
void>
969 template <
typename T>
970 struct enable_if<true, T>
976 template <
bool BValue,
typename T =
void>
977 using enable_if_t =
typename enable_if<BValue, T>::type;
982 template <
typename T,
unsigned Size = 0U>
987 template <
typename T>
992 template <
typename T,
unsigned Size>
997 template <
typename T,
unsigned Size>
1002 template <
typename T,
unsigned I,
unsigned Size>
1003 struct extent<T[I], Size> :
integral_constant<size_t, extent<T, Size - 1>::value>
1008 template <
typename T,
unsigned Size = 0U>
1009 inline constexpr size_t extent_v = extent<T, Size>::value;
1014 template <
typename T>
1015 struct remove_extent
1019 template <
typename T>
1020 struct remove_extent<T[]>
1024 template <
typename T,
size_t Size>
1025 struct remove_extent<T[Size]>
1031 template <
typename T>
1032 using remove_extent_t =
typename remove_extent<T>::type;
1037 template <
typename T>
1038 struct remove_all_extents
1042 template <
typename T>
1043 struct remove_all_extents<T[]>
1045 typedef typename remove_all_extents<T>::type type;
1047 template <
typename T,
size_t Size>
1048 struct remove_all_extents<T[Size]>
1050 typedef typename remove_all_extents<T>::type type;
1054 template <
typename T>
1055 using remove_all_extents_t =
typename remove_all_extents<T>::type;
1060 template <
typename T>
1064 template <
typename T>
1068 template <
typename T,
size_t Size>
1074 template <
typename T>
1075 inline constexpr size_t rank_v = rank<T>::value;
1080 template <
typename T>
1083 typedef typename etl::remove_reference<T>::type U;
1084 typedef typename etl::conditional<etl::is_array<U>::value,
typename etl::remove_extent<U>::type*,
typename etl::remove_cv<U>::type>::type type;
1088 template <
typename T>
1089 using decay_t =
typename decay<T>::type;
1094 namespace private_type_traits
1096 template <
typename T>
1097 char test(
int T::*);
1103 template <
typename T>
1107 template <
typename T>
1108 struct is_class : etl::bool_constant<sizeof(private_type_traits::test<T>(0)) == 1U>
1113 template <
typename T>
1114 inline constexpr bool is_class_v = is_class<T>::value;
1120 namespace private_type_traits
1122 template <
typename B>
1123 etl::true_type test_ptr_conv(
const volatile B*);
1127 template <
typename B,
typename D>
1128 auto test_is_base_of(
int) ->
decltype(test_ptr_conv<B>(
static_cast<D*
>(
nullptr)));
1129 template <
typename,
typename>
1130 auto test_is_base_of(...) -> etl::true_type;
1133 template <
typename TBase,
typename TDerived>
1135 : etl::integral_constant< bool, etl::is_class<TBase>::value
1136 && etl::is_class<TDerived>::value&& decltype(private_type_traits::test_is_base_of< TBase, TDerived>(0))::value >
1140 template <
typename TBase,
typename TDerived,
1141 const bool IsFundamental = (etl::is_fundamental<TBase>::value || etl::is_fundamental<TDerived>::value || etl::is_array<TDerived>::value)>
1146 static TBase* check(TBase*)
1150 static char check(...)
1157 static const bool value = (
sizeof(check((TDerived*)0)) ==
sizeof(TBase*));
1161 template <
typename TBase,
typename TDerived>
1162 struct is_base_of<TBase, TDerived, true>
1164 static const bool value =
false;
1169 template <
typename T1,
typename T2>
1170 inline constexpr bool is_base_of_v = is_base_of<T1, T2>::value;
1175 template <
typename T>
1176 struct add_lvalue_reference
1180 template <
typename T>
1181 struct add_lvalue_reference<T&>
1186 struct add_lvalue_reference<void>
1191 struct add_lvalue_reference<const void>
1193 typedef const void type;
1196 struct add_lvalue_reference<volatile void>
1198 typedef volatile void type;
1201 struct add_lvalue_reference<const volatile void>
1203 typedef const volatile void type;
1207 template <
typename T>
1208 using add_lvalue_reference_t =
typename etl::add_lvalue_reference<T>::type;
1214 template <
typename T>
1215 struct add_rvalue_reference
1219 template <
typename T>
1220 struct add_rvalue_reference<T&>
1225 struct add_rvalue_reference<void>
1230 struct add_rvalue_reference<const void>
1232 using type =
const void;
1235 struct add_rvalue_reference<volatile void>
1237 using type =
volatile void;
1240 struct add_rvalue_reference<const volatile void>
1242 using type =
const volatile void;
1247 template <
typename T>
1248 using add_rvalue_reference_t =
typename etl::add_rvalue_reference<T>::type;
1254 template <
typename T>
1255 typename etl::add_rvalue_reference<T>::type declval() ETL_NOEXCEPT;
1265 namespace private_type_traits
1268 template <
typename T,
typename =
int>
1276 template <
typename T>
1277 struct is_convertible_to_int<T, decltype(static_cast<int>(declval<T>()))> : true_type
1282 template <
typename T>
1285 && !is_reference<T>::value>
1290 template <
typename T>
1291 inline constexpr bool is_enum_v = etl::is_enum<T>::value;
1294 namespace private_type_traits
1297 template <
typename T>
1298 struct is_convertible_to_int
1300 static char test(
int);
1301 static double test(...);
1303 static const bool value =
sizeof(test(
static_cast<T
>(0))) ==
sizeof(
char);
1308 template <
typename T>
1311 static const bool value =
1312 private_type_traits::is_convertible_to_int<T>::value && !is_class<T>::value && !is_arithmetic<T>::value && !is_reference<T>::value;
1320 namespace private_type_traits
1323 using true_type_for = etl::true_type;
1325 template <
typename T>
1326 auto returnable(
int) -> true_type_for<T()>;
1331 template <
typename TFrom,
typename TTo>
1332 auto nonvoid_convertible(
int) -> true_type_for< decltype(etl::declval<void (&)(TTo)>()(etl::declval<TFrom>())) >;
1333 template <
typename,
typename>
1337 #if defined(ETL_COMPILER_ARM5)
1338 template <
typename TFrom,
typename TTo>
1339 struct is_convertible : etl::bool_constant<__is_convertible_to(TFrom, TTo)>
1343 template <
typename TFrom,
typename TTo>
1344 struct is_convertible
1345 : etl::bool_constant< (decltype(private_type_traits::returnable<TTo>(0))::value
1346 && decltype(private_type_traits::nonvoid_convertible<TFrom, TTo>(0))::value)
1347 || (etl::is_void<TFrom>::value && etl::is_void<TTo>::value)>
1353 template <
typename TFrom,
typename TTo>
1354 struct is_nothrow_convertible
1359 static void sink(TTo)
noexcept;
1362 template <
typename F>
1363 static auto test(
int) -> etl::bool_constant<noexcept(sink(etl::declval<F>()))>;
1371 static ETL_CONSTANT
bool value =
decltype(test<TFrom>(0))::value;
1374 namespace private_type_traits
1382 template <
typename TFrom,
typename TTo>
1383 struct is_convertible_impl
1385 static yes test(TTo);
1386 static no test(...);
1387 static TFrom make();
1388 static const bool value = (
sizeof(test(make())) ==
sizeof(yes));
1391 template <
typename TTo>
1392 struct is_convertible_impl<void, TTo>
1394 static const bool value =
false;
1397 template <
typename TFrom>
1398 struct is_convertible_impl<TFrom, void>
1400 static const bool value =
false;
1404 struct is_convertible_impl<void, void>
1406 static const bool value =
true;
1410 template <
typename TFrom,
typename TTo>
1411 struct is_convertible : etl::bool_constant< private_type_traits::is_convertible_impl<TFrom, TTo>::value>
1417 template <
typename TFrom,
typename TTo >
1418 inline constexpr bool is_convertible_v = etl::is_convertible<TFrom, TTo>::value;
1420 template <
typename TFrom,
typename TTo >
1421 inline constexpr bool is_nothrow_convertible_v = etl::is_nothrow_convertible<TFrom, TTo>::value;
1427 #if ETL_USING_CPP11 && !defined(ETL_COMPILER_ARM5)
1428 template <
typename T>
1432 #elif defined(ETL_COMPILER_MICROSOFT)
1433 template <
typename T>
1437 #elif defined(ETL_COMPILER_IAR) || defined(ETL_COMPILER_TI)
1438 template <
typename T>
1443 template <
typename T>
1461 template <
typename T>
1462 inline constexpr size_t alignment_of_v = etl::alignment_of<T>::value;
1474 template <
typename T, T VALUE>
1485 template <
typename T, T VALUE>
1486 inline constexpr T integral_constant_v = std::integral_constant<T, VALUE>::value;
1490 template <
bool BValue>
1493 template <
bool BValue>
1500 template <
bool BValue>
1501 inline constexpr bool bool_constant_v = bool_constant<BValue>::value;
1508 template <
typename T>
1511 template <
typename T>
1512 struct negation : etl::bool_constant<!bool(T::value)>
1518 template <
typename T>
1519 inline constexpr bool negation_v = std::negation_v<T>;
1525 template <
typename T>
1531 template <
typename T>
1532 using remove_reference_t =
typename std::remove_reference<T>::type;
1538 template <
typename T>
1544 template <
typename T>
1545 using remove_pointer_t =
typename std::remove_pointer<T>::type;
1551 template <
typename T>
1557 template <
typename T>
1558 using add_pointer_t =
typename std::add_pointer<T>::type;
1564 template <
typename T>
1570 template <
typename T>
1571 inline constexpr bool is_const_v = std::is_const_v<T>;
1577 template <
typename T>
1583 template <
typename T>
1584 using remove_const_t =
typename std::remove_const<T>::type;
1590 template <
typename T>
1596 template <
typename T>
1597 using add_const_t =
typename std::add_const<T>::type;
1603 template <
typename T>
1609 template <
typename T>
1610 inline constexpr bool is_volatile_v = std::is_volatile_v<T>;
1616 template <
typename T>
1622 template <
typename T>
1623 using remove_volatile_t =
typename std::remove_volatile<T>::type;
1629 template <
typename T>
1635 template <
typename T>
1636 using add_volatile_t =
typename std::add_volatile<T>::type;
1642 template <
typename T>
1648 template <
typename T>
1649 using remove_cv_t =
typename std::remove_cv<T>::type;
1655 template <
typename T>
1656 struct add_cv : std::add_cv<T>
1661 template <
typename T>
1662 using add_cv_t =
typename std::add_cv<T>::type;
1668 template <
typename T>
1671 typedef typename std::remove_cv<typename std::remove_reference<T>::type>::type type;
1675 template <
typename T>
1676 using remove_cvref_t =
typename etl::remove_cvref<T>::type;
1682 template <
typename T>
1688 template <
typename T>
1689 inline constexpr bool is_integral_v = std::is_integral_v<T>;
1695 template <
typename T>
1701 template <
typename T>
1702 inline constexpr bool is_signed_v = std::is_signed_v<T>;
1708 template <
typename T>
1709 struct is_unsigned : std::is_unsigned<T>
1714 template <
typename T>
1715 inline constexpr bool is_unsigned_v = std::is_unsigned_v<T>;
1721 template <
typename T>
1722 struct is_floating_point : std::is_floating_point<T>
1727 template <
typename T>
1728 inline constexpr bool is_floating_point_v = std::is_floating_point_v<T>;
1734 template <
typename T1,
typename T2>
1735 struct is_same : std::is_same<T1, T2>
1740 template <
typename T1,
typename T2>
1741 inline constexpr bool is_same_v = std::is_same_v<T1, T2>;
1747 template <
typename T>
1748 struct is_void : std::is_void<T>
1753 template <
typename T>
1754 inline constexpr bool is_void_v = std::is_void_v<T>;
1760 template <
typename T>
1761 struct is_arithmetic : std::is_arithmetic<T>
1766 template <
typename T>
1767 inline constexpr bool is_arithmetic_v = std::is_arithmetic_v<T>;
1773 template <
typename T>
1774 struct is_fundamental : std::is_fundamental<T>
1779 template <
typename T>
1780 inline constexpr bool is_fundamental_v = std::is_fundamental_v<T>;
1786 template <
typename T>
1787 struct is_compound : std::is_compound<T>
1792 template <
typename T>
1793 inline constexpr bool is_compound_v = std::is_compound_v<T>;
1799 template <
typename T>
1800 struct is_array : std::is_array<T>
1805 template <
typename T>
1806 inline constexpr bool is_array_v = std::is_array_v<T>;
1812 template <
typename T>
1813 struct is_pointer : std::is_pointer<T>
1818 template <
typename T>
1819 inline constexpr bool is_pointer_v = std::is_pointer_v<T>;
1825 template <
typename T>
1826 struct is_reference : std::is_reference<T>
1831 template <
typename T>
1832 inline constexpr bool is_reference_v = std::is_reference_v<T>;
1838 template <
typename T>
1839 struct is_lvalue_reference : std::is_lvalue_reference<T>
1844 template <
typename T>
1845 inline constexpr bool is_lvalue_reference_v = std::is_lvalue_reference_v<T>;
1852 template <
typename T>
1853 struct is_rvalue_reference : std::is_rvalue_reference<T>
1858 template <
typename T>
1859 inline constexpr bool is_rvalue_reference_v = std::is_rvalue_reference_v<T>;
1866 template <
typename T>
1868 : std::integral_constant< bool, std::is_standard_layout<T>::value && std::is_trivially_default_constructible<T>::value
1869 && std::is_trivially_copyable<T>::value>
1874 template <
typename T>
1875 inline constexpr bool is_pod_v = std::is_standard_layout_v<T> && std::is_trivially_default_constructible_v<T> && std::is_trivially_copyable_v<T>;
1878 #if defined(ETL_COMPILER_GCC)
1879 #if ETL_COMPILER_VERSION >= 5
1880 #define ETL_GCC_V5_TYPE_TRAITS_SUPPORTED
1887 template <
bool BValue,
typename T,
typename F>
1892 template <
typename T,
typename F>
1893 struct conditional<false, T, F>
1899 template <
bool BValue,
typename T,
typename F>
1900 using conditional_t =
typename conditional<BValue, T, F>::type;
1906 template <
typename T>
1907 struct make_signed : std::make_signed<T>
1912 template <
typename T>
1913 using make_signed_t =
typename std::make_signed<T>::type;
1919 template <
typename T>
1920 struct make_unsigned : std::make_unsigned<T>
1925 template <
typename T>
1926 using make_unsigned_t =
typename std::make_unsigned<T>::type;
1932 template <
bool BValue,
typename T =
void>
1933 struct enable_if : std::enable_if<BValue, T>
1938 template <
bool BValue,
typename T =
void>
1939 using enable_if_t =
typename std::enable_if<BValue, T>::type;
1945 template <
typename T,
unsigned Size = 0U>
1946 struct extent : std::extent<T, Size>
1951 template <
typename T,
unsigned Size = 0U>
1952 inline constexpr size_t extent_v = std::extent_v<T, Size>;
1958 template <
typename T>
1959 struct remove_extent : std::remove_extent<T>
1964 template <
typename T>
1965 using remove_extent_t =
typename std::remove_extent<T>::type;
1971 template <
typename T>
1972 struct remove_all_extents : std::remove_all_extents<T>
1977 template <
typename T>
1978 using remove_all_extents_t =
typename std::remove_all_extents<T>::type;
1984 template <
typename T>
1985 struct rank : std::rank<T>
1990 template <
typename T>
1991 inline constexpr size_t rank_v = std::rank_v<T>;
1997 template <
typename T>
1998 struct decay : std::decay<T>
2003 template <
typename T>
2004 using decay_t =
typename std::decay<T>::type;
2010 template <
typename TBase,
typename TDerived>
2011 struct is_base_of : std::is_base_of<TBase, TDerived>
2016 template <
typename TBase,
typename TDerived>
2017 inline constexpr bool is_base_of_v = std::is_base_of_v<TBase, TDerived>;
2022 template <
typename T>
2023 struct is_class : std::is_class<T>
2028 template <
typename T>
2029 inline constexpr bool is_class_v = is_class<T>::value;
2034 template <
typename T>
2035 struct add_lvalue_reference : std::add_lvalue_reference<T>
2040 template <
typename T>
2041 using add_lvalue_reference_t =
typename std::add_lvalue_reference<T>::type;
2047 template <
typename T>
2048 struct add_rvalue_reference : std::add_rvalue_reference<T>
2054 template <
typename T>
2055 using add_rvalue_reference_t =
typename std::add_rvalue_reference<T>::type;
2061 template <
typename T>
2062 typename std::add_rvalue_reference<T>::type declval() ETL_NOEXCEPT;
2069 template <
typename T>
2070 struct is_enum : std::is_enum<T>
2075 template <
typename T>
2076 inline constexpr bool is_enum_v = etl::is_enum<T>::value;
2085 template <
typename TFrom,
typename TTo>
2086 struct is_convertible : std::is_convertible<TFrom, TTo>
2091 template <
typename TFrom,
typename TTo>
2092 struct is_nothrow_convertible
2097 static void sink(TTo)
noexcept;
2100 template <
typename F>
2101 static auto test(
int) -> etl::bool_constant<noexcept(sink(etl::declval<F>()))>;
2109 static ETL_CONSTANT
bool value =
decltype(test<TFrom>(0))::value;
2112 namespace private_type_traits
2120 template <
typename TFrom,
typename TTo>
2121 struct is_convertible_impl
2123 static yes test(TTo);
2124 static no test(...);
2125 static TFrom make();
2126 static const bool value = (
sizeof(test(make())) ==
sizeof(yes));
2129 template <
typename TTo>
2130 struct is_convertible_impl<void, TTo>
2132 static const bool value =
false;
2135 template <
typename TFrom>
2136 struct is_convertible_impl<TFrom, void>
2138 static const bool value =
false;
2142 struct is_convertible_impl<void, void>
2144 static const bool value =
true;
2148 template <
typename TFrom,
typename TTo>
2149 struct is_convertible : etl::bool_constant< private_type_traits::is_convertible_impl<TFrom, TTo>::value>
2155 template <
typename TFrom,
typename TTo>
2156 inline constexpr bool is_convertible_v = std::is_convertible_v<TFrom, TTo>;
2158 template <
typename TFrom,
typename TTo >
2159 inline constexpr bool is_nothrow_convertible_v = is_nothrow_convertible<TFrom, TTo>::value;
2165 template <
typename T>
2166 struct alignment_of : std::alignment_of<T>
2170 struct alignment_of<void> : std::integral_constant<size_t, 0>
2174 struct alignment_of<const void> : std::integral_constant<size_t, 0>
2179 template <
typename T>
2180 inline constexpr size_t alignment_of_v = std::alignment_of_v<T>;
2193 template <
typename...>
2194 struct conjunction :
public etl::true_type
2198 template <
typename T1,
typename... Tn>
2199 struct conjunction<T1, Tn...> :
public etl::conditional_t<bool(T1::value), etl::conjunction<Tn...>, T1>
2203 template <
typename T>
2204 struct conjunction<T> :
public T
2210 template <
typename... T>
2211 inline constexpr bool conjunction_v = conjunction<T...>::value;
2217 template <
typename...>
2222 template <
typename T1,
typename... Tn>
2223 struct disjunction<T1, Tn...> :
public etl::conditional_t<bool(T1::value), T1, disjunction<Tn...>>
2227 template <
typename T1>
2228 struct disjunction<T1> :
public T1
2234 template <
typename... T>
2235 inline constexpr bool disjunction_v = etl::disjunction<T...>::value;
2243 template <
typename... TTypes>
2244 struct exclusive_disjunction;
2246 template <
typename T>
2247 struct exclusive_disjunction<T> :
public etl::bool_constant<T::value>
2252 template <
typename T1,
typename T2,
typename... TRest>
2253 struct exclusive_disjunction<T1, T2, TRest...>
2254 :
public etl::exclusive_disjunction< etl::integral_constant<bool, etl::disjunction<T1, T2>::value && !etl::conjunction<T1, T2>::value>, TRest...>
2260 template <
typename... T>
2261 inline constexpr bool exclusive_disjunction_v = etl::exclusive_disjunction<T...>::value;
2267 template <
bool BValue,
typename T, T TRUE_VALUE, T FALSE_VALUE>
2268 struct conditional_integral_constant;
2270 template <
typename T, T TRUE_VALUE, T FALSE_VALUE>
2271 struct conditional_integral_constant<true, T, TRUE_VALUE, FALSE_VALUE>
2273 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2274 static const T value = TRUE_VALUE;
2277 template <
typename T, T TRUE_VALUE, T FALSE_VALUE>
2278 struct conditional_integral_constant<false, T, TRUE_VALUE, FALSE_VALUE>
2280 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2281 static const T value = FALSE_VALUE;
2289 template <
typename T,
typename... TRest>
2290 struct is_one_of : etl::disjunction<etl::is_same<T, TRest>...>
2294 #include "private/type_traits_cpp03.h"
2298 template <
typename T,
typename... TRest>
2299 inline constexpr bool is_one_of_v = etl::is_one_of<T, TRest...>::value;
2303 namespace private_type_traits
2307 template <
typename T,
typename... TTypes>
2311 template <
typename T>
2312 struct count_type<T> : etl::integral_constant<size_t, 0>
2318 template <
typename T,
typename THead,
typename... TTail>
2319 struct count_type<T, THead, TTail...> : etl::integral_constant<size_t, (etl::is_same<T, THead>::value ? 1 : 0) + count_type<T, TTail...>::value>
2324 template <
typename T,
typename... TTypes>
2325 struct has_duplicates_of : etl::integral_constant< bool, (private_type_traits::count_type<T, TTypes...>::value > 1)>
2331 template <
typename T,
typename... TRest>
2332 inline constexpr bool has_duplicates_of_v = etl::has_duplicates_of<T, TRest...>::value;
2340 template <
typename TBase,
typename... TDerived>
2341 struct is_base_of_all : etl::conjunction<etl::is_base_of<TBase, TDerived>...>
2347 template <
typename T,
typename... TRest>
2348 inline constexpr bool is_base_of_all_v = etl::is_base_of_all<T, TRest...>::value;
2355 template <
typename TBase,
typename... TDerived>
2356 struct is_base_of_any : etl::disjunction<etl::is_base_of<TBase, TDerived>...>
2363 template <
typename T,
typename... TRest>
2364 inline constexpr bool is_base_of_any_v = etl::is_base_of_any<T, TRest...>::value;
2372 template <
size_t Index,
typename TType>
2375 typedef typename nth_base<Index - 1U,
typename TType::base_type>::type type;
2378 template <
typename TType>
2379 struct nth_base<0, TType>
2385 template <
size_t Index,
typename TType>
2386 using nth_base_t =
typename nth_base<Index, TType>::type;
2394 template <
typename T>
2399 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
2403 typedef type_t type;
2404 typedef type_t& reference;
2405 typedef const type_t& const_reference;
2406 typedef type_t* pointer;
2407 typedef const type_t* const_pointer;
2408 typedef const type_t*
const const_pointer_const;
2411 typedef type_t&& rvalue_reference;
2416 template <
typename T>
2421 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
2425 typedef type_t
type;
2427 typedef const type_t& const_reference;
2429 typedef const type_t* const_pointer;
2430 typedef const type_t*
const const_pointer_const;
2433 typedef type_t&& rvalue_reference;
2438 template <
typename T>
2439 struct types<T*
const>
2443 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
2447 typedef type_t
type;
2449 typedef const type_t& const_reference;
2451 typedef const type_t* const_pointer;
2452 typedef const type_t*
const const_pointer_const;
2455 typedef type_t&& rvalue_reference;
2460 template <
typename T>
2465 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
2469 typedef type_t
type;
2471 typedef const type_t& const_reference;
2473 typedef const type_t* const_pointer;
2474 typedef const type_t*
const const_pointer_const;
2477 typedef type_t&& rvalue_reference;
2483 template <
typename T>
2488 typedef typename etl::remove_reference<typename etl::remove_cv<T>::type>::type type_t;
2492 typedef type_t
type;
2494 typedef const type_t& const_reference;
2496 typedef const type_t* const_pointer;
2497 typedef const type_t*
const const_pointer_const;
2500 typedef type_t&& rvalue_reference;
2506 template <
typename T>
2507 using types_t =
typename types<T>::type;
2509 template <
typename T>
2510 using types_r =
typename types<T>::reference;
2512 template <
typename T>
2513 using types_cr =
typename types<T>::const_reference;
2515 template <
typename T>
2516 using types_rr =
typename types<T>::rvalue_reference;
2518 template <
typename T>
2519 using types_p =
typename types<T>::pointer;
2521 template <
typename T>
2522 using types_cp =
typename types<T>::const_pointer;
2524 template <
typename T>
2525 using types_cpc =
typename types<T>::const_pointer_const;
2531 template <
typename T>
2532 struct size_of : etl::integral_constant<size_t, sizeof(T)>
2536 struct size_of<void> : etl::integral_constant<size_t, 1U>
2541 template <
typename T>
2542 inline constexpr size_t size_of_v = etl::size_of<T>::value;
2548 template <
typename T,
typename... TRest>
2549 struct are_all_same : etl::conjunction<etl::is_same<T, TRest>...>
2555 template <
typename T,
typename... TRest>
2556 inline constexpr bool are_all_same_v = are_all_same<T, TRest...>::value;
2560#if ETL_USING_STL && ETL_USING_CPP11 && !defined(ETL_USE_TYPE_TRAITS_BUILTINS) && !defined(ETL_USER_DEFINED_TYPE_TRAITS) \
2561 && ((!defined(ARDUINO) && ETL_NOT_USING_STLPORT) || defined(ETL_GCC_V5_TYPE_TRAITS_SUPPORTED))
2569 template <
typename T1,
typename T2>
2570 using is_assignable = std::is_assignable<T1, T2>;
2574 template <
typename T,
typename... TArgs>
2575 using is_constructible = std::is_constructible<T, TArgs...>;
2579 template <
typename T>
2580 using is_copy_constructible = std::is_copy_constructible<T>;
2584 template <
typename T>
2585 using is_move_constructible = std::is_move_constructible<T>;
2589 template <
typename T>
2590 using is_copy_assignable = std::is_copy_assignable<T>;
2594 template <
typename T>
2595 using is_move_assignable = std::is_move_assignable<T>;
2599 #if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2600 template <
typename T>
2601 using is_trivially_constructible = std::is_trivially_constructible<T>;
2603 template <
typename T>
2604 using is_trivially_constructible = etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>;
2609 #if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2610 template <
typename T>
2611 using is_trivially_copy_constructible = std::is_trivially_copy_constructible<T>;
2613 template <
typename T>
2614 using is_trivially_copy_constructible = etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>;
2619 #if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2620 template <
typename T>
2621 using is_trivially_destructible = std::is_trivially_destructible<T>;
2623 template <
typename T>
2624 using is_trivially_destructible = etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>;
2629 #if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2630 template <
typename T>
2631 using is_trivially_copy_assignable = std::is_trivially_copy_assignable<T>;
2633 template <
typename T>
2634 using is_trivially_copy_assignable = etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>;
2639 #if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED
2640 template <
typename T>
2641 using is_trivially_copyable = std::is_trivially_copyable<T>;
2642 #elif ETL_USING_BUILTIN_IS_TRIVIALLY_COPYABLE
2643 template <
typename T>
2644 using is_trivially_copyable = etl::bool_constant<__is_trivially_copyable(T)>;
2646 template <
typename T>
2647 using is_trivially_copyable = etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>;
2650#elif defined(ETL_USE_TYPE_TRAITS_BUILTINS) && !defined(ETL_USER_DEFINED_TYPE_TRAITS)
2658 template <
typename T1,
typename T2>
2659 struct is_assignable
2661 static ETL_CONSTANT
bool value = __is_assignable(T1, T2);
2667 template <
typename T,
typename... TArgs>
2668 struct is_constructible
2670 static ETL_CONSTANT
bool value = __is_constructible(T, TArgs...);
2675 template <
typename T,
typename TArgs =
void>
2676 struct is_constructible
2678 static ETL_CONSTANT
bool value = __is_constructible(T, TArgs);
2683 template <
typename T>
2684 struct is_constructible<T, void>
2686 static ETL_CONSTANT
bool value = __is_constructible(T);
2692 template <
typename T>
2693 struct is_copy_constructible :
public etl::is_constructible< T, typename etl::add_lvalue_reference<const T>::type>
2699 template <
typename T>
2700 struct is_move_constructible :
public etl::is_constructible<T, T>
2706 template <
typename T>
2707 struct is_copy_assignable
2708 :
public etl::is_assignable< typename etl::add_lvalue_reference<T>::type, typename etl::add_lvalue_reference<const T>::type>
2715 template <
typename T>
2716 struct is_move_assignable :
public etl::is_assignable<typename etl::add_lvalue_reference<T>::type, typename etl::add_rvalue_reference<T>::type>
2720 template <
typename T>
2721 struct is_move_assignable :
public etl::is_assignable<typename etl::add_lvalue_reference<T>::type, T>
2729 template <
typename T,
typename... TArgs>
2730 struct is_trivially_constructible
2732 #if defined(ETL_COMPILER_GCC)
2733 static ETL_CONSTANT
bool value = __has_trivial_constructor(T);
2735 static ETL_CONSTANT
bool value = __is_trivially_constructible(T, TArgs...);
2741 template <
typename T,
typename TArgs =
void>
2742 struct is_trivially_constructible
2744 #if defined(ETL_COMPILER_GCC)
2745 static ETL_CONSTANT
bool value = __has_trivial_constructor(T);
2747 static ETL_CONSTANT
bool value = __is_trivially_constructible(T, TArgs);
2753 template <
typename T>
2754 struct is_trivially_constructible<T, void>
2756 #if defined(ETL_COMPILER_GCC)
2757 static ETL_CONSTANT
bool value = __has_trivial_constructor(T);
2759 static ETL_CONSTANT
bool value = __is_trivially_constructible(T);
2766 template <
typename T>
2767 struct is_trivially_copy_constructible :
public is_trivially_constructible< T, typename add_lvalue_reference<const T>::type>
2773 template <
typename T>
2774 struct is_trivially_destructible
2776 #if defined(ETL_COMPILER_GCC)
2777 static ETL_CONSTANT
bool value = __has_trivial_destructor(T);
2779 static ETL_CONSTANT
bool value = __is_trivially_destructible(T);
2785 template <
typename T>
2786 struct is_trivially_copy_assignable
2788 #if defined(ETL_COMPILER_GCC)
2789 static ETL_CONSTANT
bool value = __has_trivial_copy(T);
2791 static ETL_CONSTANT
bool value = __is_trivially_copyable(T);
2797 template <
typename T>
2798 struct is_trivially_copyable
2800 static ETL_CONSTANT
bool value = __is_trivially_copyable(T);
2803#elif defined(ETL_USER_DEFINED_TYPE_TRAITS) && !defined(ETL_USE_TYPE_TRAITS_BUILTINS)
2812 template <
typename T1,
typename T2,
2814 (etl::is_arithmetic<T1>::value || etl::is_pointer<T1>::value) && (etl::is_arithmetic<T2>::value || etl::is_pointer<T2>::value)>
2815 struct is_assignable;
2817 template <
typename T1,
typename T2>
2818 struct is_assignable<T1, T2, true> :
public etl::true_type
2822 template <
typename T1,
typename T2>
2823 struct is_assignable<T1, T2, false>;
2828 template <
typename T,
bool BValue,
typename... TArgs>
2829 struct is_constructible_helper;
2831 template <
typename T,
typename... TArgs>
2832 struct is_constructible_helper<T, true, TArgs...> :
public etl::true_type
2836 template <
typename T,
typename... TArgs>
2837 struct is_constructible_helper<T, false, TArgs...>;
2839 template <
typename T,
typename... TArgs>
2840 struct is_constructible :
public is_constructible_helper< T, etl::is_arithmetic<T>::value || etl::is_pointer<T>::value, TArgs...>
2847 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2848 struct is_copy_constructible;
2850 template <
typename T>
2851 struct is_copy_constructible<T, true> :
public etl::true_type
2855 template <
typename T>
2856 struct is_copy_constructible<T, false>;
2860 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2861 struct is_move_constructible;
2863 template <
typename T>
2864 struct is_move_constructible<T, true> :
public etl::true_type
2868 template <
typename T>
2869 struct is_move_constructible<T, false>;
2873 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2874 struct is_copy_assignable;
2876 template <
typename T>
2877 struct is_copy_assignable<T, true> :
public etl::true_type
2881 template <
typename T>
2882 struct is_copy_assignable<T, false>;
2886 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2887 struct is_move_assignable;
2889 template <
typename T>
2890 struct is_move_assignable<T, true> :
public etl::true_type
2894 template <
typename T>
2895 struct is_move_assignable<T, false>;
2899 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2900 struct is_trivially_constructible;
2902 template <
typename T>
2903 struct is_trivially_constructible<T, true> :
public etl::true_type
2907 template <
typename T>
2908 struct is_trivially_constructible<T, false>;
2912 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2913 struct is_trivially_copy_constructible;
2915 template <
typename T>
2916 struct is_trivially_copy_constructible<T, true> :
public etl::true_type
2920 template <
typename T>
2921 struct is_trivially_copy_constructible<T, false>;
2925 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2926 struct is_trivially_destructible;
2928 template <
typename T>
2929 struct is_trivially_destructible<T, true> :
public etl::true_type
2933 template <
typename T>
2934 struct is_trivially_destructible<T, false>;
2938 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2939 struct is_trivially_copy_assignable;
2941 template <
typename T>
2942 struct is_trivially_copy_assignable<T, true> :
public etl::true_type
2946 template <
typename T>
2947 struct is_trivially_copy_assignable<T, false>;
2951 template <typename T, bool BValue = etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
2952 struct is_trivially_copyable;
2954 template <
typename T>
2955 struct is_trivially_copyable<T, true> :
public etl::true_type
2959 template <
typename T>
2960 struct is_trivially_copyable<T, false>;
2971 template <
typename T1,
typename T2>
2972 #if ETL_USING_BUILTIN_IS_ASSIGNABLE
2973 struct is_assignable :
public etl::bool_constant<__is_assignable(T1, T2)>
2975 struct is_assignable
2976 :
public etl::bool_constant< (etl::is_arithmetic<T1>::value || etl::is_pointer<T1>::value)
2977 && (etl::is_arithmetic<T2>::value || etl::is_pointer<T2>::value)>
2985 namespace private_type_traits
2987 template <
class,
class T,
class... TArgs>
2992 template <
class T,
class... TArgs>
2993 struct is_constructible_<void_t<decltype(T(etl::declval<TArgs>()...))>, T, TArgs...> : etl::true_type
3000 template <
class T,
class... TArgs>
3001 using is_constructible = private_type_traits::is_constructible_<void_t<>, T, TArgs...>;
3006 struct is_copy_constructible :
public is_constructible< T, typename etl::add_lvalue_reference< typename etl::add_const<T>::type>::type>
3010 struct is_copy_constructible<void> :
public false_type
3014 struct is_copy_constructible<void const> :
public false_type
3018 struct is_copy_constructible<void volatile> :
public false_type
3022 struct is_copy_constructible<void const volatile> :
public false_type
3028 template <
typename T>
3029 struct is_move_constructible :
public is_constructible<T, typename etl::add_rvalue_reference<T>::type>
3033 struct is_move_constructible<void> :
public false_type
3037 struct is_move_constructible<void const> :
public false_type
3041 struct is_move_constructible<void volatile> :
public false_type
3045 struct is_move_constructible<void const volatile> :
public false_type
3053 template <
typename T>
3054 struct is_copy_constructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3060 template <
typename T>
3061 struct is_move_constructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3068 template <
typename T>
3069 struct is_copy_assignable
3070 :
public etl::is_assignable< typename etl::add_lvalue_reference<T>::type, typename etl::add_lvalue_reference<const T>::type>
3077 template <
typename T>
3078 struct is_move_assignable :
public etl::is_assignable<typename etl::add_lvalue_reference<T>::type, typename etl::add_rvalue_reference<T>::type>
3084 template <
typename T>
3085 struct is_move_assignable :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3092 template <
typename T>
3093 struct is_trivially_constructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3099 template <
typename T>
3100 struct is_trivially_copy_constructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3106 template <
typename T>
3107 struct is_trivially_destructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3113 template <
typename T>
3114 struct is_trivially_copy_assignable :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3120 template <
typename T>
3121 #if ETL_USING_BUILTIN_IS_TRIVIALLY_COPYABLE
3122 struct is_trivially_copyable :
public etl::bool_constant<__is_trivially_copyable(T)>
3124 struct is_trivially_copyable :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3131 template <
typename T1,
typename T2>
3132 struct is_lvalue_assignable
3133 :
public etl::is_assignable< typename etl::add_lvalue_reference<T1>::type,
3134 typename etl::add_lvalue_reference< typename etl::add_const<T2>::type>::type>
3141 template <
typename T,
typename =
void>
3146 template <
typename T>
3147 struct is_default_constructible<T, etl::void_t<decltype(T())>> : etl::true_type
3151 template <
typename T>
3152 struct is_default_constructible :
public etl::bool_constant<etl::is_arithmetic<T>::value || etl::is_pointer<T>::value>
3159 template <
typename T1,
typename T2>
3160 inline constexpr bool is_assignable_v = etl::is_assignable<T1, T2>::value;
3162 template <
typename T1,
typename T2>
3163 inline constexpr bool is_lvalue_assignable_v = etl::is_lvalue_assignable<T1, T2>::value;
3165 template <
typename T,
typename... TArgs>
3166 inline constexpr bool is_constructible_v = etl::is_constructible<T, TArgs...>::value;
3168 template <
typename T,
typename... TArgs>
3169 inline constexpr bool is_default_constructible_v = etl::is_default_constructible<T, TArgs...>::value;
3171 template <
typename T>
3172 inline constexpr bool is_copy_constructible_v = etl::is_copy_constructible<T>::value;
3174 template <
typename T>
3175 inline constexpr bool is_move_constructible_v = etl::is_move_constructible<T>::value;
3177 template <
typename T>
3178 inline constexpr bool is_copy_assignable_v = etl::is_copy_assignable<T>::value;
3180 template <
typename T>
3181 inline constexpr bool is_move_assignable_v = etl::is_move_assignable<T>::value;
3183 template <
typename T>
3184 inline constexpr bool is_trivially_constructible_v = etl::is_trivially_constructible<T>::value;
3186 template <
typename T>
3187 inline constexpr bool is_trivially_copy_constructible_v = etl::is_trivially_copy_constructible<T>::value;
3189 template <
typename T>
3190 inline constexpr bool is_trivially_destructible_v = etl::is_trivially_destructible<T>::value;
3192 template <
typename T>
3193 inline constexpr bool is_trivially_copy_assignable_v = etl::is_trivially_copy_assignable<T>::value;
3195 template <
typename T>
3196 inline constexpr bool is_trivially_copyable_v = etl::is_trivially_copyable<T>::value;
3208 template <
typename...>
3215 template <
typename T>
3216 struct common_type<T> : common_type<T, T>
3220 namespace private_common_type
3222 template <
typename T1,
typename T2>
3223 using conditional_result_t =
decltype(
false ? declval<T1>() : declval<T2>());
3225 template <
typename,
typename,
typename =
void>
3226 struct decay_conditional_result
3230 template <
typename T1,
typename T2>
3231 struct decay_conditional_result<T1, T2, void_t<conditional_result_t<T1, T2>>> : etl::decay<conditional_result_t<T1, T2>>
3235 template <
typename T1,
typename T2,
typename =
void>
3236 struct common_type_2_impl : decay_conditional_result<const T1&, const T2&>
3240 template <
typename T1,
typename T2>
3241 struct common_type_2_impl<T1, T2, void_t<conditional_result_t<T1, T2>>> : decay_conditional_result<T1, T2>
3248 template <
typename T1,
typename T2>
3249 struct common_type<T1, T2>
3250 : etl::conditional< etl::is_same<T1, typename etl::decay<T1>::type>::value && etl::is_same<T2, typename etl::decay<T2>::type>::value,
3251 private_common_type::common_type_2_impl<T1, T2>,
3252 common_type<typename etl::decay<T2>::type, typename etl::decay<T2>::type>>::type
3258 namespace private_common_type
3260 template <
typename AlwaysVoid,
typename T1,
typename T2,
typename... TRest>
3261 struct common_type_multi_impl
3265 template <
typename T1,
typename T2,
typename... TRest>
3266 struct common_type_multi_impl<void_t<typename common_type<T1, T2>::type>, T1, T2, TRest...>
3267 : common_type<typename common_type<T1, T2>::type, TRest...>
3272 template <
typename T1,
typename T2,
typename... TRest>
3273 struct common_type<T1, T2, TRest...> : private_common_type::common_type_multi_impl<void, T1, T2, TRest...>
3277 template <
typename... T>
3278 using common_type_t =
typename common_type<T...>::type;
3284 template <
typename T>
3285 struct unsigned_type
3287 typedef typename etl::conditional<
3288 sizeof(T) ==
sizeof(
unsigned char),
unsigned char,
3289 typename etl::conditional<
sizeof(T) ==
sizeof(
unsigned short),
unsigned short,
3290 typename etl::conditional<
sizeof(T) ==
sizeof(
unsigned int),
unsigned int,
3291 typename etl::conditional<
sizeof(T) ==
sizeof(
unsigned long),
unsigned long,
3292 unsigned long long>::type>::type>::type>::type type;
3296 template <
typename T>
3297 using unsigned_type_t =
typename unsigned_type<T>::type;
3303 template <
typename T>
3306 typedef typename etl::conditional<
3307 sizeof(T) ==
sizeof(char), char,
3308 typename etl::conditional<
3309 sizeof(T) ==
sizeof(short), short,
3310 typename etl::conditional<
sizeof(T) ==
sizeof(int), int,
3311 typename etl::conditional<
sizeof(T) ==
sizeof(long), long,
long long>::type>::type>::type>::type type;
3315 template <
typename T>
3316 using signed_type_t =
typename signed_type<T>::type;
3322 template <
typename T>
3323 struct type_identity
3329 template <
typename T>
3330 using type_identity_t =
typename type_identity<T>::type;
3335#if ETL_USING_BUILTIN_UNDERLYING_TYPE
3337 template <typename T, bool = etl::is_enum<T>::value>
3338 struct underlying_type;
3341 template <
typename T>
3342 struct underlying_type<T, false>
3345 ETL_STATIC_ASSERT(etl::is_enum<T>::value,
"etl::underlying_type can only be used with enumeration types.");
3348 template <
typename T>
3349 struct underlying_type<T, true>
3351 typedef __underlying_type(T) type;
3356 template <
typename T>
3357 struct underlying_type
3364 template <
typename T>
3365 using underlying_type_t =
typename underlying_type<T>::type;
3371 template <
typename... TTypes>
3372 struct has_duplicates;
3374 template <
typename TFirst,
typename... TRest>
3375 struct has_duplicates<TFirst, TRest...> : etl::conditional_t<etl::is_one_of<TFirst, TRest...>::value, etl::true_type, has_duplicates<TRest...>>
3379 template <
typename T>
3391 template <
typename... TTypes>
3392 inline constexpr bool has_duplicates_v = etl::has_duplicates<TTypes...>::value;
3398 template <
typename T,
typename... TTypes>
3401 template <
typename T,
typename U,
typename... URest>
3402 struct count_of<T, U, URest...> : etl::integral_constant<size_t, etl::is_same<T, U>::value + count_of<T, URest...>::value>
3406 template <
typename T>
3407 struct count_of<T> : etl::integral_constant<size_t, 0>
3413 template <
typename T,
typename... TTypes>
3414 inline constexpr size_t count_of_v = etl::count_of<T, TTypes...>::value;
3420 template <
typename T,
template <
typename...>
class Template>
3425 template <
template <
typename...>
class Template,
typename... TArgs>
3426 struct is_specialization<Template<TArgs...>, Template> : etl::true_type
3432 template <
typename T,
template <
typename...>
class Template>
3433 inline constexpr bool is_specialization_v = etl::is_specialization<T, Template>::value;
3438 ETL_CONSTEXPR
inline bool is_constant_evaluated() ETL_NOEXCEPT
3449#elif ETL_USING_BUILTIN_IS_CONSTANT_EVALUATED == 1
3451 return __builtin_is_constant_evaluated();
3462 template <
typename T>
3468 template <
typename TReturn,
typename... TArgs>
3469 struct is_function<TReturn(TArgs...)> : etl::true_type
3473 template <
typename TReturn,
typename... TArgs>
3474 struct is_function<TReturn(TArgs...) const> : etl::true_type
3478 template <
typename TReturn,
typename... TArgs>
3479 struct is_function<TReturn(TArgs...) volatile> : etl::true_type
3483 template <
typename TReturn,
typename... TArgs>
3484 struct is_function<TReturn(TArgs...) const volatile> : etl::true_type
3489 template <
typename TReturn,
typename... TArgs>
3490 struct is_function<TReturn(TArgs..., ...)> : etl::true_type
3494 template <
typename TReturn,
typename... TArgs>
3495 struct is_function<TReturn(TArgs..., ...) const> : etl::true_type
3499 template <
typename TReturn,
typename... TArgs>
3500 struct is_function<TReturn(TArgs..., ...) volatile> : etl::true_type
3504 template <
typename TReturn,
typename... TArgs>
3505 struct is_function<TReturn(TArgs..., ...) const volatile> : etl::true_type
3510 #if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
3511 template <
typename TReturn,
typename... TArgs>
3512 struct is_function<TReturn(TArgs...) noexcept> : etl::true_type
3516 template <
typename TReturn,
typename... TArgs>
3517 struct is_function<TReturn(TArgs...) const noexcept> : etl::true_type
3521 template <
typename TReturn,
typename... TArgs>
3522 struct is_function<TReturn(TArgs...) volatile noexcept> : etl::true_type
3526 template <
typename TReturn,
typename... TArgs>
3527 struct is_function<TReturn(TArgs...) const volatile noexcept> : etl::true_type
3531 template <
typename TReturn,
typename... TArgs>
3532 struct is_function<TReturn(TArgs..., ...) noexcept> : etl::true_type
3536 template <
typename TReturn,
typename... TArgs>
3537 struct is_function<TReturn(TArgs..., ...) const noexcept> : etl::true_type
3541 template <
typename TReturn,
typename... TArgs>
3542 struct is_function<TReturn(TArgs..., ...) volatile noexcept> : etl::true_type
3546 template <
typename TReturn,
typename... TArgs>
3547 struct is_function<TReturn(TArgs..., ...) const volatile noexcept> : etl::true_type
3553 template <
typename T>
3554 inline constexpr bool is_function_v = etl::is_function<T>::value;
3562 template <
typename T, etl::enable_if_t<etl::is_
class<etl::decay_t<T>>::value,
int> = 0>
3563 struct has_call_operator
3565 template <
typename U>
3566 static auto test(
int) ->
decltype(&U::operator(), etl::true_type());
3571 static const bool value = etl::is_same<decltype(test<T>(0)), etl::true_type>::value;
3575 template <
typename T>
3576 inline constexpr bool has_call_operator_v = etl::has_call_operator<T>::value;
3584 template <
typename T, etl::enable_if_t<etl::is_
class<etl::decay_t<T>>::value,
int> = 0>
3585 struct has_unique_call_operator
3590 template <
typename U>
3591 static auto test(
int) ->
decltype(&U::operator(), etl::true_type());
3602 static constexpr bool value =
decltype(test<etl::decay_t<T>>(0))::value;
3606 template <
typename T>
3607 inline constexpr bool has_unique_call_operator_v = etl::has_unique_call_operator<T>::value;
3614 namespace private_type_traits
3616 template <
typename T>
3621 template <
typename T,
typename TObject>
3622 struct is_member_pointer_helper<T TObject::*> : etl::true_type
3627 template <
typename T>
3628 struct is_member_pointer : private_type_traits::is_member_pointer_helper< typename etl::remove_cv<T>::type>
3633 template <
typename T>
3634 inline constexpr bool is_member_pointer_v = etl::is_member_pointer<T>::value;
3641 template <
typename T>
3646 template <
typename TReturn,
typename TObject,
typename... TArgs>
3647 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...)> : etl::true_type
3650 template <
typename TReturn,
typename TObject,
typename... TArgs>
3651 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const> : etl::true_type
3654 template <
typename TReturn,
typename TObject,
typename... TArgs>
3655 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) volatile> : etl::true_type
3658 template <
typename TReturn,
typename TObject,
typename... TArgs>
3659 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const volatile> : etl::true_type
3663 #if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
3664 template <
typename TReturn,
typename TObject,
typename... TArgs>
3665 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) noexcept> : etl::true_type
3668 template <
typename TReturn,
typename TObject,
typename... TArgs>
3669 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const noexcept> : etl::true_type
3672 template <
typename TReturn,
typename TObject,
typename... TArgs>
3673 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) volatile noexcept> : etl::true_type
3676 template <
typename TReturn,
typename TObject,
typename... TArgs>
3677 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const volatile noexcept> : etl::true_type
3682 template <
typename TReturn,
typename TObject,
typename... TArgs>
3683 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...)&> : etl::true_type
3686 template <
typename TReturn,
typename TObject,
typename... TArgs>
3687 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const&> : etl::true_type
3690 template <
typename TReturn,
typename TObject,
typename... TArgs>
3691 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) volatile&> : etl::true_type
3694 template <
typename TReturn,
typename TObject,
typename... TArgs>
3695 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const volatile&> : etl::true_type
3699 template <
typename TReturn,
typename TObject,
typename... TArgs>
3700 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) &&> : etl::true_type
3703 template <
typename TReturn,
typename TObject,
typename... TArgs>
3704 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const&&> : etl::true_type
3707 template <
typename TReturn,
typename TObject,
typename... TArgs>
3708 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) volatile&&> : etl::true_type
3711 template <
typename TReturn,
typename TObject,
typename... TArgs>
3712 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const volatile&&> : etl::true_type
3716 #if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
3717 template <
typename TReturn,
typename TObject,
typename... TArgs>
3718 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) & noexcept> : etl::true_type
3721 template <
typename TReturn,
typename TObject,
typename... TArgs>
3722 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const & noexcept> : etl::true_type
3725 template <
typename TReturn,
typename TObject,
typename... TArgs>
3726 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) volatile & noexcept> : etl::true_type
3729 template <
typename TReturn,
typename TObject,
typename... TArgs>
3730 struct is_member_function_pointer< TReturn (TObject::*)(TArgs...) const volatile & noexcept> : etl::true_type
3734 template <
typename TReturn,
typename TObject,
typename... TArgs>
3735 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) && noexcept> : etl::true_type
3738 template <
typename TReturn,
typename TObject,
typename... TArgs>
3739 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) const && noexcept> : etl::true_type
3742 template <
typename TReturn,
typename TObject,
typename... TArgs>
3743 struct is_member_function_pointer<TReturn (TObject::*)(TArgs...) volatile && noexcept> : etl::true_type
3746 template <
typename TReturn,
typename TObject,
typename... TArgs>
3747 struct is_member_function_pointer< TReturn (TObject::*)(TArgs...) const volatile && noexcept> : etl::true_type
3752 template <
typename TReturn,
typename TObject,
typename... TArgs>
3753 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...)> : etl::true_type
3756 template <
typename TReturn,
typename TObject,
typename... TArgs>
3757 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const> : etl::true_type
3760 template <
typename TReturn,
typename TObject,
typename... TArgs>
3761 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) volatile> : etl::true_type
3764 template <
typename TReturn,
typename TObject,
typename... TArgs>
3765 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const volatile> : etl::true_type
3769 #if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
3770 template <
typename TReturn,
typename TObject,
typename... TArgs>
3771 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) noexcept> : etl::true_type
3774 template <
typename TReturn,
typename TObject,
typename... TArgs>
3775 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const noexcept> : etl::true_type
3778 template <
typename TReturn,
typename TObject,
typename... TArgs>
3779 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) volatile noexcept> : etl::true_type
3782 template <
typename TReturn,
typename TObject,
typename... TArgs>
3783 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const volatile noexcept> : etl::true_type
3788 template <
typename TReturn,
typename TObject,
typename... TArgs>
3789 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...)&> : etl::true_type
3792 template <
typename TReturn,
typename TObject,
typename... TArgs>
3793 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const&> : etl::true_type
3796 template <
typename TReturn,
typename TObject,
typename... TArgs>
3797 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) volatile&> : etl::true_type
3800 template <
typename TReturn,
typename TObject,
typename... TArgs>
3801 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const volatile&> : etl::true_type
3804 template <
typename TReturn,
typename TObject,
typename... TArgs>
3805 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) &&> : etl::true_type
3808 template <
typename TReturn,
typename TObject,
typename... TArgs>
3809 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const&&> : etl::true_type
3812 template <
typename TReturn,
typename TObject,
typename... TArgs>
3813 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) volatile&&> : etl::true_type
3816 template <
typename TReturn,
typename TObject,
typename... TArgs>
3817 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const volatile&&> : etl::true_type
3821 #if ETL_HAS_NOEXCEPT_FUNCTION_TYPE
3822 template <
typename TReturn,
typename TObject,
typename... TArgs>
3823 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) & noexcept> : etl::true_type
3826 template <
typename TReturn,
typename TObject,
typename... TArgs>
3827 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const & noexcept> : etl::true_type
3830 template <
typename TReturn,
typename TObject,
typename... TArgs>
3831 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) volatile & noexcept> : etl::true_type
3834 template <
typename TReturn,
typename TObject,
typename... TArgs>
3835 struct is_member_function_pointer< TReturn (TObject::*)(TArgs..., ...) const volatile & noexcept> : etl::true_type
3839 template <
typename TReturn,
typename TObject,
typename... TArgs>
3840 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) && noexcept> : etl::true_type
3843 template <
typename TReturn,
typename TObject,
typename... TArgs>
3844 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) const && noexcept> : etl::true_type
3847 template <
typename TReturn,
typename TObject,
typename... TArgs>
3848 struct is_member_function_pointer<TReturn (TObject::*)(TArgs..., ...) volatile && noexcept> : etl::true_type
3851 template <
typename TReturn,
typename TObject,
typename... TArgs>
3852 struct is_member_function_pointer< TReturn (TObject::*)(TArgs..., ...) const volatile && noexcept> : etl::true_type
3859 template <
typename T>
3860 inline constexpr bool is_member_function_pointer_v = etl::is_member_function_pointer<T>::value;
3867 namespace private_type_traits
3874 template <
typename T,
typename TObject>
3875 struct is_member_object_pointer_helper<T TObject::*> :
public etl::negation<etl::is_function<T>>
3880 template <
typename T>
3881 struct is_member_object_pointer :
public private_type_traits::is_member_object_pointer_helper< etl::remove_cv_t<T>>::type
3887 template <
typename T>
3888 inline constexpr bool is_member_object_pointer_v = etl::is_member_object_pointer<T>::value;
3892 template <
class... TArgs>
3893 struct common_reference;
3895 template <
class... TArgs>
3896 using common_reference_t =
typename etl::common_reference<TArgs...>::type;
3898 template <
class T,
class U,
template <
class>
class TQual,
template <
class>
class UQual>
3899 struct basic_common_reference
3905 struct common_reference<>
3911 struct common_reference<T>
3916 namespace private_type_traits
3918 template <
class T1,
class T2>
3919 using cond_res =
decltype(
false ? etl::declval<T1 (&)()>()() : etl::declval<T2 (&)()>()());
3921 template <
class From>
3928 template <
class From>
3929 struct copy_cv<const From>
3932 using apply =
const To;
3935 template <
class From>
3936 struct copy_cv<volatile From>
3939 using apply =
volatile To;
3942 template <
class From>
3943 struct copy_cv<const volatile From>
3946 using apply =
const volatile To;
3949 template <
class From,
class To>
3950 using copy_cv_t =
typename copy_cv<From>::template apply<To>;
3952 template <
class From>
3956 using apply = copy_cv_t<From, To>;
3959 template <
class From>
3960 struct copy_cvref<From&>
3963 using apply = add_lvalue_reference_t<copy_cv_t<From, To>>;
3966 template <
class From>
3967 struct copy_cvref<From&&>
3970 using apply = add_lvalue_reference_t<copy_cv_t<From, To>>;
3973 template <
class From,
class To>
3974 using copy_cvref_t =
typename copy_cvref<From>::template apply<To>;
3980 using apply = copy_cvref_t<T1, T2>;
3983 template <
class T1,
class T2,
class T1_RR = remove_reference_t<T1>,
class T2_RR = remove_reference_t<T2>>
3986 template <
class T1,
class T2>
3987 using common_ref_t =
typename common_ref<T1, T2>::type;
3989 template <
class T1,
class T2>
3990 using cv_cond_res = cond_res<copy_cv_t<T1, T2>&, copy_cv_t<T2, T1>&>;
3992 template <
class T1,
class T2,
class T1_RR,
class T2_RR>
3993 requires requires {
typename cv_cond_res<T1_RR, T2_RR>; } && is_reference_v<cv_cond_res<T1_RR, T2_RR>>
3994 struct common_ref<T1&, T2&, T1_RR, T2_RR>
3996 using type = cv_cond_res<T1_RR, T2_RR>;
3999 template <
class T1,
class T2>
4000 using common_ref_rr = remove_reference_t<common_ref_t<T1&, T2&>>&&;
4002 template <
class T1,
class T2,
class T1_R,
class T2_R>
4003 requires requires {
typename common_ref_rr<T1_R, T2_R>; }
4004 && is_convertible_v<T1&&, common_ref_rr<T1_R, T2_R>> && is_convertible_v<T2&&, common_ref_rr<T1_R, T2_R>>
4005 struct common_ref<T1&&, T2&&, T1_R, T2_R>
4007 using type = common_ref_rr<T1_R, T2_R>;
4010 template <
class T1,
class T2>
4011 using common_ref_cr = common_ref_t<const T1&, T2&>;
4013 template <
class T1,
class T2,
class T3,
class T4>
4014 requires requires {
typename common_ref_cr<T3, T4>; } && is_convertible_v<T1&&, common_ref_cr<T3, T4>>
4015 struct common_ref<T1&&, T2&, T3, T4>
4017 using type = common_ref_cr<T3, T4>;
4020 template <
class T1,
class T2,
class T3,
class T4>
4021 struct common_ref<T1&, T2&&, T3, T4> : common_ref<T2&&, T1&>
4025 template <
class T1,
class T2,
class T3,
class T4>
4030 template <
class T1,
class T2>
4031 struct common_reference_impl3;
4033 template <
class T1,
class T2>
4034 struct common_reference_impl2 : common_reference_impl3<T1, T2>
4038 template <
class T1,
class T2>
4039 struct common_reference_impl1 : common_reference_impl2<T1, T2>
4045 template <
class T1,
class T2>
4046 struct common_reference<T1, T2> : private_type_traits::common_reference_impl1<T1, T2>
4050 namespace private_type_traits
4052 template <
class T1,
class T2>
4053 requires is_reference_v<T1> && is_reference_v<T2> &&
requires {
typename common_ref_t<T1, T2>; }
4054 && is_convertible_v<add_pointer_t<T1>, add_pointer_t<common_ref_t<T1, T2>>>
4055 && is_convertible_v<add_pointer_t<T2>, add_pointer_t<common_ref_t<T1, T2>>>
4056 struct common_reference_impl1<T1, T2>
4058 using type = common_ref_t<T1, T2>;
4061 template <
class T1,
class T2>
4062 using basic_common_reference_t =
4063 typename basic_common_reference<remove_cvref_t<T1>, remove_cvref_t<T2>, xref<T1>::template apply, xref<T2>::template apply>::type;
4065 template <
class T1,
class T2>
4066 requires requires {
typename basic_common_reference_t<T1, T2>; }
4067 struct common_reference_impl2<T1, T2>
4069 using type = basic_common_reference_t<T1, T2>;
4072 template <
class T1,
class T2>
4073 requires requires {
typename cond_res<T1, T2>; }
4074 struct common_reference_impl3<T1, T2>
4076 using type = cond_res<T1, T2>;
4079 template <
class T1,
class T2>
4080 struct common_reference_impl3 : common_type<T1, T2>
4085 template <
class T1,
class T2,
class T3,
class... TArgs>
4086 requires requires {
typename common_reference_t<T1, T2>; }
4087 struct common_reference<T1, T2, T3, TArgs...> : common_reference<common_reference_t<T1, T2>, T3, TArgs...>
4091 template <
class... TArgs>
4092 struct common_reference
4099 template <
typename,
typename =
void>
4104 template <
typename T>
4105 struct has_size<T, void_t<decltype(etl::declval<T>().
size())> > : etl::true_type
4109 template <
typename T>
4120 template <
typename U>
4121 static yes test_size(
char (*)[
sizeof(&U::size)]);
4123 template <
typename U>
4124 static no test_size(...);
4128 static const bool value = (
sizeof(test_size<T>(0)) ==
sizeof(yes));
4133 template <
typename,
typename =
void>
4138 template <
typename T>
4139 struct has_data<T, void_t<decltype(etl::declval<T>().
data())> > : etl::true_type
4143 template <
typename T>
4154 template <
typename U>
4155 static yes test_data(
char (*)[
sizeof(&U::data)]);
4157 template <
typename U>
4158 static no test_data(...);
4162 static const bool value = (
sizeof(test_data<T>(0)) ==
sizeof(yes));
4168#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)
4169#define ETL_IS_NOT_CHAR_TYPE(type) (!ETL_IS_CHAR_TYPE(type))
4171#define ETL_IS_POINTER_TYPE(type) (etl::is_pointer<type>::value)
4172#define ETL_IS_NOT_POINTER_TYPE(type) (!ETL_IS_POINTER_TYPE(type))
4174#define ETL_TARGET_IS_TRIVIALLY_COPYABLE(type) (etl::is_trivially_copyable< typename etl::iterator_traits<type>::value_type>::value)
4175#define ETL_TARGET_IS_NOT_TRIVIALLY_COPYABLE(type) (!ETL_TARGET_IS_TRIVIALLY_COPYABLE(type))
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR TContainer::pointer data(TContainer &container)
Definition iterator.h:1228
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits.h:80
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1192
add_const
Definition type_traits.h:251
add_cv
Definition type_traits.h:338
add_pointer
Definition type_traits.h:200
add_volatile
Definition type_traits.h:307
Definition type_traits.h:97
integral_constant
Definition type_traits.h:67
is_const
Definition type_traits.h:213
is_integral
Definition type_traits.h:364
is_signed
Definition type_traits.h:458
is_volatile
Definition type_traits.h:269
negation
Definition type_traits.h:110
remove_const
Definition type_traits.h:233
remove_cv
Definition type_traits.h:325
remove_cvref
Definition type_traits.h:351
remove_pointer
Definition type_traits.h:147
remove_reference
Definition type_traits.h:122
remove_volatile
Definition type_traits.h:289