Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:13:34

0001 //===----------------------------------------------------------------------===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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 // signbit
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 // isfinite
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 // isinf
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 // isnan
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 // isnormal
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 // isgreater
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 // isgreaterequal
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 // isless
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 // islessequal
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 // islessgreater
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 // isunordered
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 } // namespace __math
0185 
0186 _LIBCPP_END_NAMESPACE_STD
0187 
0188 #endif // _LIBCPP___CXX03___MATH_TRAITS_H