xref: /openbsd-src/gnu/llvm/libcxx/include/limits (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_LIMITS
1146035553Spatrick#define _LIBCPP_LIMITS
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    limits synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatricktemplate<class T>
2046035553Spatrickclass numeric_limits
2146035553Spatrick{
2246035553Spatrickpublic:
2346035553Spatrick    static constexpr bool is_specialized = false;
2446035553Spatrick    static constexpr T min() noexcept;
2546035553Spatrick    static constexpr T max() noexcept;
2646035553Spatrick    static constexpr T lowest() noexcept;
2746035553Spatrick
2846035553Spatrick    static constexpr int  digits = 0;
2946035553Spatrick    static constexpr int  digits10 = 0;
3046035553Spatrick    static constexpr int  max_digits10 = 0;
3146035553Spatrick    static constexpr bool is_signed = false;
3246035553Spatrick    static constexpr bool is_integer = false;
3346035553Spatrick    static constexpr bool is_exact = false;
3446035553Spatrick    static constexpr int  radix = 0;
3546035553Spatrick    static constexpr T epsilon() noexcept;
3646035553Spatrick    static constexpr T round_error() noexcept;
3746035553Spatrick
3846035553Spatrick    static constexpr int  min_exponent = 0;
3946035553Spatrick    static constexpr int  min_exponent10 = 0;
4046035553Spatrick    static constexpr int  max_exponent = 0;
4146035553Spatrick    static constexpr int  max_exponent10 = 0;
4246035553Spatrick
4346035553Spatrick    static constexpr bool has_infinity = false;
4446035553Spatrick    static constexpr bool has_quiet_NaN = false;
4546035553Spatrick    static constexpr bool has_signaling_NaN = false;
4646035553Spatrick    static constexpr float_denorm_style has_denorm = denorm_absent;
4746035553Spatrick    static constexpr bool has_denorm_loss = false;
4846035553Spatrick    static constexpr T infinity() noexcept;
4946035553Spatrick    static constexpr T quiet_NaN() noexcept;
5046035553Spatrick    static constexpr T signaling_NaN() noexcept;
5146035553Spatrick    static constexpr T denorm_min() noexcept;
5246035553Spatrick
5346035553Spatrick    static constexpr bool is_iec559 = false;
5446035553Spatrick    static constexpr bool is_bounded = false;
5546035553Spatrick    static constexpr bool is_modulo = false;
5646035553Spatrick
5746035553Spatrick    static constexpr bool traps = false;
5846035553Spatrick    static constexpr bool tinyness_before = false;
5946035553Spatrick    static constexpr float_round_style round_style = round_toward_zero;
6046035553Spatrick};
6146035553Spatrick
6246035553Spatrickenum float_round_style
6346035553Spatrick{
6446035553Spatrick    round_indeterminate       = -1,
6546035553Spatrick    round_toward_zero         =  0,
6646035553Spatrick    round_to_nearest          =  1,
6746035553Spatrick    round_toward_infinity     =  2,
6846035553Spatrick    round_toward_neg_infinity =  3
6946035553Spatrick};
7046035553Spatrick
7146035553Spatrickenum float_denorm_style
7246035553Spatrick{
7346035553Spatrick    denorm_indeterminate = -1,
7446035553Spatrick    denorm_absent = 0,
7546035553Spatrick    denorm_present = 1
7646035553Spatrick};
7746035553Spatrick
7846035553Spatricktemplate<> class numeric_limits<cv bool>;
7946035553Spatrick
8046035553Spatricktemplate<> class numeric_limits<cv char>;
8146035553Spatricktemplate<> class numeric_limits<cv signed char>;
8246035553Spatricktemplate<> class numeric_limits<cv unsigned char>;
8346035553Spatricktemplate<> class numeric_limits<cv wchar_t>;
8446035553Spatricktemplate<> class numeric_limits<cv char8_t>; // C++20
8546035553Spatricktemplate<> class numeric_limits<cv char16_t>;
8646035553Spatricktemplate<> class numeric_limits<cv char32_t>;
8746035553Spatrick
8846035553Spatricktemplate<> class numeric_limits<cv short>;
8946035553Spatricktemplate<> class numeric_limits<cv int>;
9046035553Spatricktemplate<> class numeric_limits<cv long>;
9146035553Spatricktemplate<> class numeric_limits<cv long long>;
9246035553Spatricktemplate<> class numeric_limits<cv unsigned short>;
9346035553Spatricktemplate<> class numeric_limits<cv unsigned int>;
9446035553Spatricktemplate<> class numeric_limits<cv unsigned long>;
9546035553Spatricktemplate<> class numeric_limits<cv unsigned long long>;
9646035553Spatrick
9746035553Spatricktemplate<> class numeric_limits<cv float>;
9846035553Spatricktemplate<> class numeric_limits<cv double>;
9946035553Spatricktemplate<> class numeric_limits<cv long double>;
10046035553Spatrick
10146035553Spatrick}  // std
10246035553Spatrick
10346035553Spatrick*/
104*4bdff4beSrobert
105*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
10646035553Spatrick#include <__config>
107*4bdff4beSrobert#include <__type_traits/is_arithmetic.h>
108*4bdff4beSrobert#include <__type_traits/is_signed.h>
109*4bdff4beSrobert#include <__type_traits/remove_cv.h>
11046035553Spatrick
11146035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
11246035553Spatrick#  pragma GCC system_header
11346035553Spatrick#endif
11446035553Spatrick
11546035553Spatrick_LIBCPP_PUSH_MACROS
11646035553Spatrick#include <__undef_macros>
11746035553Spatrick#include <version>
11846035553Spatrick
11946035553Spatrick
12046035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
12146035553Spatrick
12246035553Spatrickenum float_round_style
12346035553Spatrick{
12446035553Spatrick    round_indeterminate       = -1,
12546035553Spatrick    round_toward_zero         =  0,
12646035553Spatrick    round_to_nearest          =  1,
12746035553Spatrick    round_toward_infinity     =  2,
12846035553Spatrick    round_toward_neg_infinity =  3
12946035553Spatrick};
13046035553Spatrick
13146035553Spatrickenum float_denorm_style
13246035553Spatrick{
13346035553Spatrick    denorm_indeterminate = -1,
13446035553Spatrick    denorm_absent = 0,
13546035553Spatrick    denorm_present = 1
13646035553Spatrick};
13746035553Spatrick
13846035553Spatricktemplate <class _Tp, bool = is_arithmetic<_Tp>::value>
13946035553Spatrickclass __libcpp_numeric_limits
14046035553Spatrick{
14146035553Spatrickprotected:
14246035553Spatrick    typedef _Tp type;
14346035553Spatrick
14446035553Spatrick    static _LIBCPP_CONSTEXPR const  bool is_specialized = false;
14546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return type();}
14646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return type();}
14746035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return type();}
14846035553Spatrick
14946035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = 0;
15046035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = 0;
15146035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = 0;
15246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = false;
15346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = false;
15446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = false;
15546035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = 0;
15646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type();}
15746035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type();}
15846035553Spatrick
15946035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = 0;
16046035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = 0;
16146035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = 0;
16246035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = 0;
16346035553Spatrick
16446035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = false;
16546035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
16646035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
16746035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
16846035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
16946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type();}
17046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type();}
17146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type();}
17246035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type();}
17346035553Spatrick
17446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
17546035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = false;
17646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
17746035553Spatrick
17846035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = false;
17946035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
18046035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
18146035553Spatrick};
18246035553Spatrick
18346035553Spatricktemplate <class _Tp, int __digits, bool _IsSigned>
18446035553Spatrickstruct __libcpp_compute_min
18546035553Spatrick{
18646035553Spatrick    static _LIBCPP_CONSTEXPR const _Tp value = _Tp(_Tp(1) << __digits);
18746035553Spatrick};
18846035553Spatrick
18946035553Spatricktemplate <class _Tp, int __digits>
19046035553Spatrickstruct __libcpp_compute_min<_Tp, __digits, false>
19146035553Spatrick{
19246035553Spatrick    static _LIBCPP_CONSTEXPR const _Tp value = _Tp(0);
19346035553Spatrick};
19446035553Spatrick
19546035553Spatricktemplate <class _Tp>
19646035553Spatrickclass __libcpp_numeric_limits<_Tp, true>
19746035553Spatrick{
19846035553Spatrickprotected:
19946035553Spatrick    typedef _Tp type;
20046035553Spatrick
20146035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
20246035553Spatrick
20346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = type(-1) < type(0);
20446035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = static_cast<int>(sizeof(type) * __CHAR_BIT__ - is_signed);
20546035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = digits * 3 / 10;
20646035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = 0;
20746035553Spatrick    static _LIBCPP_CONSTEXPR const type __min = __libcpp_compute_min<type, digits, is_signed>::value;
20846035553Spatrick    static _LIBCPP_CONSTEXPR const type __max = is_signed ? type(type(~0) ^ __min) : type(~0);
20946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;}
21046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;}
21146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();}
21246035553Spatrick
21346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = true;
21446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = true;
21546035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = 2;
21646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);}
21746035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);}
21846035553Spatrick
21946035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = 0;
22046035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = 0;
22146035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = 0;
22246035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = 0;
22346035553Spatrick
22446035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = false;
22546035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
22646035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
22746035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
22846035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
22946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);}
23046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);}
23146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);}
23246035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);}
23346035553Spatrick
23446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
23546035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
23646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = !_VSTD::is_signed<_Tp>::value;
23746035553Spatrick
23846035553Spatrick#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__) || \
23946035553Spatrick    defined(__wasm__)
24046035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = true;
24146035553Spatrick#else
24246035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = false;
24346035553Spatrick#endif
24446035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
24546035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
24646035553Spatrick};
24746035553Spatrick
24846035553Spatricktemplate <>
24946035553Spatrickclass __libcpp_numeric_limits<bool, true>
25046035553Spatrick{
25146035553Spatrickprotected:
25246035553Spatrick    typedef bool type;
25346035553Spatrick
25446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
25546035553Spatrick
25646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = false;
25746035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = 1;
25846035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = 0;
25946035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = 0;
26046035553Spatrick    static _LIBCPP_CONSTEXPR const type __min = false;
26146035553Spatrick    static _LIBCPP_CONSTEXPR const type __max = true;
26246035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;}
26346035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;}
26446035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();}
26546035553Spatrick
26646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = true;
26746035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = true;
26846035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = 2;
26946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);}
27046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);}
27146035553Spatrick
27246035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = 0;
27346035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = 0;
27446035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = 0;
27546035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = 0;
27646035553Spatrick
27746035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = false;
27846035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
27946035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
28046035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
28146035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
28246035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);}
28346035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);}
28446035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);}
28546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);}
28646035553Spatrick
28746035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
28846035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
28946035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
29046035553Spatrick
29146035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = false;
29246035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
29346035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
29446035553Spatrick};
29546035553Spatrick
29646035553Spatricktemplate <>
29746035553Spatrickclass __libcpp_numeric_limits<float, true>
29846035553Spatrick{
29946035553Spatrickprotected:
30046035553Spatrick    typedef float type;
30146035553Spatrick
30246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
30346035553Spatrick
30446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = true;
30546035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = __FLT_MANT_DIG__;
30646035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = __FLT_DIG__;
30746035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = 2+(digits * 30103l)/100000l;
30846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __FLT_MIN__;}
30946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __FLT_MAX__;}
31046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
31146035553Spatrick
31246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = false;
31346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = false;
31446035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = __FLT_RADIX__;
31546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __FLT_EPSILON__;}
31646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5F;}
31746035553Spatrick
31846035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = __FLT_MIN_EXP__;
31946035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __FLT_MIN_10_EXP__;
32046035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = __FLT_MAX_EXP__;
32146035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __FLT_MAX_10_EXP__;
32246035553Spatrick
32346035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = true;
32446035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
32546035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
32646035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
32746035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
32846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_valf();}
32946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanf("");}
33046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansf("");}
33146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __FLT_DENORM_MIN__;}
33246035553Spatrick
33346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
33446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
33546035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
33646035553Spatrick
33746035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = false;
338*4bdff4beSrobert#if (defined(__arm__) || defined(__aarch64__))
339*4bdff4beSrobert    static _LIBCPP_CONSTEXPR const bool tinyness_before = true;
340*4bdff4beSrobert#else
34146035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
342*4bdff4beSrobert#endif
34346035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
34446035553Spatrick};
34546035553Spatrick
34646035553Spatricktemplate <>
34746035553Spatrickclass __libcpp_numeric_limits<double, true>
34846035553Spatrick{
34946035553Spatrickprotected:
35046035553Spatrick    typedef double type;
35146035553Spatrick
35246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
35346035553Spatrick
35446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = true;
35546035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = __DBL_MANT_DIG__;
35646035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = __DBL_DIG__;
35746035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = 2+(digits * 30103l)/100000l;
35846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __DBL_MIN__;}
35946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __DBL_MAX__;}
36046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
36146035553Spatrick
36246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = false;
36346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = false;
36446035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = __FLT_RADIX__;
36546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __DBL_EPSILON__;}
36646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5;}
36746035553Spatrick
36846035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = __DBL_MIN_EXP__;
36946035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __DBL_MIN_10_EXP__;
37046035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = __DBL_MAX_EXP__;
37146035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __DBL_MAX_10_EXP__;
37246035553Spatrick
37346035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = true;
37446035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
37546035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
37646035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
37746035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
37846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_val();}
37946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nan("");}
38046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nans("");}
38146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __DBL_DENORM_MIN__;}
38246035553Spatrick
38346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
38446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
38546035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
38646035553Spatrick
38746035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = false;
388*4bdff4beSrobert#if (defined(__arm__) || defined(__aarch64__))
389*4bdff4beSrobert    static _LIBCPP_CONSTEXPR const bool tinyness_before = true;
390*4bdff4beSrobert#else
39146035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
392*4bdff4beSrobert#endif
39346035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
39446035553Spatrick};
39546035553Spatrick
39646035553Spatricktemplate <>
39746035553Spatrickclass __libcpp_numeric_limits<long double, true>
39846035553Spatrick{
39946035553Spatrickprotected:
40046035553Spatrick    typedef long double type;
40146035553Spatrick
40246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
40346035553Spatrick
40446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = true;
40546035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = __LDBL_MANT_DIG__;
40646035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = __LDBL_DIG__;
40746035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = 2+(digits * 30103l)/100000l;
40846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __LDBL_MIN__;}
40946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __LDBL_MAX__;}
41046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
41146035553Spatrick
41246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = false;
41346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = false;
41446035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = __FLT_RADIX__;
41546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __LDBL_EPSILON__;}
41646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5L;}
41746035553Spatrick
41846035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = __LDBL_MIN_EXP__;
41946035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __LDBL_MIN_10_EXP__;
42046035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = __LDBL_MAX_EXP__;
42146035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __LDBL_MAX_10_EXP__;
42246035553Spatrick
42346035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = true;
42446035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
42546035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
42646035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
42746035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
42846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_vall();}
42946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanl("");}
43046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansl("");}
43146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __LDBL_DENORM_MIN__;}
43246035553Spatrick
433*4bdff4beSrobert#if defined(__powerpc__) && defined(__LONG_DOUBLE_IBM128__)
43446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
43546035553Spatrick#else
43646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
43746035553Spatrick#endif
43846035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
43946035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
44046035553Spatrick
44146035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = false;
442*4bdff4beSrobert#if (defined(__arm__) || defined(__aarch64__))
443*4bdff4beSrobert    static _LIBCPP_CONSTEXPR const bool tinyness_before = true;
444*4bdff4beSrobert#else
44546035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
446*4bdff4beSrobert#endif
44746035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
44846035553Spatrick};
44946035553Spatrick
45046035553Spatricktemplate <class _Tp>
45146035553Spatrickclass _LIBCPP_TEMPLATE_VIS numeric_limits
452*4bdff4beSrobert    : private __libcpp_numeric_limits<__remove_cv_t<_Tp> >
45346035553Spatrick{
454*4bdff4beSrobert    typedef __libcpp_numeric_limits<__remove_cv_t<_Tp> > __base;
45546035553Spatrick    typedef typename __base::type type;
45646035553Spatrickpublic:
45746035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
45846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
45946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
46046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
46146035553Spatrick
46246035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = __base::digits;
46346035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = __base::digits10;
46446035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = __base::max_digits10;
46546035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
46646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
46746035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
46846035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = __base::radix;
46946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
47046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
47146035553Spatrick
47246035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = __base::min_exponent;
47346035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __base::min_exponent10;
47446035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = __base::max_exponent;
47546035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __base::max_exponent10;
47646035553Spatrick
47746035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
47846035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
47946035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
48046035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
48146035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
48246035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
48346035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
48446035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
48546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
48646035553Spatrick
48746035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
48846035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
48946035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
49046035553Spatrick
49146035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
49246035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
49346035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
49446035553Spatrick};
49546035553Spatrick
49646035553Spatricktemplate <class _Tp>
49746035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_specialized;
49846035553Spatricktemplate <class _Tp>
49946035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits;
50046035553Spatricktemplate <class _Tp>
50146035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits10;
50246035553Spatricktemplate <class _Tp>
50346035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_digits10;
50446035553Spatricktemplate <class _Tp>
50546035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_signed;
50646035553Spatricktemplate <class _Tp>
50746035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_integer;
50846035553Spatricktemplate <class _Tp>
50946035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_exact;
51046035553Spatricktemplate <class _Tp>
51146035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::radix;
51246035553Spatricktemplate <class _Tp>
51346035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent;
51446035553Spatricktemplate <class _Tp>
51546035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent10;
51646035553Spatricktemplate <class _Tp>
51746035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent;
51846035553Spatricktemplate <class _Tp>
51946035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent10;
52046035553Spatricktemplate <class _Tp>
52146035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_infinity;
52246035553Spatricktemplate <class _Tp>
52346035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_quiet_NaN;
52446035553Spatricktemplate <class _Tp>
52546035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_signaling_NaN;
52646035553Spatricktemplate <class _Tp>
52746035553Spatrick    _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<_Tp>::has_denorm;
52846035553Spatricktemplate <class _Tp>
52946035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_denorm_loss;
53046035553Spatricktemplate <class _Tp>
53146035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_iec559;
53246035553Spatricktemplate <class _Tp>
53346035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_bounded;
53446035553Spatricktemplate <class _Tp>
53546035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_modulo;
53646035553Spatricktemplate <class _Tp>
53746035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::traps;
53846035553Spatricktemplate <class _Tp>
53946035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::tinyness_before;
54046035553Spatricktemplate <class _Tp>
54146035553Spatrick    _LIBCPP_CONSTEXPR const float_round_style numeric_limits<_Tp>::round_style;
54246035553Spatrick
54346035553Spatricktemplate <class _Tp>
54446035553Spatrickclass _LIBCPP_TEMPLATE_VIS numeric_limits<const _Tp>
54546035553Spatrick    : private numeric_limits<_Tp>
54646035553Spatrick{
54746035553Spatrick    typedef numeric_limits<_Tp> __base;
54846035553Spatrick    typedef _Tp type;
54946035553Spatrickpublic:
55046035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
55146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
55246035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
55346035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
55446035553Spatrick
55546035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = __base::digits;
55646035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = __base::digits10;
55746035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = __base::max_digits10;
55846035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
55946035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
56046035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
56146035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = __base::radix;
56246035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
56346035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
56446035553Spatrick
56546035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = __base::min_exponent;
56646035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __base::min_exponent10;
56746035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = __base::max_exponent;
56846035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __base::max_exponent10;
56946035553Spatrick
57046035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
57146035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
57246035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
57346035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
57446035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
57546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
57646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
57746035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
57846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
57946035553Spatrick
58046035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
58146035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
58246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
58346035553Spatrick
58446035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
58546035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
58646035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
58746035553Spatrick};
58846035553Spatrick
58946035553Spatricktemplate <class _Tp>
59046035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_specialized;
59146035553Spatricktemplate <class _Tp>
59246035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits;
59346035553Spatricktemplate <class _Tp>
59446035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits10;
59546035553Spatricktemplate <class _Tp>
59646035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_digits10;
59746035553Spatricktemplate <class _Tp>
59846035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_signed;
59946035553Spatricktemplate <class _Tp>
60046035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_integer;
60146035553Spatricktemplate <class _Tp>
60246035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_exact;
60346035553Spatricktemplate <class _Tp>
60446035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::radix;
60546035553Spatricktemplate <class _Tp>
60646035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent;
60746035553Spatricktemplate <class _Tp>
60846035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent10;
60946035553Spatricktemplate <class _Tp>
61046035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent;
61146035553Spatricktemplate <class _Tp>
61246035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent10;
61346035553Spatricktemplate <class _Tp>
61446035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_infinity;
61546035553Spatricktemplate <class _Tp>
61646035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_quiet_NaN;
61746035553Spatricktemplate <class _Tp>
61846035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_signaling_NaN;
61946035553Spatricktemplate <class _Tp>
62046035553Spatrick    _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const _Tp>::has_denorm;
62146035553Spatricktemplate <class _Tp>
62246035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_denorm_loss;
62346035553Spatricktemplate <class _Tp>
62446035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_iec559;
62546035553Spatricktemplate <class _Tp>
62646035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_bounded;
62746035553Spatricktemplate <class _Tp>
62846035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_modulo;
62946035553Spatricktemplate <class _Tp>
63046035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::traps;
63146035553Spatricktemplate <class _Tp>
63246035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::tinyness_before;
63346035553Spatricktemplate <class _Tp>
63446035553Spatrick    _LIBCPP_CONSTEXPR const float_round_style numeric_limits<const _Tp>::round_style;
63546035553Spatrick
63646035553Spatricktemplate <class _Tp>
63746035553Spatrickclass _LIBCPP_TEMPLATE_VIS numeric_limits<volatile _Tp>
63846035553Spatrick    : private numeric_limits<_Tp>
63946035553Spatrick{
64046035553Spatrick    typedef numeric_limits<_Tp> __base;
64146035553Spatrick    typedef _Tp type;
64246035553Spatrickpublic:
64346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
64446035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
64546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
64646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
64746035553Spatrick
64846035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = __base::digits;
64946035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = __base::digits10;
65046035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = __base::max_digits10;
65146035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
65246035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
65346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
65446035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = __base::radix;
65546035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
65646035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
65746035553Spatrick
65846035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = __base::min_exponent;
65946035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __base::min_exponent10;
66046035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = __base::max_exponent;
66146035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __base::max_exponent10;
66246035553Spatrick
66346035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
66446035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
66546035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
66646035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
66746035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
66846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
66946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
67046035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
67146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
67246035553Spatrick
67346035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
67446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
67546035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
67646035553Spatrick
67746035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
67846035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
67946035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
68046035553Spatrick};
68146035553Spatrick
68246035553Spatricktemplate <class _Tp>
68346035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_specialized;
68446035553Spatricktemplate <class _Tp>
68546035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits;
68646035553Spatricktemplate <class _Tp>
68746035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits10;
68846035553Spatricktemplate <class _Tp>
68946035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_digits10;
69046035553Spatricktemplate <class _Tp>
69146035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_signed;
69246035553Spatricktemplate <class _Tp>
69346035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_integer;
69446035553Spatricktemplate <class _Tp>
69546035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_exact;
69646035553Spatricktemplate <class _Tp>
69746035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::radix;
69846035553Spatricktemplate <class _Tp>
69946035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent;
70046035553Spatricktemplate <class _Tp>
70146035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent10;
70246035553Spatricktemplate <class _Tp>
70346035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent;
70446035553Spatricktemplate <class _Tp>
70546035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent10;
70646035553Spatricktemplate <class _Tp>
70746035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_infinity;
70846035553Spatricktemplate <class _Tp>
70946035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_quiet_NaN;
71046035553Spatricktemplate <class _Tp>
71146035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_signaling_NaN;
71246035553Spatricktemplate <class _Tp>
71346035553Spatrick    _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<volatile _Tp>::has_denorm;
71446035553Spatricktemplate <class _Tp>
71546035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_denorm_loss;
71646035553Spatricktemplate <class _Tp>
71746035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_iec559;
71846035553Spatricktemplate <class _Tp>
71946035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_bounded;
72046035553Spatricktemplate <class _Tp>
72146035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_modulo;
72246035553Spatricktemplate <class _Tp>
72346035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::traps;
72446035553Spatricktemplate <class _Tp>
72546035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::tinyness_before;
72646035553Spatricktemplate <class _Tp>
72746035553Spatrick    _LIBCPP_CONSTEXPR const float_round_style numeric_limits<volatile _Tp>::round_style;
72846035553Spatrick
72946035553Spatricktemplate <class _Tp>
73046035553Spatrickclass _LIBCPP_TEMPLATE_VIS numeric_limits<const volatile _Tp>
73146035553Spatrick    : private numeric_limits<_Tp>
73246035553Spatrick{
73346035553Spatrick    typedef numeric_limits<_Tp> __base;
73446035553Spatrick    typedef _Tp type;
73546035553Spatrickpublic:
73646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
73746035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
73846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
73946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
74046035553Spatrick
74146035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits = __base::digits;
74246035553Spatrick    static _LIBCPP_CONSTEXPR const int  digits10 = __base::digits10;
74346035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_digits10 = __base::max_digits10;
74446035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
74546035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
74646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
74746035553Spatrick    static _LIBCPP_CONSTEXPR const int  radix = __base::radix;
74846035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
74946035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
75046035553Spatrick
75146035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent = __base::min_exponent;
75246035553Spatrick    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __base::min_exponent10;
75346035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent = __base::max_exponent;
75446035553Spatrick    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __base::max_exponent10;
75546035553Spatrick
75646035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
75746035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
75846035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
75946035553Spatrick    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
76046035553Spatrick    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
76146035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
76246035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
76346035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
76446035553Spatrick    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
76546035553Spatrick
76646035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
76746035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
76846035553Spatrick    static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
76946035553Spatrick
77046035553Spatrick    static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
77146035553Spatrick    static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
77246035553Spatrick    static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
77346035553Spatrick};
77446035553Spatrick
77546035553Spatricktemplate <class _Tp>
77646035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_specialized;
77746035553Spatricktemplate <class _Tp>
77846035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits;
77946035553Spatricktemplate <class _Tp>
78046035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits10;
78146035553Spatricktemplate <class _Tp>
78246035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_digits10;
78346035553Spatricktemplate <class _Tp>
78446035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_signed;
78546035553Spatricktemplate <class _Tp>
78646035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_integer;
78746035553Spatricktemplate <class _Tp>
78846035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_exact;
78946035553Spatricktemplate <class _Tp>
79046035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::radix;
79146035553Spatricktemplate <class _Tp>
79246035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent;
79346035553Spatricktemplate <class _Tp>
79446035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent10;
79546035553Spatricktemplate <class _Tp>
79646035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent;
79746035553Spatricktemplate <class _Tp>
79846035553Spatrick    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent10;
79946035553Spatricktemplate <class _Tp>
80046035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_infinity;
80146035553Spatricktemplate <class _Tp>
80246035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_quiet_NaN;
80346035553Spatricktemplate <class _Tp>
80446035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_signaling_NaN;
80546035553Spatricktemplate <class _Tp>
80646035553Spatrick    _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const volatile _Tp>::has_denorm;
80746035553Spatricktemplate <class _Tp>
80846035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_denorm_loss;
80946035553Spatricktemplate <class _Tp>
81046035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_iec559;
81146035553Spatricktemplate <class _Tp>
81246035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_bounded;
81346035553Spatricktemplate <class _Tp>
81446035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_modulo;
81546035553Spatricktemplate <class _Tp>
81646035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::traps;
81746035553Spatricktemplate <class _Tp>
81846035553Spatrick    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::tinyness_before;
81946035553Spatricktemplate <class _Tp>
82046035553Spatrick    _LIBCPP_CONSTEXPR const float_round_style numeric_limits<const volatile _Tp>::round_style;
82146035553Spatrick
82246035553Spatrick_LIBCPP_END_NAMESPACE_STD
82346035553Spatrick
82446035553Spatrick_LIBCPP_POP_MACROS
82546035553Spatrick
826*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
827*4bdff4beSrobert#  include <type_traits>
828*4bdff4beSrobert#endif
829*4bdff4beSrobert
83046035553Spatrick#endif // _LIBCPP_LIMITS
831