Path: blob/main/contrib/llvm-project/libcxx/include/__cxx03/__math/traits.h
213799 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___CXX03___MATH_TRAITS_H9#define _LIBCPP___CXX03___MATH_TRAITS_H1011#include <__cxx03/__config>12#include <__cxx03/__type_traits/enable_if.h>13#include <__cxx03/__type_traits/is_arithmetic.h>14#include <__cxx03/__type_traits/is_floating_point.h>15#include <__cxx03/__type_traits/is_integral.h>16#include <__cxx03/__type_traits/is_signed.h>17#include <__cxx03/__type_traits/promote.h>18#include <__cxx03/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_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_HIDE_FROM_ABI bool isfinite(_A1) _NOEXCEPT {54return true;55}5657_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isfinite(float __x) _NOEXCEPT { return __builtin_isfinite(__x); }5859_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isfinite(double __x) _NOEXCEPT { return __builtin_isfinite(__x); }6061_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isfinite(long double __x) _NOEXCEPT {62return __builtin_isfinite(__x);63}6465// isinf6667template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && numeric_limits<_A1>::has_infinity, int> = 0>68_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool isinf(_A1 __x) _NOEXCEPT {69return __builtin_isinf((typename __promote<_A1>::type)__x);70}7172template <class _A1, __enable_if_t<is_arithmetic<_A1>::value && !numeric_limits<_A1>::has_infinity, int> = 0>73_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool isinf(_A1) _NOEXCEPT {74return false;75}7677#ifdef _LIBCPP_PREFERRED_OVERLOAD78_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isinf(float __x) _NOEXCEPT { return __builtin_isinf(__x); }7980_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool isinf(double __x) _NOEXCEPT {81return __builtin_isinf(__x);82}8384_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isinf(long double __x) _NOEXCEPT { return __builtin_isinf(__x); }85#endif8687// isnan8889template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>90_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool isnan(_A1 __x) _NOEXCEPT {91return __builtin_isnan(__x);92}9394template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>95_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool isnan(_A1) _NOEXCEPT {96return false;97}9899#ifdef _LIBCPP_PREFERRED_OVERLOAD100_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isnan(float __x) _NOEXCEPT { return __builtin_isnan(__x); }101102_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_PREFERRED_OVERLOAD bool isnan(double __x) _NOEXCEPT {103return __builtin_isnan(__x);104}105106_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isnan(long double __x) _NOEXCEPT { return __builtin_isnan(__x); }107#endif108109// isnormal110111template <class _A1, __enable_if_t<is_floating_point<_A1>::value, int> = 0>112_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT {113return __builtin_isnormal(__x);114}115116template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>117_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool isnormal(_A1 __x) _NOEXCEPT {118return __x != 0;119}120121// isgreater122123template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>124_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isgreater(_A1 __x, _A2 __y) _NOEXCEPT {125using type = typename __promote<_A1, _A2>::type;126return __builtin_isgreater((type)__x, (type)__y);127}128129// isgreaterequal130131template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>132_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isgreaterequal(_A1 __x, _A2 __y) _NOEXCEPT {133using type = typename __promote<_A1, _A2>::type;134return __builtin_isgreaterequal((type)__x, (type)__y);135}136137// isless138139template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>140_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isless(_A1 __x, _A2 __y) _NOEXCEPT {141using type = typename __promote<_A1, _A2>::type;142return __builtin_isless((type)__x, (type)__y);143}144145// islessequal146147template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>148_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool islessequal(_A1 __x, _A2 __y) _NOEXCEPT {149using type = typename __promote<_A1, _A2>::type;150return __builtin_islessequal((type)__x, (type)__y);151}152153// islessgreater154155template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>156_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool islessgreater(_A1 __x, _A2 __y) _NOEXCEPT {157using type = typename __promote<_A1, _A2>::type;158return __builtin_islessgreater((type)__x, (type)__y);159}160161// isunordered162163template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>164_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI bool isunordered(_A1 __x, _A2 __y) _NOEXCEPT {165using type = typename __promote<_A1, _A2>::type;166return __builtin_isunordered((type)__x, (type)__y);167}168169} // namespace __math170171_LIBCPP_END_NAMESPACE_STD172173#endif // _LIBCPP___CXX03___MATH_TRAITS_H174175176