// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP___CXX03_LIMITS
#define _LIBCPP___CXX03_LIMITS

/*
    limits synopsis

namespace std
{

template<class T>
class numeric_limits
{
public:
    static constexpr bool is_specialized = false;
    static constexpr T min() noexcept;
    static constexpr T max() noexcept;
    static constexpr T lowest() noexcept;

    static constexpr int  digits = 0;
    static constexpr int  digits10 = 0;
    static constexpr int  max_digits10 = 0;
    static constexpr bool is_signed = false;
    static constexpr bool is_integer = false;
    static constexpr bool is_exact = false;
    static constexpr int  radix = 0;
    static constexpr T epsilon() noexcept;
    static constexpr T round_error() noexcept;

    static constexpr int  min_exponent = 0;
    static constexpr int  min_exponent10 = 0;
    static constexpr int  max_exponent = 0;
    static constexpr int  max_exponent10 = 0;

    static constexpr bool has_infinity = false;
    static constexpr bool has_quiet_NaN = false;
    static constexpr bool has_signaling_NaN = false;
    static constexpr float_denorm_style has_denorm = denorm_absent; // deprecated in C++23
    static constexpr bool has_denorm_loss = false;                  // deprecated in C++23
    static constexpr T infinity() noexcept;
    static constexpr T quiet_NaN() noexcept;
    static constexpr T signaling_NaN() noexcept;
    static constexpr T denorm_min() noexcept;

    static constexpr bool is_iec559 = false;
    static constexpr bool is_bounded = false;
    static constexpr bool is_modulo = false;

    static constexpr bool traps = false;
    static constexpr bool tinyness_before = false;
    static constexpr float_round_style round_style = round_toward_zero;
};

enum float_round_style
{
    round_indeterminate       = -1,
    round_toward_zero         =  0,
    round_to_nearest          =  1,
    round_toward_infinity     =  2,
    round_toward_neg_infinity =  3
};

enum float_denorm_style // deprecated in C++23
{
    denorm_indeterminate = -1,
    denorm_absent = 0,
    denorm_present = 1
};

template<> class numeric_limits<cv bool>;

template<> class numeric_limits<cv char>;
template<> class numeric_limits<cv signed char>;
template<> class numeric_limits<cv unsigned char>;
template<> class numeric_limits<cv wchar_t>;
template<> class numeric_limits<cv char8_t>; // C++20
template<> class numeric_limits<cv char16_t>;
template<> class numeric_limits<cv char32_t>;

template<> class numeric_limits<cv short>;
template<> class numeric_limits<cv int>;
template<> class numeric_limits<cv long>;
template<> class numeric_limits<cv long long>;
template<> class numeric_limits<cv unsigned short>;
template<> class numeric_limits<cv unsigned int>;
template<> class numeric_limits<cv unsigned long>;
template<> class numeric_limits<cv unsigned long long>;

template<> class numeric_limits<cv float>;
template<> class numeric_limits<cv double>;
template<> class numeric_limits<cv long double>;

}  // std

*/

#include <__cxx03/__config>
#include <__cxx03/__type_traits/is_arithmetic.h>
#include <__cxx03/__type_traits/is_signed.h>
#include <__cxx03/__type_traits/remove_cv.h>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

_LIBCPP_PUSH_MACROS
#include <__cxx03/__undef_macros>
#include <__cxx03/version>

_LIBCPP_BEGIN_NAMESPACE_STD

enum float_round_style {
  round_indeterminate       = -1,
  round_toward_zero         = 0,
  round_to_nearest          = 1,
  round_toward_infinity     = 2,
  round_toward_neg_infinity = 3
};

enum float_denorm_style { denorm_indeterminate = -1, denorm_absent = 0, denorm_present = 1 };

template <class _Tp, bool = is_arithmetic<_Tp>::value>
class __libcpp_numeric_limits {
protected:
  typedef _Tp type;

