29#ifndef _GLIBCXX_TYPE_TRAITS
30#define _GLIBCXX_TYPE_TRAITS 1
32#pragma GCC system_header
34#if __cplusplus < 201103L
40namespace std _GLIBCXX_VISIBILITY(default)
42_GLIBCXX_BEGIN_NAMESPACE_VERSION
44 template<
typename _Tp>
61 template<
typename _Tp, _Tp __v>
64 static constexpr _Tp value = __v;
65 typedef _Tp value_type;
67 constexpr operator value_type()
const noexcept {
return value; }
68#if __cplusplus > 201103L
70#define __cpp_lib_integral_constant_callable 201304L
72 constexpr value_type operator()()
const noexcept {
return value; }
76#if ! __cpp_inline_variables
77 template<
typename _Tp, _Tp __v>
78 constexpr _Tp integral_constant<_Tp, __v>::value;
93#if __cplusplus >= 201703L
94# define __cpp_lib_bool_constant 201505L
105 template<
bool,
typename _Tp =
void>
110 template<
typename _Tp>
112 {
typedef _Tp
type; };
115 template<
bool _Cond,
typename _Tp =
void>
116 using __enable_if_t =
typename enable_if<_Cond, _Tp>::type;
121 template<
typename _Tp,
typename>
126 struct __conditional<false>
128 template<
typename,
typename _Up>
133 template<
bool _Cond,
typename _If,
typename _Else>
134 using __conditional_t
138 template <
typename _Type>
139 struct __type_identity
140 {
using type = _Type; };
142 template<
typename _Tp>
143 using __type_identity_t =
typename __type_identity<_Tp>::type;
148 template<
typename _Tp,
typename...>
149 using __first_t = _Tp;
152 template<
typename... _Bn>
154 __enable_if_t<!bool(_Bn::value)>...>;
156 template<
typename... _Bn>
159 template<
typename... _Bn>
160 auto __and_fn(
int) -> __first_t<
true_type,
161 __enable_if_t<bool(_Bn::value)>...>;
163 template<
typename... _Bn>
170 template<
typename... _Bn>
172 : decltype(__detail::__or_fn<_Bn...>(0))
175 template<
typename... _Bn>
177 : decltype(__detail::__and_fn<_Bn...>(0))
180 template<
typename _Pp>
182 : __bool_constant<!bool(_Pp::value)>
186#if __cplusplus >= 201703L
189 template<
typename... _Bn>
190 inline constexpr bool __or_v = __or_<_Bn...>::value;
191 template<
typename... _Bn>
192 inline constexpr bool __and_v = __and_<_Bn...>::value;
196 template<
typename ,
typename _B1,
typename... _Bn>
197 struct __disjunction_impl
198 {
using type = _B1; };
200 template<
typename _B1,
typename _B2,
typename... _Bn>
201 struct __disjunction_impl<__enable_if_t<!bool(_B1::value)>, _B1, _B2, _Bn...>
202 {
using type =
typename __disjunction_impl<void, _B2, _Bn...>::type; };
204 template<
typename ,
typename _B1,
typename... _Bn>
205 struct __conjunction_impl
206 {
using type = _B1; };
208 template<
typename _B1,
typename _B2,
typename... _Bn>
209 struct __conjunction_impl<__enable_if_t<bool(_B1::value)>, _B1, _B2, _Bn...>
210 {
using type =
typename __conjunction_impl<void, _B2, _Bn...>::type; };
214#define __cpp_lib_logical_traits 201510L
216 template<
typename... _Bn>
218 : __detail::__conjunction_impl<void, _Bn...>::type
226 template<
typename... _Bn>
228 : __detail::__disjunction_impl<void, _Bn...>::type
236 template<
typename _Pp>
244 template<
typename... _Bn>
245 inline constexpr bool conjunction_v = conjunction<_Bn...>::value;
247 template<
typename... _Bn>
248 inline constexpr bool disjunction_v = disjunction<_Bn...>::value;
250 template<
typename _Pp>
251 inline constexpr bool negation_v = negation<_Pp>::value;
270 struct __is_array_unknown_bounds;
275 template <
typename _Tp,
size_t = sizeof(_Tp)>
276 constexpr true_type __is_complete_or_unbounded(__type_identity<_Tp>)
279 template <
typename _TypeIdentity,
280 typename _NestedType =
typename _TypeIdentity::type>
281 constexpr typename __or_<
285 __is_array_unknown_bounds<_NestedType>
286 >::type __is_complete_or_unbounded(_TypeIdentity)
290 template<
typename _Tp>
291 using __remove_cv_t =
typename remove_cv<_Tp>::type;
297 template<
typename _Tp>
306 struct is_void<const void>
307 :
public true_type { };
314 struct is_void<const volatile void>
319 struct __is_integral_helper
323 struct __is_integral_helper<bool>
327 struct __is_integral_helper<char>
331 struct __is_integral_helper<signed char>
335 struct __is_integral_helper<unsigned char>
342 struct __is_integral_helper<wchar_t>
345#ifdef _GLIBCXX_USE_CHAR8_T
347 struct __is_integral_helper<char8_t>
352 struct __is_integral_helper<char16_t>
356 struct __is_integral_helper<char32_t>
360 struct __is_integral_helper<short>
364 struct __is_integral_helper<unsigned short>
368 struct __is_integral_helper<int>
372 struct __is_integral_helper<unsigned int>
376 struct __is_integral_helper<long>
380 struct __is_integral_helper<unsigned long>
384 struct __is_integral_helper<long long>
388 struct __is_integral_helper<unsigned long long>
393#if defined(__GLIBCXX_TYPE_INT_N_0)
396 struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_0>
401 struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_0>
404#if defined(__GLIBCXX_TYPE_INT_N_1)
407 struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_1>
412 struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_1>
415#if defined(__GLIBCXX_TYPE_INT_N_2)
418 struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_2>
423 struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_2>
426#if defined(__GLIBCXX_TYPE_INT_N_3)
429 struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_3>
434 struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_3>
440 template<
typename _Tp>
442 :
public __is_integral_helper<__remove_cv_t<_Tp>>
::type
447 struct __is_floating_point_helper
451 struct __is_floating_point_helper<float>
452 :
public true_type { };
455 struct __is_floating_point_helper<double>
459 struct __is_floating_point_helper<long double>
462#ifdef __STDCPP_FLOAT16_T__
464 struct __is_floating_point_helper<_Float16>
468#ifdef __STDCPP_FLOAT32_T__
470 struct __is_floating_point_helper<_Float32>
474#ifdef __STDCPP_FLOAT64_T__
476 struct __is_floating_point_helper<_Float64>
480#ifdef __STDCPP_FLOAT128_T__
482 struct __is_floating_point_helper<_Float128>
486#ifdef __STDCPP_BFLOAT16_T__
488 struct __is_floating_point_helper<__gnu_cxx::__bfloat16_t>
492#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128) && !defined(__CUDACC__)
494 struct __is_floating_point_helper<__float128>
500 template<
typename _Tp>
502 :
public __is_floating_point_helper<__remove_cv_t<_Tp>>
::type
510 template<
typename _Tp, std::
size_t _Size>
514 template<
typename _Tp>
515 struct is_array<_Tp[]>
516 :
public true_type { };
519 struct __is_pointer_helper
522 template<
typename _Tp>
523 struct __is_pointer_helper<_Tp*>
527 template<
typename _Tp>
529 :
public __is_pointer_helper<__remove_cv_t<_Tp>>
::type
537 template<
typename _Tp>
546 template<
typename _Tp>
551 struct __is_member_object_pointer_helper
552 :
public false_type { };
554 template<
typename _Tp,
typename _Cp>
555 struct __is_member_object_pointer_helper<_Tp _Cp::*>
556 :
public __not_<is_function<_Tp>>::type { };
559 template<
typename _Tp>
561 :
public __is_member_object_pointer_helper<__remove_cv_t<_Tp>>
::type
565 struct __is_member_function_pointer_helper
568 template<
typename _Tp,
typename _Cp>
569 struct __is_member_function_pointer_helper<_Tp _Cp::*>
570 :
public is_function<_Tp>::type { };
573 template<
typename _Tp>
575 :
public __is_member_function_pointer_helper<__remove_cv_t<_Tp>>
::type
579 template<
typename _Tp>
585 template<
typename _Tp>
591 template<
typename _Tp>
597 template<
typename _Tp>
599 :
public __bool_constant<!is_const<const _Tp>::value> { };
601 template<
typename _Tp>
605 template<
typename _Tp>
606 struct is_function<_Tp&&>
607 :
public false_type { };
609#define __cpp_lib_is_null_pointer 201309L
612 template<
typename _Tp>
621 struct is_null_pointer<const
std::nullptr_t>
622 :
public true_type { };
634 template<
typename _Tp>
637 { } _GLIBCXX_DEPRECATED_SUGGEST(
"std::is_null_pointer");
642 template<
typename _Tp>
647 template<
typename _Tp>
652 template<
typename _Tp>
653 struct is_reference<_Tp&&>
658 template<
typename _Tp>
660 :
public __or_<is_integral<_Tp>, is_floating_point<_Tp>>
::type
664 template<
typename _Tp>
666 :
public __or_<is_arithmetic<_Tp>, is_void<_Tp>,
667 is_null_pointer<_Tp>>
::type
671 template<
typename _Tp>
673 :
public __not_<__or_<is_function<_Tp>, is_reference<_Tp>,
681 template<
typename _Tp>
683 :
public __or_<is_arithmetic<_Tp>, is_enum<_Tp>, is_pointer<_Tp>,
684 is_member_pointer<_Tp>, is_null_pointer<_Tp>>
::type
688 template<
typename _Tp>
690 :
public __not_<is_fundamental<_Tp>>
::type { };
693 template<
typename _Tp>
694 struct __is_member_pointer_helper
697 template<
typename _Tp,
typename _Cp>
698 struct __is_member_pointer_helper<_Tp _Cp::*>
699 :
public true_type { };
703 template<
typename _Tp>
705 :
public __is_member_pointer_helper<__remove_cv_t<_Tp>>
::type
708 template<
typename,
typename>
712 template<
typename _Tp,
typename... _Types>
713 using __is_one_of = __or_<is_same<_Tp, _Types>...>;
717 template<
typename _Tp>
718 using __is_signed_integer = __is_one_of<__remove_cv_t<_Tp>,
719 signed char,
signed short,
signed int,
signed long,
721#if defined(__GLIBCXX_TYPE_INT_N_0)
722 ,
signed __GLIBCXX_TYPE_INT_N_0
724#if defined(__GLIBCXX_TYPE_INT_N_1)
725 ,
signed __GLIBCXX_TYPE_INT_N_1
727#if defined(__GLIBCXX_TYPE_INT_N_2)
728 ,
signed __GLIBCXX_TYPE_INT_N_2
730#if defined(__GLIBCXX_TYPE_INT_N_3)
731 ,
signed __GLIBCXX_TYPE_INT_N_3
737 template<
typename _Tp>
738 using __is_unsigned_integer = __is_one_of<__remove_cv_t<_Tp>,
739 unsigned char,
unsigned short,
unsigned int,
unsigned long,
741#if defined(__GLIBCXX_TYPE_INT_N_0)
742 ,
unsigned __GLIBCXX_TYPE_INT_N_0
744#if defined(__GLIBCXX_TYPE_INT_N_1)
745 ,
unsigned __GLIBCXX_TYPE_INT_N_1
747#if defined(__GLIBCXX_TYPE_INT_N_2)
748 ,
unsigned __GLIBCXX_TYPE_INT_N_2
750#if defined(__GLIBCXX_TYPE_INT_N_3)
751 ,
unsigned __GLIBCXX_TYPE_INT_N_3
756 template<
typename _Tp>
757 using __is_standard_integer
758 = __or_<__is_signed_integer<_Tp>, __is_unsigned_integer<_Tp>>;
761 template<
typename...>
using __void_t = void;
771 template<
typename _Tp>
780 template<
typename _Tp>
785 template<
typename _Tp>
789 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
790 "template argument must be a complete class or an unbounded array");
794 template<
typename _Tp>
798 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
799 "template argument must be a complete class or an unbounded array");
803 template<
typename _Tp>
807 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
808 "template argument must be a complete class or an unbounded array");
816 template<
typename _Tp>
818 _GLIBCXX20_DEPRECATED_SUGGEST(
"is_standard_layout && is_trivial")
822 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
823 "template argument must be a complete class or an unbounded array");
830 template<
typename _Tp>
832 _GLIBCXX17_DEPRECATED
836 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
837 "template argument must be a complete class or an unbounded array");
841 template<
typename _Tp>
847 template<
typename _Tp>
852#if __cplusplus >= 201402L
853#define __cpp_lib_is_final 201402L
856 template<
typename _Tp>
863 template<
typename _Tp>
869 template<
typename _Tp,
871 struct __is_signed_helper
874 template<
typename _Tp>
875 struct __is_signed_helper<_Tp, true>
876 :
public integral_constant<bool, _Tp(-1) < _Tp(0)>
881 template<typename _Tp>
883 : public __is_signed_helper<_Tp>::type
887 template<typename _Tp>
889 : public __and_<is_arithmetic<_Tp>, __not_<is_signed<_Tp>>>::type
893 template<typename _Tp, typename _Up = _Tp&&>
897 template<typename _Tp>
902 template<typename _Tp>
903 auto declval() noexcept -> decltype(__declval<_Tp>(0));
909 template<typename _Tp>
910 struct __is_array_known_bounds
914 template<
typename _Tp,
size_t _Size>
915 struct __is_array_known_bounds<_Tp[_Size]>
919 template<
typename _Tp>
920 struct __is_array_unknown_bounds
924 template<
typename _Tp>
925 struct __is_array_unknown_bounds<_Tp[]>
936 struct __do_is_destructible_impl
938 template<typename _Tp, typename = decltype(declval<_Tp&>().~_Tp())>
939 static true_type __test(
int);
945 template<
typename _Tp>
946 struct __is_destructible_impl
947 :
public __do_is_destructible_impl
949 typedef decltype(__test<_Tp>(0)) type;
952 template<
typename _Tp,
953 bool = __or_<is_void<_Tp>,
954 __is_array_unknown_bounds<_Tp>,
957 struct __is_destructible_safe;
959 template<
typename _Tp>
960 struct __is_destructible_safe<_Tp, false, false>
961 :
public __is_destructible_impl<typename
962 remove_all_extents<_Tp>::type>::type
965 template<
typename _Tp>
966 struct __is_destructible_safe<_Tp, true, false>
969 template<
typename _Tp>
970 struct __is_destructible_safe<_Tp, false, true>
975 template<
typename _Tp>
977 :
public __is_destructible_safe<_Tp>
::type
979 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
980 "template argument must be a complete class or an unbounded array");
989 struct __do_is_nt_destructible_impl
991 template<
typename _Tp>
992 static __bool_constant<noexcept(declval<_Tp&>().~_Tp())>
999 template<
typename _Tp>
1000 struct __is_nt_destructible_impl
1001 :
public __do_is_nt_destructible_impl
1003 typedef decltype(__test<_Tp>(0)) type;
1006 template<
typename _Tp,
1007 bool = __or_<is_void<_Tp>,
1008 __is_array_unknown_bounds<_Tp>,
1011 struct __is_nt_destructible_safe;
1013 template<
typename _Tp>
1014 struct __is_nt_destructible_safe<_Tp, false, false>
1015 :
public __is_nt_destructible_impl<typename
1016 remove_all_extents<_Tp>::type>::type
1019 template<
typename _Tp>
1020 struct __is_nt_destructible_safe<_Tp, true, false>
1023 template<
typename _Tp>
1024 struct __is_nt_destructible_safe<_Tp, false, true>
1029 template<
typename _Tp>
1031 :
public __is_nt_destructible_safe<_Tp>
::type
1033 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1034 "template argument must be a complete class or an unbounded array");
1038 template<
typename _Tp,
typename... _Args>
1039 using __is_constructible_impl
1040 = __bool_constant<__is_constructible(_Tp, _Args...)>;
1044 template<
typename _Tp,
typename... _Args>
1046 :
public __is_constructible_impl<_Tp, _Args...>
1048 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1049 "template argument must be a complete class or an unbounded array");
1053 template<
typename _Tp>
1055 :
public __is_constructible_impl<_Tp>
1057 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1058 "template argument must be a complete class or an unbounded array");
1062 template<
typename _Tp,
typename =
void>
1063 struct __add_lvalue_reference_helper
1064 {
using type = _Tp; };
1066 template<
typename _Tp>
1067 struct __add_lvalue_reference_helper<_Tp, __void_t<_Tp&>>
1068 {
using type = _Tp&; };
1070 template<
typename _Tp>
1071 using __add_lval_ref_t =
typename __add_lvalue_reference_helper<_Tp>::type;
1075 template<
typename _Tp>
1077 :
public __is_constructible_impl<_Tp, __add_lval_ref_t<const _Tp>>
1079 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1080 "template argument must be a complete class or an unbounded array");
1084 template<
typename _Tp,
typename =
void>
1085 struct __add_rvalue_reference_helper
1086 {
using type = _Tp; };
1088 template<
typename _Tp>
1089 struct __add_rvalue_reference_helper<_Tp, __void_t<_Tp&&>>
1090 {
using type = _Tp&&; };
1092 template<
typename _Tp>
1093 using __add_rval_ref_t =
typename __add_rvalue_reference_helper<_Tp>::type;
1097 template<
typename _Tp>
1099 :
public __is_constructible_impl<_Tp, __add_rval_ref_t<_Tp>>
1101 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1102 "template argument must be a complete class or an unbounded array");
1106 template<
typename _Tp,
typename... _Args>
1107 using __is_nothrow_constructible_impl
1108 = __bool_constant<__is_nothrow_constructible(_Tp, _Args...)>;
1112 template<
typename _Tp,
typename... _Args>
1114 :
public __is_nothrow_constructible_impl<_Tp, _Args...>
1116 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1117 "template argument must be a complete class or an unbounded array");
1121 template<
typename _Tp>
1123 :
public __is_nothrow_constructible_impl<_Tp>
1125 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1126 "template argument must be a complete class or an unbounded array");
1130 template<
typename _Tp>
1132 :
public __is_nothrow_constructible_impl<_Tp, __add_lval_ref_t<const _Tp>>
1134 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1135 "template argument must be a complete class or an unbounded array");
1139 template<
typename _Tp>
1141 :
public __is_nothrow_constructible_impl<_Tp, __add_rval_ref_t<_Tp>>
1143 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1144 "template argument must be a complete class or an unbounded array");
1148 template<
typename _Tp,
typename _Up>
1149 using __is_assignable_impl = __bool_constant<__is_assignable(_Tp, _Up)>;
1153 template<
typename _Tp,
typename _Up>
1155 :
public __is_assignable_impl<_Tp, _Up>
1157 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1158 "template argument must be a complete class or an unbounded array");
1162 template<
typename _Tp>
1164 :
public __is_assignable_impl<__add_lval_ref_t<_Tp>,
1165 __add_lval_ref_t<const _Tp>>
1167 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1168 "template argument must be a complete class or an unbounded array");
1172 template<
typename _Tp>
1174 :
public __is_assignable_impl<__add_lval_ref_t<_Tp>, __add_rval_ref_t<_Tp>>
1176 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1177 "template argument must be a complete class or an unbounded array");
1181 template<
typename _Tp,
typename _Up>
1182 using __is_nothrow_assignable_impl
1183 = __bool_constant<__is_nothrow_assignable(_Tp, _Up)>;
1187 template<
typename _Tp,
typename _Up>
1189 :
public __is_nothrow_assignable_impl<_Tp, _Up>
1191 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1192 "template argument must be a complete class or an unbounded array");
1196 template<
typename _Tp>
1198 :
public __is_nothrow_assignable_impl<__add_lval_ref_t<_Tp>,
1199 __add_lval_ref_t<const _Tp>>
1201 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1202 "template argument must be a complete class or an unbounded array");
1206 template<
typename _Tp>
1208 :
public __is_nothrow_assignable_impl<__add_lval_ref_t<_Tp>,
1209 __add_rval_ref_t<_Tp>>
1211 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1212 "template argument must be a complete class or an unbounded array");
1216 template<
typename _Tp,
typename... _Args>
1217 using __is_trivially_constructible_impl
1218 = __bool_constant<__is_trivially_constructible(_Tp, _Args...)>;
1222 template<
typename _Tp,
typename... _Args>
1224 :
public __is_trivially_constructible_impl<_Tp, _Args...>
1226 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1227 "template argument must be a complete class or an unbounded array");
1231 template<
typename _Tp>
1233 :
public __is_trivially_constructible_impl<_Tp>
1235 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1236 "template argument must be a complete class or an unbounded array");
1239 struct __do_is_implicitly_default_constructible_impl
1241 template <
typename _Tp>
1242 static void __helper(
const _Tp&);
1244 template <
typename _Tp>
1246 decltype(__helper<const _Tp&>({}))* = 0);
1248 static false_type __test(...);
1251 template<
typename _Tp>
1252 struct __is_implicitly_default_constructible_impl
1253 :
public __do_is_implicitly_default_constructible_impl
1258 template<
typename _Tp>
1259 struct __is_implicitly_default_constructible_safe
1260 :
public __is_implicitly_default_constructible_impl<_Tp>::type
1263 template <
typename _Tp>
1264 struct __is_implicitly_default_constructible
1265 :
public __and_<__is_constructible_impl<_Tp>,
1266 __is_implicitly_default_constructible_safe<_Tp>>::type
1270 template<
typename _Tp>
1272 :
public __is_trivially_constructible_impl<_Tp, __add_lval_ref_t<const _Tp>>
1274 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1275 "template argument must be a complete class or an unbounded array");
1279 template<
typename _Tp>
1281 :
public __is_trivially_constructible_impl<_Tp, __add_rval_ref_t<_Tp>>
1283 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1284 "template argument must be a complete class or an unbounded array");
1288 template<
typename _Tp,
typename _Up>
1289 using __is_trivially_assignable_impl
1290 = __bool_constant<__is_trivially_assignable(_Tp, _Up)>;
1294 template<
typename _Tp,
typename _Up>
1296 :
public __is_trivially_assignable_impl<_Tp, _Up>
1298 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1299 "template argument must be a complete class or an unbounded array");
1303 template<
typename _Tp>
1305 :
public __is_trivially_assignable_impl<__add_lval_ref_t<_Tp>,
1306 __add_lval_ref_t<const _Tp>>
1308 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1309 "template argument must be a complete class or an unbounded array");
1313 template<
typename _Tp>
1315 :
public __is_trivially_assignable_impl<__add_lval_ref_t<_Tp>,
1316 __add_rval_ref_t<_Tp>>
1318 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1319 "template argument must be a complete class or an unbounded array");
1323 template<
typename _Tp>
1325 :
public __and_<__is_destructible_safe<_Tp>,
1326 __bool_constant<__has_trivial_destructor(_Tp)>>
::type
1328 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1329 "template argument must be a complete class or an unbounded array");
1334 template<
typename _Tp>
1338 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1339 "template argument must be a complete class or an unbounded array");
1346 template<
typename _Tp>
1350 static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
1351 "template argument must be a complete class or an unbounded array");
1359 template<
typename _Tp, std::
size_t _Size>
1360 struct rank<_Tp[_Size]>
1363 template<
typename _Tp>
1365 :
public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };
1368 template<
typename,
unsigned _U
int = 0>
1372 template<
typename _Tp,
size_t _Size>
1373 struct extent<_Tp[_Size], 0>
1376 template<
typename _Tp,
unsigned _U
int,
size_t _Size>
1377 struct extent<_Tp[_Size], _Uint>
1378 :
public extent<_Tp, _Uint - 1>::type { };
1380 template<
typename _Tp>
1384 template<
typename _Tp,
unsigned _U
int>
1385 struct extent<_Tp[], _Uint>
1386 :
public extent<_Tp, _Uint - 1>::type { };
1392 template<
typename _Tp,
typename _Up>
1394#ifdef _GLIBCXX_HAVE_BUILTIN_IS_SAME
1401#ifndef _GLIBCXX_HAVE_BUILTIN_IS_SAME
1402 template<
typename _Tp>
1409 template<
typename _Base,
typename _Derived>
1414#if __has_builtin(__is_convertible)
1415 template<
typename _From,
typename _To>
1416 struct is_convertible
1417 :
public __bool_constant<__is_convertible(_From, _To)>
1420 template<
typename _From,
typename _To,
1421 bool = __or_<is_void<_From>, is_function<_To>,
1422 is_array<_To>>::value>
1423 struct __is_convertible_helper
1425 typedef typename is_void<_To>::type type;
1428#pragma GCC diagnostic push
1429#pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
1430 template<
typename _From,
typename _To>
1431 class __is_convertible_helper<_From, _To, false>
1433 template<
typename _To1>
1434 static void __test_aux(_To1)
noexcept;
1436 template<
typename _From1,
typename _To1,
1441 template<
typename,
typename>
1446 typedef decltype(__test<_From, _To>(0)) type;
1448#pragma GCC diagnostic pop
1451 template<
typename _From,
typename _To>
1452 struct is_convertible
1453 :
public __is_convertible_helper<_From, _To>::type
1458 template<
typename _ToElementType,
typename _FromElementType>
1459 using __is_array_convertible
1460 = is_convertible<_FromElementType(*)[], _ToElementType(*)[]>;
1462#if __cplusplus >= 202002L
1463#define __cpp_lib_is_nothrow_convertible 201806L
1465#if __has_builtin(__is_nothrow_convertible)
1467 template<
typename _From,
typename _To>
1469 = __is_nothrow_convertible(_From, _To);
1472 template<
typename _From,
typename _To>
1474 :
public bool_constant<is_nothrow_convertible_v<_From, _To>>
1477 template<
typename _From,
typename _To,
1480 struct __is_nt_convertible_helper
1484#pragma GCC diagnostic push
1485#pragma GCC diagnostic ignored "-Wctor-dtor-privacy"
1486 template<
typename _From,
typename _To>
1487 class __is_nt_convertible_helper<_From, _To, false>
1489 template<
typename _To1>
1490 static void __test_aux(_To1)
noexcept;
1492 template<
typename _From1,
typename _To1>
1497 template<
typename,
typename>
1502 using type =
decltype(__test<_From, _To>(0));
1504#pragma GCC diagnostic pop
1507 template<
typename _From,
typename _To>
1509 :
public __is_nt_convertible_helper<_From, _To>::type
1513 template<
typename _From,
typename _To>
1515 = is_nothrow_convertible<_From, _To>::value;
1522 template<
typename _Tp>
1524 {
typedef _Tp type; };
1526 template<
typename _Tp>
1528 {
typedef _Tp
type; };
1531 template<
typename _Tp>
1533 {
typedef _Tp type; };
1535 template<
typename _Tp>
1537 {
typedef _Tp
type; };
1540#if __has_builtin(__remove_cv)
1541 template<
typename _Tp>
1543 {
using type = __remove_cv(_Tp); };
1545 template<
typename _Tp>
1547 {
using type = _Tp; };
1549 template<
typename _Tp>
1550 struct remove_cv<const _Tp>
1551 {
using type = _Tp; };
1553 template<
typename _Tp>
1555 {
using type = _Tp; };
1557 template<
typename _Tp>
1559 {
using type = _Tp; };
1563 template<
typename _Tp>
1565 {
using type = _Tp
const; };
1568 template<
typename _Tp>
1570 {
using type = _Tp
volatile; };
1573 template<
typename _Tp>
1575 {
using type = _Tp
const volatile; };
1577#if __cplusplus > 201103L
1579#define __cpp_lib_transformation_trait_aliases 201304L
1582 template<
typename _Tp>
1586 template<
typename _Tp>
1590 template<
typename _Tp>
1591 using remove_cv_t =
typename remove_cv<_Tp>::type;
1594 template<
typename _Tp>
1595 using add_const_t =
typename add_const<_Tp>::type;
1598 template<
typename _Tp>
1602 template<
typename _Tp>
1603 using add_cv_t =
typename add_cv<_Tp>::type;
1609#if __has_builtin(__remove_reference)
1610 template<
typename _Tp>
1612 {
using type = __remove_reference(_Tp); };
1614 template<
typename _Tp>
1616 {
using type = _Tp; };
1618 template<
typename _Tp>
1619 struct remove_reference<_Tp&>
1620 {
using type = _Tp; };
1622 template<
typename _Tp>
1624 {
using type = _Tp; };
1628 template<
typename _Tp>
1630 {
using type = __add_lval_ref_t<_Tp>; };
1633 template<
typename _Tp>
1635 {
using type = __add_rval_ref_t<_Tp>; };
1637#if __cplusplus > 201103L
1639 template<
typename _Tp>
1643 template<
typename _Tp>
1647 template<
typename _Tp>
1656 template<
typename _Unqualified,
bool _IsConst,
bool _IsVol>
1657 struct __cv_selector;
1659 template<
typename _Unqualified>
1660 struct __cv_selector<_Unqualified, false, false>
1661 {
typedef _Unqualified __type; };
1663 template<
typename _Unqualified>
1664 struct __cv_selector<_Unqualified, false, true>
1665 {
typedef volatile _Unqualified __type; };
1667 template<
typename _Unqualified>
1668 struct __cv_selector<_Unqualified, true, false>
1669 {
typedef const _Unqualified __type; };
1671 template<
typename _Unqualified>
1672 struct __cv_selector<_Unqualified, true, true>
1673 {
typedef const volatile _Unqualified __type; };
1675 template<
typename _Qualified,
typename _Unqualified,
1676 bool _IsConst = is_const<_Qualified>::value,
1677 bool _IsVol = is_volatile<_Qualified>::value>
1678 class __match_cv_qualifiers
1680 typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match;
1683 typedef typename __match::__type __type;
1687 template<
typename _Tp>
1688 struct __make_unsigned
1689 {
typedef _Tp __type; };
1692 struct __make_unsigned<char>
1693 {
typedef unsigned char __type; };
1696 struct __make_unsigned<signed char>
1697 {
typedef unsigned char __type; };
1700 struct __make_unsigned<short>
1701 {
typedef unsigned short __type; };
1704 struct __make_unsigned<int>
1705 {
typedef unsigned int __type; };
1708 struct __make_unsigned<long>
1709 {
typedef unsigned long __type; };
1712 struct __make_unsigned<long long>
1713 {
typedef unsigned long long __type; };
1715#if defined(__GLIBCXX_TYPE_INT_N_0)
1718 struct __make_unsigned<__GLIBCXX_TYPE_INT_N_0>
1719 {
typedef unsigned __GLIBCXX_TYPE_INT_N_0 __type; };
1721#if defined(__GLIBCXX_TYPE_INT_N_1)
1724 struct __make_unsigned<__GLIBCXX_TYPE_INT_N_1>
1725 {
typedef unsigned __GLIBCXX_TYPE_INT_N_1 __type; };
1727#if defined(__GLIBCXX_TYPE_INT_N_2)
1730 struct __make_unsigned<__GLIBCXX_TYPE_INT_N_2>
1731 {
typedef unsigned __GLIBCXX_TYPE_INT_N_2 __type; };
1733#if defined(__GLIBCXX_TYPE_INT_N_3)
1736 struct __make_unsigned<__GLIBCXX_TYPE_INT_N_3>
1737 {
typedef unsigned __GLIBCXX_TYPE_INT_N_3 __type; };
1741 template<
typename _Tp,
1743 bool _IsEnum = is_enum<_Tp>::value>
1744 class __make_unsigned_selector;
1746 template<
typename _Tp>
1747 class __make_unsigned_selector<_Tp, true, false>
1749 using __unsigned_type
1750 =
typename __make_unsigned<__remove_cv_t<_Tp>>::__type;
1754 =
typename __match_cv_qualifiers<_Tp, __unsigned_type>::__type;
1757 class __make_unsigned_selector_base
1760 template<
typename...>
struct _List { };
1762 template<
typename _Tp,
typename... _Up>
1763 struct _List<_Tp, _Up...> : _List<_Up...>
1764 {
static constexpr size_t __size =
sizeof(_Tp); };
1766 template<
size_t _Sz,
typename _Tp,
bool = (_Sz <= _Tp::__size)>
1769 template<
size_t _Sz,
typename _U
int,
typename... _UInts>
1770 struct __select<_Sz, _List<_Uint, _UInts...>,
true>
1771 {
using __type = _Uint; };
1773 template<
size_t _Sz,
typename _Uint,
typename... _UInts>
1774 struct __select<_Sz, _List<_Uint, _UInts...>, false>
1775 : __select<_Sz, _List<_UInts...>>
1780 template<
typename _Tp>
1781 class __make_unsigned_selector<_Tp, false, true>
1782 : __make_unsigned_selector_base
1785 using _UInts = _List<
unsigned char,
unsigned short,
unsigned int,
1786 unsigned long,
unsigned long long>;
1788 using __unsigned_type =
typename __select<
sizeof(_Tp), _UInts>::__type;
1792 =
typename __match_cv_qualifiers<_Tp, __unsigned_type>::__type;
1800 struct __make_unsigned<wchar_t>
1803 =
typename __make_unsigned_selector<wchar_t, false, true>::__type;
1806#ifdef _GLIBCXX_USE_CHAR8_T
1808 struct __make_unsigned<char8_t>
1811 =
typename __make_unsigned_selector<char8_t, false, true>::__type;
1816 struct __make_unsigned<char16_t>
1819 =
typename __make_unsigned_selector<char16_t, false, true>::__type;
1823 struct __make_unsigned<char32_t>
1826 =
typename __make_unsigned_selector<char32_t, false, true>::__type;
1834 template<
typename _Tp>
1836 {
typedef typename __make_unsigned_selector<_Tp>::__type type; };
1847 template<
typename _Tp>
1848 struct __make_signed
1849 {
typedef _Tp __type; };
1852 struct __make_signed<char>
1853 {
typedef signed char __type; };
1856 struct __make_signed<unsigned char>
1857 {
typedef signed char __type; };
1860 struct __make_signed<unsigned short>
1861 {
typedef signed short __type; };
1864 struct __make_signed<unsigned int>
1865 {
typedef signed int __type; };
1868 struct __make_signed<unsigned long>
1869 {
typedef signed long __type; };
1872 struct __make_signed<unsigned long long>
1873 {
typedef signed long long __type; };
1875#if defined(__GLIBCXX_TYPE_INT_N_0)
1878 struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_0>
1879 {
typedef __GLIBCXX_TYPE_INT_N_0 __type; };
1881#if defined(__GLIBCXX_TYPE_INT_N_1)
1884 struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_1>
1885 {
typedef __GLIBCXX_TYPE_INT_N_1 __type; };
1887#if defined(__GLIBCXX_TYPE_INT_N_2)
1890 struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_2>
1891 {
typedef __GLIBCXX_TYPE_INT_N_2 __type; };
1893#if defined(__GLIBCXX_TYPE_INT_N_3)
1896 struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_3>
1897 {
typedef __GLIBCXX_TYPE_INT_N_3 __type; };
1901 template<
typename _Tp,
1903 bool _IsEnum = is_enum<_Tp>::value>
1904 class __make_signed_selector;
1906 template<
typename _Tp>
1907 class __make_signed_selector<_Tp, true, false>
1910 =
typename __make_signed<__remove_cv_t<_Tp>>::__type;
1914 =
typename __match_cv_qualifiers<_Tp, __signed_type>::__type;
1918 template<
typename _Tp>
1919 class __make_signed_selector<_Tp, false, true>
1921 typedef typename __make_unsigned_selector<_Tp>::__type __unsigned_type;
1924 typedef typename __make_signed_selector<__unsigned_type>::__type __type;
1932 struct __make_signed<wchar_t>
1935 =
typename __make_signed_selector<wchar_t, false, true>::__type;
1938#if defined(_GLIBCXX_USE_CHAR8_T)
1940 struct __make_signed<char8_t>
1943 =
typename __make_signed_selector<char8_t, false, true>::__type;
1948 struct __make_signed<char16_t>
1951 =
typename __make_signed_selector<char16_t, false, true>::__type;
1955 struct __make_signed<char32_t>
1958 =
typename __make_signed_selector<char32_t, false, true>::__type;
1966 template<
typename _Tp>
1968 {
typedef typename __make_signed_selector<_Tp>::__type type; };
1974 template<>
struct make_signed<bool const volatile>;
1976#if __cplusplus > 201103L
1978 template<
typename _Tp>
1982 template<
typename _Tp>
1989 template<
typename _Tp>
1991 {
typedef _Tp type; };
1993 template<
typename _Tp, std::
size_t _Size>
1995 {
typedef _Tp
type; };
1997 template<
typename _Tp>
1998 struct remove_extent<_Tp[]>
1999 {
typedef _Tp type; };
2002 template<
typename _Tp>
2004 {
typedef _Tp type; };
2006 template<
typename _Tp, std::
size_t _Size>
2008 {
typedef typename remove_all_extents<_Tp>::type
type; };
2010 template<
typename _Tp>
2011 struct remove_all_extents<_Tp[]>
2012 {
typedef typename remove_all_extents<_Tp>::type type; };
2014#if __cplusplus > 201103L
2016 template<
typename _Tp>
2020 template<
typename _Tp>
2026 template<
typename _Tp,
typename>
2027 struct __remove_pointer_helper
2028 {
typedef _Tp
type; };
2030 template<
typename _Tp,
typename _Up>
2031 struct __remove_pointer_helper<_Tp, _Up*>
2032 {
typedef _Up type; };
2035 template<
typename _Tp>
2037 :
public __remove_pointer_helper<_Tp, __remove_cv_t<_Tp>>
2040 template<
typename _Tp,
typename =
void>
2041 struct __add_pointer_helper
2042 {
using type = _Tp; };
2044 template<
typename _Tp>
2045 struct __add_pointer_helper<_Tp, __void_t<_Tp*>>
2046 {
using type = _Tp*; };
2049 template<
typename _Tp>
2051 :
public __add_pointer_helper<_Tp>
2054 template<
typename _Tp>
2056 {
using type = _Tp*; };
2058 template<
typename _Tp>