xref: /freebsd/contrib/llvm-project/libcxx/include/limits (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_LIMITS
110b57cec5SDimitry Andric#define _LIBCPP_LIMITS
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    limits synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std
170b57cec5SDimitry Andric{
180b57cec5SDimitry Andric
190b57cec5SDimitry Andrictemplate<class T>
200b57cec5SDimitry Andricclass numeric_limits
210b57cec5SDimitry Andric{
220b57cec5SDimitry Andricpublic:
230b57cec5SDimitry Andric    static constexpr bool is_specialized = false;
240b57cec5SDimitry Andric    static constexpr T min() noexcept;
250b57cec5SDimitry Andric    static constexpr T max() noexcept;
260b57cec5SDimitry Andric    static constexpr T lowest() noexcept;
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric    static constexpr int  digits = 0;
290b57cec5SDimitry Andric    static constexpr int  digits10 = 0;
300b57cec5SDimitry Andric    static constexpr int  max_digits10 = 0;
310b57cec5SDimitry Andric    static constexpr bool is_signed = false;
320b57cec5SDimitry Andric    static constexpr bool is_integer = false;
330b57cec5SDimitry Andric    static constexpr bool is_exact = false;
340b57cec5SDimitry Andric    static constexpr int  radix = 0;
350b57cec5SDimitry Andric    static constexpr T epsilon() noexcept;
360b57cec5SDimitry Andric    static constexpr T round_error() noexcept;
370b57cec5SDimitry Andric
380b57cec5SDimitry Andric    static constexpr int  min_exponent = 0;
390b57cec5SDimitry Andric    static constexpr int  min_exponent10 = 0;
400b57cec5SDimitry Andric    static constexpr int  max_exponent = 0;
410b57cec5SDimitry Andric    static constexpr int  max_exponent10 = 0;
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric    static constexpr bool has_infinity = false;
440b57cec5SDimitry Andric    static constexpr bool has_quiet_NaN = false;
450b57cec5SDimitry Andric    static constexpr bool has_signaling_NaN = false;
460b57cec5SDimitry Andric    static constexpr float_denorm_style has_denorm = denorm_absent;
470b57cec5SDimitry Andric    static constexpr bool has_denorm_loss = false;
480b57cec5SDimitry Andric    static constexpr T infinity() noexcept;
490b57cec5SDimitry Andric    static constexpr T quiet_NaN() noexcept;
500b57cec5SDimitry Andric    static constexpr T signaling_NaN() noexcept;
510b57cec5SDimitry Andric    static constexpr T denorm_min() noexcept;
520b57cec5SDimitry Andric
530b57cec5SDimitry Andric    static constexpr bool is_iec559 = false;
540b57cec5SDimitry Andric    static constexpr bool is_bounded = false;
550b57cec5SDimitry Andric    static constexpr bool is_modulo = false;
560b57cec5SDimitry Andric
570b57cec5SDimitry Andric    static constexpr bool traps = false;
580b57cec5SDimitry Andric    static constexpr bool tinyness_before = false;
590b57cec5SDimitry Andric    static constexpr float_round_style round_style = round_toward_zero;
600b57cec5SDimitry Andric};
610b57cec5SDimitry Andric
620b57cec5SDimitry Andricenum float_round_style
630b57cec5SDimitry Andric{
640b57cec5SDimitry Andric    round_indeterminate       = -1,
650b57cec5SDimitry Andric    round_toward_zero         =  0,
660b57cec5SDimitry Andric    round_to_nearest          =  1,
670b57cec5SDimitry Andric    round_toward_infinity     =  2,
680b57cec5SDimitry Andric    round_toward_neg_infinity =  3
690b57cec5SDimitry Andric};
700b57cec5SDimitry Andric
710b57cec5SDimitry Andricenum float_denorm_style
720b57cec5SDimitry Andric{
730b57cec5SDimitry Andric    denorm_indeterminate = -1,
740b57cec5SDimitry Andric    denorm_absent = 0,
750b57cec5SDimitry Andric    denorm_present = 1
760b57cec5SDimitry Andric};
770b57cec5SDimitry Andric
780b57cec5SDimitry Andrictemplate<> class numeric_limits<cv bool>;
790b57cec5SDimitry Andric
800b57cec5SDimitry Andrictemplate<> class numeric_limits<cv char>;
810b57cec5SDimitry Andrictemplate<> class numeric_limits<cv signed char>;
820b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned char>;
830b57cec5SDimitry Andrictemplate<> class numeric_limits<cv wchar_t>;
840b57cec5SDimitry Andrictemplate<> class numeric_limits<cv char8_t>; // C++20
850b57cec5SDimitry Andrictemplate<> class numeric_limits<cv char16_t>;
860b57cec5SDimitry Andrictemplate<> class numeric_limits<cv char32_t>;
870b57cec5SDimitry Andric
880b57cec5SDimitry Andrictemplate<> class numeric_limits<cv short>;
890b57cec5SDimitry Andrictemplate<> class numeric_limits<cv int>;
900b57cec5SDimitry Andrictemplate<> class numeric_limits<cv long>;
910b57cec5SDimitry Andrictemplate<> class numeric_limits<cv long long>;
920b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned short>;
930b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned int>;
940b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned long>;
950b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned long long>;
960b57cec5SDimitry Andric
970b57cec5SDimitry Andrictemplate<> class numeric_limits<cv float>;
980b57cec5SDimitry Andrictemplate<> class numeric_limits<cv double>;
990b57cec5SDimitry Andrictemplate<> class numeric_limits<cv long double>;
1000b57cec5SDimitry Andric
1010b57cec5SDimitry Andric}  // std
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andric*/
10481ad6265SDimitry Andric
10581ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
1060b57cec5SDimitry Andric#include <__config>
107*bdd1243dSDimitry Andric#include <__type_traits/is_arithmetic.h>
108*bdd1243dSDimitry Andric#include <__type_traits/is_signed.h>
109*bdd1243dSDimitry Andric#include <__type_traits/remove_cv.h>
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1120b57cec5SDimitry Andric#  pragma GCC system_header
1130b57cec5SDimitry Andric#endif
1140b57cec5SDimitry Andric
1150b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS
1160b57cec5SDimitry Andric#include <__undef_macros>
1170b57cec5SDimitry Andric#include <version>
1180b57cec5SDimitry Andric
1190b57cec5SDimitry Andric
1200b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
1210b57cec5SDimitry Andric
1220b57cec5SDimitry Andricenum float_round_style
1230b57cec5SDimitry Andric{
1240b57cec5SDimitry Andric    round_indeterminate       = -1,
1250b57cec5SDimitry Andric    round_toward_zero         =  0,
1260b57cec5SDimitry Andric    round_to_nearest          =  1,
1270b57cec5SDimitry Andric    round_toward_infinity     =  2,
1280b57cec5SDimitry Andric    round_toward_neg_infinity =  3
1290b57cec5SDimitry Andric};
1300b57cec5SDimitry Andric
1310b57cec5SDimitry Andricenum float_denorm_style
1320b57cec5SDimitry Andric{
1330b57cec5SDimitry Andric    denorm_indeterminate = -1,
1340b57cec5SDimitry Andric    denorm_absent = 0,
1350b57cec5SDimitry Andric    denorm_present = 1
1360b57cec5SDimitry Andric};
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andrictemplate <class _Tp, bool = is_arithmetic<_Tp>::value>
1390b57cec5SDimitry Andricclass __libcpp_numeric_limits
1400b57cec5SDimitry Andric{
1410b57cec5SDimitry Andricprotected:
1420b57cec5SDimitry Andric    typedef _Tp type;
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const  bool is_specialized = false;
1450b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return type();}
1460b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return type();}
1470b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return type();}
1480b57cec5SDimitry Andric
1490b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = 0;
1500b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = 0;
1510b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = 0;
1520b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = false;
1530b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = false;
1540b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = false;
1550b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = 0;
1560b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type();}
1570b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type();}
1580b57cec5SDimitry Andric
1590b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = 0;
1600b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = 0;
1610b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = 0;
1620b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = 0;
1630b57cec5SDimitry Andric
1640b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = false;
1650b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
1660b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
1670b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
1680b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
1690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type();}
1700b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type();}
1710b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type();}
1720b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type();}
1730b57cec5SDimitry Andric
1740b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
1750b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = false;
1760b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
1770b57cec5SDimitry Andric
1780b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = false;
1790b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
1800b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
1810b57cec5SDimitry Andric};
1820b57cec5SDimitry Andric
1830b57cec5SDimitry Andrictemplate <class _Tp, int __digits, bool _IsSigned>
1840b57cec5SDimitry Andricstruct __libcpp_compute_min
1850b57cec5SDimitry Andric{
1860b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const _Tp value = _Tp(_Tp(1) << __digits);
1870b57cec5SDimitry Andric};
1880b57cec5SDimitry Andric
1890b57cec5SDimitry Andrictemplate <class _Tp, int __digits>
1900b57cec5SDimitry Andricstruct __libcpp_compute_min<_Tp, __digits, false>
1910b57cec5SDimitry Andric{
1920b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const _Tp value = _Tp(0);
1930b57cec5SDimitry Andric};
1940b57cec5SDimitry Andric
1950b57cec5SDimitry Andrictemplate <class _Tp>
1960b57cec5SDimitry Andricclass __libcpp_numeric_limits<_Tp, true>
1970b57cec5SDimitry Andric{
1980b57cec5SDimitry Andricprotected:
1990b57cec5SDimitry Andric    typedef _Tp type;
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
2020b57cec5SDimitry Andric
2030b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = type(-1) < type(0);
2040b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = static_cast<int>(sizeof(type) * __CHAR_BIT__ - is_signed);
2050b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = digits * 3 / 10;
2060b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = 0;
2070b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const type __min = __libcpp_compute_min<type, digits, is_signed>::value;
2080b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const type __max = is_signed ? type(type(~0) ^ __min) : type(~0);
2090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;}
2100b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;}
2110b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();}
2120b57cec5SDimitry Andric
2130b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = true;
2140b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = true;
2150b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = 2;
2160b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);}
2170b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);}
2180b57cec5SDimitry Andric
2190b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = 0;
2200b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = 0;
2210b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = 0;
2220b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = 0;
2230b57cec5SDimitry Andric
2240b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = false;
2250b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
2260b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
2270b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
2280b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
2290b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);}
2300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);}
2310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);}
2320b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);}
2330b57cec5SDimitry Andric
2340b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
2350b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
2360b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = !_VSTD::is_signed<_Tp>::value;
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andric#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__) || \
2390b57cec5SDimitry Andric    defined(__wasm__)
2400b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = true;
2410b57cec5SDimitry Andric#else
2420b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = false;
2430b57cec5SDimitry Andric#endif
2440b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
2450b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
2460b57cec5SDimitry Andric};
2470b57cec5SDimitry Andric
2480b57cec5SDimitry Andrictemplate <>
2490b57cec5SDimitry Andricclass __libcpp_numeric_limits<bool, true>
2500b57cec5SDimitry Andric{
2510b57cec5SDimitry Andricprotected:
2520b57cec5SDimitry Andric    typedef bool type;
2530b57cec5SDimitry Andric
2540b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
2550b57cec5SDimitry Andric
2560b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = false;
2570b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = 1;
2580b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = 0;
2590b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = 0;
2600b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const type __min = false;
2610b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const type __max = true;
2620b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;}
2630b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;}
2640b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();}
2650b57cec5SDimitry Andric
2660b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = true;
2670b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = true;
2680b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = 2;
2690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);}
2700b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);}
2710b57cec5SDimitry Andric
2720b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = 0;
2730b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = 0;
2740b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = 0;
2750b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = 0;
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = false;
2780b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;
2790b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;
2800b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;
2810b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
2820b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);}
2830b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);}
2840b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);}
2850b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);}
2860b57cec5SDimitry Andric
2870b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
2880b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
2890b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
2900b57cec5SDimitry Andric
2910b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = false;
2920b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
2930b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
2940b57cec5SDimitry Andric};
2950b57cec5SDimitry Andric
2960b57cec5SDimitry Andrictemplate <>
2970b57cec5SDimitry Andricclass __libcpp_numeric_limits<float, true>
2980b57cec5SDimitry Andric{
2990b57cec5SDimitry Andricprotected:
3000b57cec5SDimitry Andric    typedef float type;
3010b57cec5SDimitry Andric
3020b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
3030b57cec5SDimitry Andric
3040b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = true;
3050b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = __FLT_MANT_DIG__;
3060b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = __FLT_DIG__;
3070b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = 2+(digits * 30103l)/100000l;
3080b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __FLT_MIN__;}
3090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __FLT_MAX__;}
3100b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
3110b57cec5SDimitry Andric
3120b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = false;
3130b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = false;
3140b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = __FLT_RADIX__;
3150b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __FLT_EPSILON__;}
3160b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5F;}
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = __FLT_MIN_EXP__;
3190b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __FLT_MIN_10_EXP__;
3200b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = __FLT_MAX_EXP__;
3210b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __FLT_MAX_10_EXP__;
3220b57cec5SDimitry Andric
3230b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = true;
3240b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
3250b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
3260b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
3270b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
3280b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_valf();}
3290b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanf("");}
3300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansf("");}
3310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __FLT_DENORM_MIN__;}
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
3340b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
3350b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
3360b57cec5SDimitry Andric
3370b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = false;
33881ad6265SDimitry Andric#if (defined(__arm__) || defined(__aarch64__))
33981ad6265SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = true;
34081ad6265SDimitry Andric#else
3410b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
34281ad6265SDimitry Andric#endif
3430b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
3440b57cec5SDimitry Andric};
3450b57cec5SDimitry Andric
3460b57cec5SDimitry Andrictemplate <>
3470b57cec5SDimitry Andricclass __libcpp_numeric_limits<double, true>
3480b57cec5SDimitry Andric{
3490b57cec5SDimitry Andricprotected:
3500b57cec5SDimitry Andric    typedef double type;
3510b57cec5SDimitry Andric
3520b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
3530b57cec5SDimitry Andric
3540b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = true;
3550b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = __DBL_MANT_DIG__;
3560b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = __DBL_DIG__;
3570b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = 2+(digits * 30103l)/100000l;
3580b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __DBL_MIN__;}
3590b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __DBL_MAX__;}
3600b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = false;
3630b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = false;
3640b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = __FLT_RADIX__;
3650b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __DBL_EPSILON__;}
3660b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5;}
3670b57cec5SDimitry Andric
3680b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = __DBL_MIN_EXP__;
3690b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __DBL_MIN_10_EXP__;
3700b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = __DBL_MAX_EXP__;
3710b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __DBL_MAX_10_EXP__;
3720b57cec5SDimitry Andric
3730b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = true;
3740b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
3750b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
3760b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
3770b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
3780b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_val();}
3790b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nan("");}
3800b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nans("");}
3810b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __DBL_DENORM_MIN__;}
3820b57cec5SDimitry Andric
3830b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
3840b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
3850b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = false;
38881ad6265SDimitry Andric#if (defined(__arm__) || defined(__aarch64__))
38981ad6265SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = true;
39081ad6265SDimitry Andric#else
3910b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
39281ad6265SDimitry Andric#endif
3930b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
3940b57cec5SDimitry Andric};
3950b57cec5SDimitry Andric
3960b57cec5SDimitry Andrictemplate <>
3970b57cec5SDimitry Andricclass __libcpp_numeric_limits<long double, true>
3980b57cec5SDimitry Andric{
3990b57cec5SDimitry Andricprotected:
4000b57cec5SDimitry Andric    typedef long double type;
4010b57cec5SDimitry Andric
4020b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = true;
4030b57cec5SDimitry Andric
4040b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = true;
4050b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = __LDBL_MANT_DIG__;
4060b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = __LDBL_DIG__;
4070b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = 2+(digits * 30103l)/100000l;
4080b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __LDBL_MIN__;}
4090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __LDBL_MAX__;}
4100b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
4110b57cec5SDimitry Andric
4120b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = false;
4130b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = false;
4140b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = __FLT_RADIX__;
4150b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __LDBL_EPSILON__;}
4160b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5L;}
4170b57cec5SDimitry Andric
4180b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = __LDBL_MIN_EXP__;
4190b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __LDBL_MIN_10_EXP__;
4200b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = __LDBL_MAX_EXP__;
4210b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __LDBL_MAX_10_EXP__;
4220b57cec5SDimitry Andric
4230b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = true;
4240b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;
4250b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;
4260b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;
4270b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;
4280b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_vall();}
4290b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanl("");}
4300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansl("");}
4310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __LDBL_DENORM_MIN__;}
4320b57cec5SDimitry Andric
433*bdd1243dSDimitry Andric#if defined(__powerpc__) && defined(__LONG_DOUBLE_IBM128__)
4340b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = false;
4350b57cec5SDimitry Andric#else
4360b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = true;
4370b57cec5SDimitry Andric#endif
4380b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = true;
4390b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = false;
4400b57cec5SDimitry Andric
4410b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = false;
44281ad6265SDimitry Andric#if (defined(__arm__) || defined(__aarch64__))
44381ad6265SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = true;
44481ad6265SDimitry Andric#else
4450b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = false;
44681ad6265SDimitry Andric#endif
4470b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;
4480b57cec5SDimitry Andric};
4490b57cec5SDimitry Andric
4500b57cec5SDimitry Andrictemplate <class _Tp>
4510b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS numeric_limits
452*bdd1243dSDimitry Andric    : private __libcpp_numeric_limits<__remove_cv_t<_Tp> >
4530b57cec5SDimitry Andric{
454*bdd1243dSDimitry Andric    typedef __libcpp_numeric_limits<__remove_cv_t<_Tp> > __base;
4550b57cec5SDimitry Andric    typedef typename __base::type type;
4560b57cec5SDimitry Andricpublic:
4570b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
4580b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
4590b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
4600b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
4610b57cec5SDimitry Andric
4620b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = __base::digits;
4630b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = __base::digits10;
4640b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = __base::max_digits10;
4650b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
4660b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
4670b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
4680b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = __base::radix;
4690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
4700b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
4710b57cec5SDimitry Andric
4720b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = __base::min_exponent;
4730b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __base::min_exponent10;
4740b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = __base::max_exponent;
4750b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __base::max_exponent10;
4760b57cec5SDimitry Andric
4770b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
4780b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
4790b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
4800b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
4810b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
4820b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
4830b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
4840b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
4850b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
4860b57cec5SDimitry Andric
4870b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
4880b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
4890b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
4900b57cec5SDimitry Andric
4910b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
4920b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
4930b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
4940b57cec5SDimitry Andric};
4950b57cec5SDimitry Andric
4960b57cec5SDimitry Andrictemplate <class _Tp>
4970b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_specialized;
4980b57cec5SDimitry Andrictemplate <class _Tp>
4990b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits;
5000b57cec5SDimitry Andrictemplate <class _Tp>
5010b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits10;
5020b57cec5SDimitry Andrictemplate <class _Tp>
5030b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_digits10;
5040b57cec5SDimitry Andrictemplate <class _Tp>
5050b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_signed;
5060b57cec5SDimitry Andrictemplate <class _Tp>
5070b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_integer;
5080b57cec5SDimitry Andrictemplate <class _Tp>
5090b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_exact;
5100b57cec5SDimitry Andrictemplate <class _Tp>
5110b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::radix;
5120b57cec5SDimitry Andrictemplate <class _Tp>
5130b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent;
5140b57cec5SDimitry Andrictemplate <class _Tp>
5150b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent10;
5160b57cec5SDimitry Andrictemplate <class _Tp>
5170b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent;
5180b57cec5SDimitry Andrictemplate <class _Tp>
5190b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent10;
5200b57cec5SDimitry Andrictemplate <class _Tp>
5210b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_infinity;
5220b57cec5SDimitry Andrictemplate <class _Tp>
5230b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_quiet_NaN;
5240b57cec5SDimitry Andrictemplate <class _Tp>
5250b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_signaling_NaN;
5260b57cec5SDimitry Andrictemplate <class _Tp>
5270b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<_Tp>::has_denorm;
5280b57cec5SDimitry Andrictemplate <class _Tp>
5290b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_denorm_loss;
5300b57cec5SDimitry Andrictemplate <class _Tp>
5310b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_iec559;
5320b57cec5SDimitry Andrictemplate <class _Tp>
5330b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_bounded;
5340b57cec5SDimitry Andrictemplate <class _Tp>
5350b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_modulo;
5360b57cec5SDimitry Andrictemplate <class _Tp>
5370b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::traps;
5380b57cec5SDimitry Andrictemplate <class _Tp>
5390b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::tinyness_before;
5400b57cec5SDimitry Andrictemplate <class _Tp>
5410b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const float_round_style numeric_limits<_Tp>::round_style;
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andrictemplate <class _Tp>
5440b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS numeric_limits<const _Tp>
5450b57cec5SDimitry Andric    : private numeric_limits<_Tp>
5460b57cec5SDimitry Andric{
5470b57cec5SDimitry Andric    typedef numeric_limits<_Tp> __base;
5480b57cec5SDimitry Andric    typedef _Tp type;
5490b57cec5SDimitry Andricpublic:
5500b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
5510b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
5520b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
5530b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
5540b57cec5SDimitry Andric
5550b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = __base::digits;
5560b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = __base::digits10;
5570b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = __base::max_digits10;
5580b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
5590b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
5600b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
5610b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = __base::radix;
5620b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
5630b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
5640b57cec5SDimitry Andric
5650b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = __base::min_exponent;
5660b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __base::min_exponent10;
5670b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = __base::max_exponent;
5680b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __base::max_exponent10;
5690b57cec5SDimitry Andric
5700b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
5710b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
5720b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
5730b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
5740b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
5750b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
5760b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
5770b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
5780b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
5790b57cec5SDimitry Andric
5800b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
5810b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
5820b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
5830b57cec5SDimitry Andric
5840b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
5850b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
5860b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
5870b57cec5SDimitry Andric};
5880b57cec5SDimitry Andric
5890b57cec5SDimitry Andrictemplate <class _Tp>
5900b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_specialized;
5910b57cec5SDimitry Andrictemplate <class _Tp>
5920b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits;
5930b57cec5SDimitry Andrictemplate <class _Tp>
5940b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits10;
5950b57cec5SDimitry Andrictemplate <class _Tp>
5960b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_digits10;
5970b57cec5SDimitry Andrictemplate <class _Tp>
5980b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_signed;
5990b57cec5SDimitry Andrictemplate <class _Tp>
6000b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_integer;
6010b57cec5SDimitry Andrictemplate <class _Tp>
6020b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_exact;
6030b57cec5SDimitry Andrictemplate <class _Tp>
6040b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::radix;
6050b57cec5SDimitry Andrictemplate <class _Tp>
6060b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent;
6070b57cec5SDimitry Andrictemplate <class _Tp>
6080b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent10;
6090b57cec5SDimitry Andrictemplate <class _Tp>
6100b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent;
6110b57cec5SDimitry Andrictemplate <class _Tp>
6120b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent10;
6130b57cec5SDimitry Andrictemplate <class _Tp>
6140b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_infinity;
6150b57cec5SDimitry Andrictemplate <class _Tp>
6160b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_quiet_NaN;
6170b57cec5SDimitry Andrictemplate <class _Tp>
6180b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_signaling_NaN;
6190b57cec5SDimitry Andrictemplate <class _Tp>
6200b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const _Tp>::has_denorm;
6210b57cec5SDimitry Andrictemplate <class _Tp>
6220b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_denorm_loss;
6230b57cec5SDimitry Andrictemplate <class _Tp>
6240b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_iec559;
6250b57cec5SDimitry Andrictemplate <class _Tp>
6260b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_bounded;
6270b57cec5SDimitry Andrictemplate <class _Tp>
6280b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_modulo;
6290b57cec5SDimitry Andrictemplate <class _Tp>
6300b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::traps;
6310b57cec5SDimitry Andrictemplate <class _Tp>
6320b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::tinyness_before;
6330b57cec5SDimitry Andrictemplate <class _Tp>
6340b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const float_round_style numeric_limits<const _Tp>::round_style;
6350b57cec5SDimitry Andric
6360b57cec5SDimitry Andrictemplate <class _Tp>
6370b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS numeric_limits<volatile _Tp>
6380b57cec5SDimitry Andric    : private numeric_limits<_Tp>
6390b57cec5SDimitry Andric{
6400b57cec5SDimitry Andric    typedef numeric_limits<_Tp> __base;
6410b57cec5SDimitry Andric    typedef _Tp type;
6420b57cec5SDimitry Andricpublic:
6430b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
6440b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
6450b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
6460b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
6470b57cec5SDimitry Andric
6480b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = __base::digits;
6490b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = __base::digits10;
6500b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = __base::max_digits10;
6510b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
6520b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
6530b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
6540b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = __base::radix;
6550b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
6560b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
6570b57cec5SDimitry Andric
6580b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = __base::min_exponent;
6590b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __base::min_exponent10;
6600b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = __base::max_exponent;
6610b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __base::max_exponent10;
6620b57cec5SDimitry Andric
6630b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
6640b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
6650b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
6660b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
6670b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
6680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
6690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
6700b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
6710b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
6720b57cec5SDimitry Andric
6730b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
6740b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
6750b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
6760b57cec5SDimitry Andric
6770b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
6780b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
6790b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
6800b57cec5SDimitry Andric};
6810b57cec5SDimitry Andric
6820b57cec5SDimitry Andrictemplate <class _Tp>
6830b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_specialized;
6840b57cec5SDimitry Andrictemplate <class _Tp>
6850b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits;
6860b57cec5SDimitry Andrictemplate <class _Tp>
6870b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits10;
6880b57cec5SDimitry Andrictemplate <class _Tp>
6890b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_digits10;
6900b57cec5SDimitry Andrictemplate <class _Tp>
6910b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_signed;
6920b57cec5SDimitry Andrictemplate <class _Tp>
6930b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_integer;
6940b57cec5SDimitry Andrictemplate <class _Tp>
6950b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_exact;
6960b57cec5SDimitry Andrictemplate <class _Tp>
6970b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::radix;
6980b57cec5SDimitry Andrictemplate <class _Tp>
6990b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent;
7000b57cec5SDimitry Andrictemplate <class _Tp>
7010b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent10;
7020b57cec5SDimitry Andrictemplate <class _Tp>
7030b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent;
7040b57cec5SDimitry Andrictemplate <class _Tp>
7050b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent10;
7060b57cec5SDimitry Andrictemplate <class _Tp>
7070b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_infinity;
7080b57cec5SDimitry Andrictemplate <class _Tp>
7090b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_quiet_NaN;
7100b57cec5SDimitry Andrictemplate <class _Tp>
7110b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_signaling_NaN;
7120b57cec5SDimitry Andrictemplate <class _Tp>
7130b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<volatile _Tp>::has_denorm;
7140b57cec5SDimitry Andrictemplate <class _Tp>
7150b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_denorm_loss;
7160b57cec5SDimitry Andrictemplate <class _Tp>
7170b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_iec559;
7180b57cec5SDimitry Andrictemplate <class _Tp>
7190b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_bounded;
7200b57cec5SDimitry Andrictemplate <class _Tp>
7210b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_modulo;
7220b57cec5SDimitry Andrictemplate <class _Tp>
7230b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::traps;
7240b57cec5SDimitry Andrictemplate <class _Tp>
7250b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::tinyness_before;
7260b57cec5SDimitry Andrictemplate <class _Tp>
7270b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const float_round_style numeric_limits<volatile _Tp>::round_style;
7280b57cec5SDimitry Andric
7290b57cec5SDimitry Andrictemplate <class _Tp>
7300b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS numeric_limits<const volatile _Tp>
7310b57cec5SDimitry Andric    : private numeric_limits<_Tp>
7320b57cec5SDimitry Andric{
7330b57cec5SDimitry Andric    typedef numeric_limits<_Tp> __base;
7340b57cec5SDimitry Andric    typedef _Tp type;
7350b57cec5SDimitry Andricpublic:
7360b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;
7370b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();}
7380b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();}
7390b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();}
7400b57cec5SDimitry Andric
7410b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits = __base::digits;
7420b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  digits10 = __base::digits10;
7430b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_digits10 = __base::max_digits10;
7440b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;
7450b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;
7460b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;
7470b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  radix = __base::radix;
7480b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();}
7490b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();}
7500b57cec5SDimitry Andric
7510b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent = __base::min_exponent;
7520b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  min_exponent10 = __base::min_exponent10;
7530b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent = __base::max_exponent;
7540b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const int  max_exponent10 = __base::max_exponent10;
7550b57cec5SDimitry Andric
7560b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;
7570b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;
7580b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;
7590b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;
7600b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;
7610b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();}
7620b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();}
7630b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();}
7640b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();}
7650b57cec5SDimitry Andric
7660b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;
7670b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;
7680b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;
7690b57cec5SDimitry Andric
7700b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool traps = __base::traps;
7710b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;
7720b57cec5SDimitry Andric    static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;
7730b57cec5SDimitry Andric};
7740b57cec5SDimitry Andric
7750b57cec5SDimitry Andrictemplate <class _Tp>
7760b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_specialized;
7770b57cec5SDimitry Andrictemplate <class _Tp>
7780b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits;
7790b57cec5SDimitry Andrictemplate <class _Tp>
7800b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits10;
7810b57cec5SDimitry Andrictemplate <class _Tp>
7820b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_digits10;
7830b57cec5SDimitry Andrictemplate <class _Tp>
7840b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_signed;
7850b57cec5SDimitry Andrictemplate <class _Tp>
7860b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_integer;
7870b57cec5SDimitry Andrictemplate <class _Tp>
7880b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_exact;
7890b57cec5SDimitry Andrictemplate <class _Tp>
7900b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::radix;
7910b57cec5SDimitry Andrictemplate <class _Tp>
7920b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent;
7930b57cec5SDimitry Andrictemplate <class _Tp>
7940b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent10;
7950b57cec5SDimitry Andrictemplate <class _Tp>
7960b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent;
7970b57cec5SDimitry Andrictemplate <class _Tp>
7980b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent10;
7990b57cec5SDimitry Andrictemplate <class _Tp>
8000b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_infinity;
8010b57cec5SDimitry Andrictemplate <class _Tp>
8020b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_quiet_NaN;
8030b57cec5SDimitry Andrictemplate <class _Tp>
8040b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_signaling_NaN;
8050b57cec5SDimitry Andrictemplate <class _Tp>
8060b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const volatile _Tp>::has_denorm;
8070b57cec5SDimitry Andrictemplate <class _Tp>
8080b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_denorm_loss;
8090b57cec5SDimitry Andrictemplate <class _Tp>
8100b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_iec559;
8110b57cec5SDimitry Andrictemplate <class _Tp>
8120b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_bounded;
8130b57cec5SDimitry Andrictemplate <class _Tp>
8140b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_modulo;
8150b57cec5SDimitry Andrictemplate <class _Tp>
8160b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::traps;
8170b57cec5SDimitry Andrictemplate <class _Tp>
8180b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::tinyness_before;
8190b57cec5SDimitry Andrictemplate <class _Tp>
8200b57cec5SDimitry Andric    _LIBCPP_CONSTEXPR const float_round_style numeric_limits<const volatile _Tp>::round_style;
8210b57cec5SDimitry Andric
8220b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
8230b57cec5SDimitry Andric
8240b57cec5SDimitry Andric_LIBCPP_POP_MACROS
8250b57cec5SDimitry Andric
826*bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
827*bdd1243dSDimitry Andric#  include <type_traits>
828*bdd1243dSDimitry Andric#endif
829*bdd1243dSDimitry Andric
8300b57cec5SDimitry Andric#endif // _LIBCPP_LIMITS
831