Path: blob/main/contrib/llvm-project/libcxx/include/__math/traits.h
35233 views
//===----------------------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef _LIBCPP___MATH_TRAITS_H9#define _LIBCPP___MATH_TRAITS_H1011#include <__config>12#include <__type_traits/enable_if.h>13#include <__type_traits/is_arithmetic.h>14#include <__type_traits/is_floating_point.h>15#include <__type_traits/is_integral.h>16#include <__type_traits/is_signed.h>17#include <__type_traits/promote.h>18#include <limits>1920#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)21# pragma GCC system_header22#endif2324_LIBCPP_BEGIN_NAMESPACE_STD2526namespace __math {2728// signbit2930template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>31_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT {32return __builtin_signbit(__x);33}3435template <class _A1, __enable_if_t<is_integral<_A1>::value && is_signed<_A1>::value, int> = 0>36_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1 __x) _NOEXCEPT {37return __x < 0;38}3940template <class _A1, __enable_if_t<is_integral<_A1>::value && !is_signed<_A1>::value, int> = 0>41_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool signbit(_A1) _NOEXCEPT {42return false;43}4445// isfinite4647template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && numeric_limits<_A1>::has_infinity, int> = 0>48_LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1 __x) _NOEXCEPT {49return __builtin_isfinite((typename __promote<_A1>::type)__x);50}5152template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && !numeric_limits<_A1>::has_infinity, int> = 0>53_LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(_A1) _NOEXCEPT {54return true;55}5657_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(float __x) _NOEXCEPT {58return __builtin_isfinite(__x);59}6061_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(double __x) _NOEXCEPT {62return __builtin_isfinite(__x);63}6465_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isfinite(long double __x) _NOEXCEPT {66return __builtin_isfinite(__x);67}6869// isinf7071template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && numeric_limits<_A1>::has_infinity, int> = 0>72_LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(_A1 __x) _NOEXCEPT {73return __builtin_isinf((typename __promote<_A1>::type)__x);74}7576template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && !numeric_limits<_A1>::has_infinity, int> = 0>77_LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(_A1) _NOEXCEPT {78return false;79}8081#ifdef _LIBCPP_PREFERRED_OVERLOAD82_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(float __x) _NOEXCEPT {83return __builtin_isinf(__x);84}8586_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool87isinf(double __x) _NOEXCEPT {88return __builtin_isinf(__x);89}9091_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(long double __x) _NOEXCEPT {92return __builtin_isinf(__x);93}94#endif9596// isnan9798template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>99_LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1 __x) _NOEXCEPT {100return __builtin_isnan(__x);101}102103template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>104_LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(_A1) _NOEXCEPT {105return false;106}107108#ifdef _LIBCPP_PREFERRED_OVERLOAD109_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(float __x) _NOEXCEPT {110return __builtin_isnan(__x);111}112113_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool114isnan(double __x) _NOEXCEPT {115return __builtin_isnan(__x);116}117118_LIBCPP_NODISCARD inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(long double __x) _NOEXCEPT {119return __builtin_isnan(__x);120}121#endif122123// isnormal124125template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>126_LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT {127return __builtin_isnormal(__x);128}129130template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>131_LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT {132return __x != 0;133}134135// isgreater136137template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>138_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isgreater(_A1 __x, _A2 __y) _NOEXCEPT {139using type = typename __promote<_A1, _A2>::type;140return __builtin_isgreater((type)__x, (type)__y);141}142143// isgreaterequal144145template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>146_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isgreaterequal(_A1 __x, _A2 __y) _NOEXCEPT {147using type = typename __promote<_A1, _A2>::type;148return __builtin_isgreaterequal((type)__x, (type)__y);149}150151// isless152153template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>154_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isless(_A1 __x, _A2 __y) _NOEXCEPT {155using type = typename __promote<_A1, _A2>::type;156return __builtin_isless((type)__x, (type)__y);157}158159// islessequal160161template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>162_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool islessequal(_A1 __x, _A2 __y) _NOEXCEPT {163using type = typename __promote<_A1, _A2>::type;164return __builtin_islessequal((type)__x, (type)__y);165}166167// islessgreater168169template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>170_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool islessgreater(_A1 __x, _A2 __y) _NOEXCEPT {171using type = typename __promote<_A1, _A2>::type;172return __builtin_islessgreater((type)__x, (type)__y);173}174175// isunordered176177template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>178_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isunordered(_A1 __x, _A2 __y) _NOEXCEPT {179using type = typename __promote<_A1, _A2>::type;180return __builtin_isunordered((type)__x, (type)__y);181}182183} // namespace __math184185_LIBCPP_END_NAMESPACE_STD186187#endif // _LIBCPP___MATH_TRAITS_H188189190