File indexing completed on 2026-05-03 08:13:34
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LIBCPP___CXX03___MATH_TRAITS_H
0010 #define _LIBCPP___CXX03___MATH_TRAITS_H
0011
0012 #include <__cxx03/__config>
0013 #include <__cxx03/__type_traits/enable_if.h>
0014 #include <__cxx03/__type_traits/is_arithmetic.h>
0015 #include <__cxx03/__type_traits/is_floating_point.h>
0016 #include <__cxx03/__type_traits/is_integral.h>
0017 #include <__cxx03/__type_traits/is_signed.h>
0018 #include <__cxx03/__type_traits/promote.h>
0019 #include <__cxx03/limits>
0020
0021 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0022 # pragma GCC system_header
0023 #endif
0024
0025 _LIBCPP_BEGIN_NAMESPACE_STD
0026
0027 namespace __math {
0028
0029
0030
0031 template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>
0032 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT {
0033 return __builtin_signbit(__x);
0034 }
0035
0036 template <class _A1, __enable_if_t<is_integral<_A1>::value && is_signed<_A1>::value, int> = 0>
0037 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT {
0038 return __x < 0;
0039 }
0040
0041 template <class _A1, __enable_if_t<is_integral<_A1>::value && !is_signed<_A1>::value, int> = 0>
0042 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1) _NOEXCEPT {
0043 return false;
0044 }
0045
0046
0047
0048 template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && numeric_limits<_A1>::has_infinity, int> = 0>
0049 _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1 __x) _NOEXCEPT {
0050 return __builtin_isfinite((typename __promote<_A1>::type)__x);
0051 }
0052
0053 template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && !numeric_limits<_A1>::has_infinity, int> = 0>
0054 _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1) _NOEXCEPT {
0055 return true;
0056 }
0057
0058 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(float __x) _NOEXCEPT {
0059 return __builtin_isfinite(__x);
0060 }
0061
0062 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(double __x) _NOEXCEPT {
0063 return __builtin_isfinite(__x);
0064 }
0065
0066 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(long double __x) _NOEXCEPT {
0067 return __builtin_isfinite(__x);
0068 }
0069
0070
0071
0072 template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && numeric_limits<_A1>::has_infinity, int> = 0>
0073 _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(_A1 __x) _NOEXCEPT {
0074 return __builtin_isinf((typename __promote<_A1>::type)__x);
0075 }
0076
0077 template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && !numeric_limits<_A1>::has_infinity, int> = 0>
0078 _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(_A1) _NOEXCEPT {
0079 return false;
0080 }
0081
0082 #ifdef _LIBCPP_PREFERRED_OVERLOAD
0083 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(float __x) _NOEXCEPT {
0084 return __builtin_isinf(__x);
0085 }
0086
0087 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool
0088 isinf(double __x) _NOEXCEPT {
0089 return __builtin_isinf(__x);
0090 }
0091
0092 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(long double __x) _NOEXCEPT {
0093 return __builtin_isinf(__x);
0094 }
0095 #endif
0096
0097
0098
0099 template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>
0100 _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1 __x) _NOEXCEPT {
0101 return __builtin_isnan(__x);
0102 }
0103
0104 template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
0105 _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1) _NOEXCEPT {
0106 return false;
0107 }
0108
0109 #ifdef _LIBCPP_PREFERRED_OVERLOAD
0110 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(float __x) _NOEXCEPT {
0111 return __builtin_isnan(__x);
0112 }
0113
0114 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool
0115 isnan(double __x) _NOEXCEPT {
0116 return __builtin_isnan(__x);
0117 }
0118
0119 _LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(long double __x) _NOEXCEPT {
0120 return __builtin_isnan(__x);
0121 }
0122 #endif
0123
0124
0125
0126 template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>
0127 _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT {
0128 return __builtin_isnormal(__x);
0129 }
0130
0131 template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
0132 _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT {
0133 return __x != 0;
0134 }
0135
0136
0137
0138 template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
0139 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isgreater(_A1 __x, _A2 __y) _NOEXCEPT {
0140 using type = typename __promote<_A1, _A2>::type;
0141 return __builtin_isgreater((type)__x, (type)__y);
0142 }
0143
0144
0145
0146 template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
0147 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isgreaterequal(_A1 __x, _A2 __y) _NOEXCEPT {
0148 using type = typename __promote<_A1, _A2>::type;
0149 return __builtin_isgreaterequal((type)__x, (type)__y);
0150 }
0151
0152
0153
0154 template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
0155 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isless(_A1 __x, _A2 __y) _NOEXCEPT {
0156 using type = typename __promote<_A1, _A2>::type;
0157 return __builtin_isless((type)__x, (type)__y);
0158 }
0159
0160
0161
0162 template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
0163 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool islessequal(_A1 __x, _A2 __y) _NOEXCEPT {
0164 using type = typename __promote<_A1, _A2>::type;
0165 return __builtin_islessequal((type)__x, (type)__y);
0166 }
0167
0168
0169
0170 template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
0171 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool islessgreater(_A1 __x, _A2 __y) _NOEXCEPT {
0172 using type = typename __promote<_A1, _A2>::type;
0173 return __builtin_islessgreater((type)__x, (type)__y);
0174 }
0175
0176
0177
0178 template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
0179 _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isunordered(_A1 __x, _A2 __y) _NOEXCEPT {
0180 using type = typename __promote<_A1, _A2>::type;
0181 return __builtin_isunordered((type)__x, (type)__y);
0182 }
0183
0184 }
0185
0186 _LIBCPP_END_NAMESPACE_STD
0187
0188 #endif