  static const bool is_specialized = false;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type min() _NOEXCEPT { return type(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type max() _NOEXCEPT { return type(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type lowest() _NOEXCEPT { return type(); }

  static const int digits       = 0;
  static const int digits10     = 0;
  static const int max_digits10 = 0;
  static const bool is_signed   = false;
  static const bool is_integer  = false;
  static const bool is_exact    = false;
  static const int radix        = 0;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type epsilon() _NOEXCEPT { return type(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type round_error() _NOEXCEPT { return type(); }

  static const int min_exponent   = 0;
  static const int min_exponent10 = 0;
  static const int max_exponent   = 0;
  static const int max_exponent10 = 0;

  static const bool has_infinity             = false;
  static const bool has_quiet_NaN            = false;
  static const bool has_signaling_NaN        = false;
  static const float_denorm_style has_denorm = denorm_absent;
  static const bool has_denorm_loss          = false;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type infinity() _NOEXCEPT { return type(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type quiet_NaN() _NOEXCEPT { return type(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type signaling_NaN() _NOEXCEPT { return type(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type denorm_min() _NOEXCEPT { return type(); }

  static const bool is_iec559  = false;
  static const bool is_bounded = false;
  static const bool is_modulo  = false;

  static const bool traps                    = false;
  static const bool tinyness_before          = false;
  static const float_round_style round_style = round_toward_zero;
};

template <class _Tp, int __digits, bool _IsSigned>
struct __libcpp_compute_min {
  static const _Tp value = _Tp(_Tp(1) << __digits);
};

template <class _Tp, int __digits>
struct __libcpp_compute_min<_Tp, __digits, false> {
  static const _Tp value = _Tp(0);
};

template <class _Tp>
class __libcpp_numeric_limits<_Tp, true> {
protected:
  typedef _Tp type;

  static const bool is_specialized = true;

  static const bool is_signed   = type(-1) < type(0);
  static const int digits       = static_cast<int>(sizeof(type) * __CHAR_BIT__ - is_signed);
  static const int digits10     = digits * 3 / 10;
  static const int max_digits10 = 0;
  static const type __min       = __libcpp_compute_min<type, digits, is_signed>::value;
  static const type __max       = is_signed ? type(type(~0) ^ __min) : type(~0);
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type min() _NOEXCEPT { return __min; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type max() _NOEXCEPT { return __max; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type lowest() _NOEXCEPT { return min(); }

  static const bool is_integer = true;
  static const bool is_exact   = true;
  static const int radix       = 2;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type epsilon() _NOEXCEPT { return type(0); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type round_error() _NOEXCEPT { return type(0); }

  static const int min_exponent   = 0;
  static const int min_exponent10 = 0;
  static const int max_exponent   = 0;
  static const int max_exponent10 = 0;

  static const bool has_infinity             = false;
  static const bool has_quiet_NaN            = false;
  static const bool has_signaling_NaN        = false;
  static const float_denorm_style has_denorm = denorm_absent;
  static const bool has_denorm_loss          = false;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type infinity() _NOEXCEPT { return type(0); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type quiet_NaN() _NOEXCEPT { return type(0); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type signaling_NaN() _NOEXCEPT { return type(0); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type denorm_min() _NOEXCEPT { return type(0); }

  static const bool is_iec559  = false;
  static const bool is_bounded = true;
  static const bool is_modulo  = !std::is_signed<_Tp>::value;

#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__) || defined(__wasm__)
  static const bool traps = true;
#else
  static const bool traps = false;
#endif
  static const bool tinyness_before          = false;
  static const float_round_style round_style = round_toward_zero;
};

template <>
class __libcpp_numeric_limits<bool, true> {
protected:
  typedef bool type;

  static const bool is_specialized = true;

  static const bool is_signed   = false;
  static const int digits       = 1;
  static const int digits10     = 0;
  static const int max_digits10 = 0;
  static const type __min       = false;
  static const type __max       = true;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type min() _NOEXCEPT { return __min; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type max() _NOEXCEPT { return __max; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type lowest() _NOEXCEPT { return min(); }

  static const bool is_integer = true;
  static const bool is_exact   = true;
  static const int radix       = 2;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type epsilon() _NOEXCEPT { return type(0); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type round_error() _NOEXCEPT { return type(0); }

  static const int min_exponent   = 0;
  static const int min_exponent10 = 0;
  static const int max_exponent   = 0;
  static const int max_exponent10 = 0;

  static const bool has_infinity             = false;
  static const bool has_quiet_NaN            = false;
  static const bool has_signaling_NaN        = false;
  static const float_denorm_style has_denorm = denorm_absent;
  static const bool has_denorm_loss          = false;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type infinity() _NOEXCEPT { return type(0); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type quiet_NaN() _NOEXCEPT { return type(0); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type signaling_NaN() _NOEXCEPT { return type(0); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type denorm_min() _NOEXCEPT { return type(0); }

  static const bool is_iec559  = false;
  static const bool is_bounded = true;
  static const bool is_modulo  = false;

  static const bool traps                    = false;
  static const bool tinyness_before          = false;
  static const float_round_style round_style = round_toward_zero;
};

template <>
class __libcpp_numeric_limits<float, true> {
protected:
  typedef float type;

  static const bool is_specialized = true;

  static const bool is_signed   = true;
  static const int digits       = __FLT_MANT_DIG__;
  static const int digits10     = __FLT_DIG__;
  static const int max_digits10 = 2 + (digits * 30103l) / 100000l;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type min() _NOEXCEPT { return __FLT_MIN__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type max() _NOEXCEPT { return __FLT_MAX__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type lowest() _NOEXCEPT { return -max(); }

  static const bool is_integer = false;
  static const bool is_exact   = false;
  static const int radix       = __FLT_RADIX__;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type epsilon() _NOEXCEPT { return __FLT_EPSILON__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type round_error() _NOEXCEPT { return 0.5F; }

  static const int min_exponent   = __FLT_MIN_EXP__;
  static const int min_exponent10 = __FLT_MIN_10_EXP__;
  static const int max_exponent   = __FLT_MAX_EXP__;
  static const int max_exponent10 = __FLT_MAX_10_EXP__;

  static const bool has_infinity             = true;
  static const bool has_quiet_NaN            = true;
  static const bool has_signaling_NaN        = true;
  static const float_denorm_style has_denorm = denorm_present;
  static const bool has_denorm_loss          = false;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type infinity() _NOEXCEPT { return __builtin_huge_valf(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type quiet_NaN() _NOEXCEPT { return __builtin_nanf(""); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type signaling_NaN() _NOEXCEPT { return __builtin_nansf(""); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type denorm_min() _NOEXCEPT { return __FLT_DENORM_MIN__; }

  static const bool is_iec559  = true;
  static const bool is_bounded = true;
  static const bool is_modulo  = false;

  static const bool traps = false;
#if (defined(__arm__) || defined(__aarch64__))
  static const bool tinyness_before = true;
#else
  static const bool tinyness_before = false;
#endif
  static const float_round_style round_style = round_to_nearest;
};

template <>
class __libcpp_numeric_limits<double, true> {
protected:
  typedef double type;

  static const bool is_specialized = true;

  static const bool is_signed   = true;
  static const int digits       = __DBL_MANT_DIG__;
  static const int digits10     = __DBL_DIG__;
  static const int max_digits10 = 2 + (digits * 30103l) / 100000l;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type min() _NOEXCEPT { return __DBL_MIN__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type max() _NOEXCEPT { return __DBL_MAX__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type lowest() _NOEXCEPT { return -max(); }

  static const bool is_integer = false;
  static const bool is_exact   = false;
  static const int radix       = __FLT_RADIX__;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type epsilon() _NOEXCEPT { return __DBL_EPSILON__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type round_error() _NOEXCEPT { return 0.5; }

  static const int min_exponent   = __DBL_MIN_EXP__;
  static const int min_exponent10 = __DBL_MIN_10_EXP__;
  static const int max_exponent   = __DBL_MAX_EXP__;
  static const int max_exponent10 = __DBL_MAX_10_EXP__;

  static const bool has_infinity             = true;
  static const bool has_quiet_NaN            = true;
  static const bool has_signaling_NaN        = true;
  static const float_denorm_style has_denorm = denorm_present;
  static const bool has_denorm_loss          = false;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type infinity() _NOEXCEPT { return __builtin_huge_val(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type quiet_NaN() _NOEXCEPT { return __builtin_nan(""); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type signaling_NaN() _NOEXCEPT { return __builtin_nans(""); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type denorm_min() _NOEXCEPT { return __DBL_DENORM_MIN__; }

  static const bool is_iec559  = true;
  static const bool is_bounded = true;
  static const bool is_modulo  = false;

  static const bool traps = false;
#if (defined(__arm__) || defined(__aarch64__))
  static const bool tinyness_before = true;
#else
  static const bool tinyness_before = false;
#endif
  static const float_round_style round_style = round_to_nearest;
};

template <>
class __libcpp_numeric_limits<long double, true> {
protected:
  typedef long double type;

  static const bool is_specialized = true;

  static const bool is_signed   = true;
  static const int digits       = __LDBL_MANT_DIG__;
  static const int digits10     = __LDBL_DIG__;
  static const int max_digits10 = 2 + (digits * 30103l) / 100000l;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type min() _NOEXCEPT { return __LDBL_MIN__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type max() _NOEXCEPT { return __LDBL_MAX__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type lowest() _NOEXCEPT { return -max(); }

  static const bool is_integer = false;
  static const bool is_exact   = false;
  static const int radix       = __FLT_RADIX__;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type epsilon() _NOEXCEPT { return __LDBL_EPSILON__; }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type round_error() _NOEXCEPT { return 0.5L; }

  static const int min_exponent   = __LDBL_MIN_EXP__;
  static const int min_exponent10 = __LDBL_MIN_10_EXP__;
  static const int max_exponent   = __LDBL_MAX_EXP__;
  static const int max_exponent10 = __LDBL_MAX_10_EXP__;

  static const bool has_infinity             = true;
  static const bool has_quiet_NaN            = true;
  static const bool has_signaling_NaN        = true;
  static const float_denorm_style has_denorm = denorm_present;
  static const bool has_denorm_loss          = false;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type infinity() _NOEXCEPT { return __builtin_huge_vall(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type quiet_NaN() _NOEXCEPT { return __builtin_nanl(""); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type signaling_NaN() _NOEXCEPT { return __builtin_nansl(""); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type denorm_min() _NOEXCEPT { return __LDBL_DENORM_MIN__; }

#if defined(__powerpc__) && defined(__LONG_DOUBLE_IBM128__)
  static const bool is_iec559 = false;
#else
  static const bool is_iec559 = true;
#endif
  static const bool is_bounded = true;
  static const bool is_modulo  = false;

  static const bool traps = false;
#if (defined(__arm__) || defined(__aarch64__))
  static const bool tinyness_before = true;
#else
  static const bool tinyness_before = false;
#endif
  static const float_round_style round_style = round_to_nearest;
};

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS numeric_limits : private __libcpp_numeric_limits<_Tp> {
  typedef __libcpp_numeric_limits<_Tp> __base;
  typedef typename __base::type type;

public:
  static const bool is_specialized = __base::is_specialized;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type min() _NOEXCEPT { return __base::min(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type max() _NOEXCEPT { return __base::max(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type lowest() _NOEXCEPT { return __base::lowest(); }

  static const int digits       = __base::digits;
  static const int digits10     = __base::digits10;
  static const int max_digits10 = __base::max_digits10;
  static const bool is_signed   = __base::is_signed;
  static const bool is_integer  = __base::is_integer;
  static const bool is_exact    = __base::is_exact;
  static const int radix        = __base::radix;
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type epsilon() _NOEXCEPT { return __base::epsilon(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type round_error() _NOEXCEPT { return __base::round_error(); }

  static const int min_exponent   = __base::min_exponent;
  static const int min_exponent10 = __base::min_exponent10;
  static const int max_exponent   = __base::max_exponent;
  static const int max_exponent10 = __base::max_exponent10;

  static const bool has_infinity      = __base::has_infinity;
  static const bool has_quiet_NaN     = __base::has_quiet_NaN;
  static const bool has_signaling_NaN = __base::has_signaling_NaN;
  _LIBCPP_SUPPRESS_DEPRECATED_PUSH
  static const float_denorm_style has_denorm = __base::has_denorm;
  static const bool has_denorm_loss          = __base::has_denorm_loss;
  _LIBCPP_SUPPRESS_DEPRECATED_POP
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type infinity() _NOEXCEPT { return __base::infinity(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type quiet_NaN() _NOEXCEPT { return __base::quiet_NaN(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type signaling_NaN() _NOEXCEPT { return __base::signaling_NaN(); }
  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static type denorm_min() _NOEXCEPT { return __base::denorm_min(); }

  static const bool is_iec559  = __base::is_iec559;
  static const bool is_bounded = __base::is_bounded;
  static const bool is_modulo  = __base::is_modulo;

  static const bool traps                    = __base::traps;
  static const bool tinyness_before          = __base::tinyness_before;
  static const float_round_style round_style = __base::round_style;
};

template <class _Tp>
const bool numeric_limits<_Tp>::is_specialized;
template <class _Tp>
const int numeric_limits<_Tp>::digits;
template <class _Tp>
const int numeric_limits<_Tp>::digits10;
template <class _Tp>
const int numeric_limits<_Tp>::max_digits10;
template <class _Tp>
const bool numeric_limits<_Tp>::is_signed;
template <class _Tp>
const bool numeric_limits<_Tp>::is_integer;
template <class _Tp>
const bool numeric_limits<_Tp>::is_exact;
template <class _Tp>
const int numeric_limits<_Tp>::radix;
template <class _Tp>
const int numeric_limits<_Tp>::min_exponent;
template <class _Tp>
const int numeric_limits<_Tp>::min_exponent10;
template <class _Tp>
const int numeric_limits<_Tp>::max_exponent;
template <class _Tp>
const int numeric_limits<_Tp>::max_exponent10;
template <class _Tp>
const bool numeric_limits<_Tp>::has_infinity;
template <class _Tp>
const bool numeric_limits<_Tp>::has_quiet_NaN;
template <class _Tp>
const bool numeric_limits<_Tp>::has_signaling_NaN;
template <class _Tp>
const float_denorm_style numeric_limits<_Tp>::has_denorm;
template <class _Tp>
const bool numeric_limits<_Tp>::has_denorm_loss;
template <class _Tp>
const bool numeric_limits<_Tp>::is_iec559;
template <class _Tp>
const bool numeric_limits<_Tp>::is_bounded;
template <class _Tp>
const bool numeric_limits<_Tp>::is_modulo;
template <class _Tp>
const bool numeric_limits<_Tp>::traps;
template <class _Tp>
const bool numeric_limits<_Tp>::tinyness_before;
template <class _Tp>
const float_round_style numeric_limits<_Tp>::round_style;

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS numeric_limits<const _Tp> : public numeric_limits<_Tp> {};

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS numeric_limits<volatile _Tp> : public numeric_limits<_Tp> {};

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS numeric_limits<const volatile _Tp> : public numeric_limits<_Tp> {};

_LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
#  include <__cxx03/type_traits>
#endif

#endif // _LIBCPP___CXX03_LIMITS
