blob: 1628adc8b0d3f900eb042233b1ee7c18d4c2b11a [file] [log] [blame]
// -*- C++ -*-
/***************************************************************************
*
* <limits> - definitions of the numeric_limits template and specializations
*
* $Id$
*
***************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* Copyright 1994-2007 Rogue Wave Software, Inc.
*
**************************************************************************/
#include <rw/_defs.h>
// quiet NAN (QNAN) supported?
#ifndef _RWSTD_NO_QUIET_NAN
# define _RWSTD_HAS_QUIET_NAN true
#else // if defined (_RWSTD_NO_QUIET_NAN)
# define _RWSTD_HAS_QUIET_NAN false
#endif // _RWSTD_NO_QUIET_NAN
// does integer arithmetic trap?
#ifndef _RWSTD_NO_INT_TRAPS
# define _RWSTD_INT_TRAPS true
#else // if defined (_RWSTD_NO_INT_TRAPS)
# define _RWSTD_INT_TRAPS false
#endif // _RWSTD_NO_INT_TRAPS
// does floating point arithmetic (such as 0.0/0.0) trap?
#ifndef _RWSTD_NO_DBL_TRAPS
# define _RWSTD_FLT_TRAPS true
# define _RWSTD_DBL_TRAPS true
# define _RWSTD_LDBL_TRAPS true
#else // if defined (_RWSTD_NO_DBL_TRAPS)
// invalid operations return QNAN
# define _RWSTD_FLT_TRAPS false
# define _RWSTD_DBL_TRAPS false
# define _RWSTD_LDBL_TRAPS false
#endif // _RWSTD_NO_DBL_TRAPS
#ifndef _RWSTD_FLT_HAS_DENORM
# define _RWSTD_FLT_HAS_DENORM false
#endif // _RWSTD_FLT_HAS_DENORM
#ifndef _RWSTD_DBL_HAS_DENORM
# define _RWSTD_DBL_HAS_DENORM false
#endif // _RWSTD_DBL_HAS_DENORM
#ifndef _RWSTD_LDBL_HAS_DENORM
# define _RWSTD_LDBL_HAS_DENORM false
#endif // _RWSTD_LDBL_HAS_DENORM
#ifndef _RWSTD_HAS_DENORM_LOSS
# define _RWSTD_HAS_DENORM_LOSS false
#endif // _RWSTD_HAS_DENORM_LOSS
#ifndef _RWSTD_HAS_INFINITY
# define _RWSTD_HAS_INFINITY true
#endif
#ifndef _RWSTD_IS_IEC559
// assume conforming environment unless autodetected otherwise
// or unless overridden in <rw/_config.h>
# define _RWSTD_IS_IEC559 true
#endif // _RWSTD_IS_IEC559
_RWSTD_NAMESPACE (__rw) {
#ifndef _RWSTD_NO_OBJECT_MANGLING
extern "C" {
#else // if defined (_RWSTD_NO_OBJECT_MANGLING)
extern "C++" {
#endif // _RWSTD_NO_OBJECT_MANGLING
_RWSTD_EXPORT extern const float __rw_flt_infinity;
_RWSTD_EXPORT extern const double __rw_dbl_infinity;
_RWSTD_EXPORT extern const float __rw_flt_qNaN;
_RWSTD_EXPORT extern const double __rw_dbl_qNaN;
_RWSTD_EXPORT extern const float __rw_flt_sNaN;
_RWSTD_EXPORT extern const double __rw_dbl_sNaN;
_RWSTD_EXPORT extern const float __rw_flt_denorm_min;
_RWSTD_EXPORT extern const double __rw_dbl_denorm_min;
#ifndef _RWSTD_NO_LONG_DOUBLE
_RWSTD_EXPORT extern const long double __rw_ldbl_infinity;
_RWSTD_EXPORT extern const long double __rw_ldbl_qNaN;
_RWSTD_EXPORT extern const long double __rw_ldbl_sNaN;
_RWSTD_EXPORT extern const long double __rw_ldbl_denorm_min;
#endif // _RWSTD_NO_LONG_DOUBLE
} // extern "C"/"C++"
} // namespace __rw
#ifndef _RWSTD_NO_SIGNALING_NAN
# define _RWSTD_HAS_SIG_NAN true
#else
# define _RWSTD_HAS_SIG_NAN false
#endif // _RWSTD_NO_SIGNALING_NAN
#undef _RWSTD_CLASS_BEGIN
#undef _RWSTD_CLASS_END
#undef _RWSTD_TYPEDEF
#undef _RWSTD_STATIC
#undef _RWSTD_STATIC_FUN
#ifndef _RWSTD_DEFINE_EXPORTS
// declarations - expanded in every translation unit
// that #includes <limits>
# define _RWSTD_CLASS_BEGIN(name) \
_RWSTD_SPECIALIZED_CLASS struct _RWSTD_EXPORT name {
# define _RWSTD_CLASS_END };
# define _RWSTD_TYPEDEF(def) typedef def;
# define _RWSTD_STATIC(ignore, type, name, value) \
_RWSTD_STATIC_CONST (type, name = value)
# define _RWSTD_STATIC_FUN(type, name, value) \
static type name () _THROWS (()) { return value; }
#else // defined (_RWSTD_DEFINE_EXPORTS)
// definitions - expanded in a single translation unit that defines
// static const data members outside of each numeric_limits<> specialization
# define _RWSTD_CLASS_BEGIN(ignore)
# define _RWSTD_CLASS_END
# define _RWSTD_TYPEDEF(ignore)
# define _RWSTD_STATIC(limtype, type, name, value) \
_RWSTD_DEFINE_STATIC_CONST (const type numeric_limits<limtype>::name)
# define _RWSTD_STATIC_FUN(ign1, ign2, ign3)
#endif // _RWSTD_DEFINE_EXPORTS
// 18.2.1.2, p6 - 7
#define _RWSTD_DIGITS(type, min, max) \
(1 == (max) ? 1 : (_RWSTD_CHAR_BIT * int (sizeof (type)) - int ((min) != 0)))
// 18.2.1.2, p9
#define _RWSTD_DIGITS10(digits) (((digits) * 301) / 1000)
#undef _RWSTD_LIMITS_BODY
#define _RWSTD_LIMITS_BODY(type, cpfx) \
_RWSTD_STATIC (type, bool, is_specialized, true); \
\
_RWSTD_STATIC_FUN (type, (min), (type)(cpfx##_MIN)) \
_RWSTD_STATIC_FUN (type, (max), (type)(cpfx##_MAX)) \
\
_RWSTD_STATIC (type, bool, is_signed, cpfx##_MIN != 0); \
_RWSTD_STATIC (type, bool, is_integer, true); \
_RWSTD_STATIC (type, bool, is_exact, true); \
\
_RWSTD_STATIC (type, int, digits, \
_RWSTD_DIGITS (type, cpfx##_MIN, cpfx##_MAX)); \
\
/* spelled out to work around a bug in IBM xlC 5.0 */ \
_RWSTD_STATIC (type, int, digits10, \
_RWSTD_DIGITS10 (_RWSTD_DIGITS (type, cpfx##_MIN, \
cpfx##_MAX))); \
\
_RWSTD_STATIC (type, int, radix, 2); \
\
_RWSTD_STATIC_FUN (type, epsilon, 0) \
_RWSTD_STATIC_FUN (type, round_error, 0) \
\
_RWSTD_STATIC (type, int, min_exponent, 0); \
_RWSTD_STATIC (type, int, min_exponent10, 0); \
_RWSTD_STATIC (type, int, max_exponent, 0); \
_RWSTD_STATIC (type, int, max_exponent10, 0); \
\
_RWSTD_STATIC (type, bool, has_infinity, false); \
_RWSTD_STATIC (type, bool, has_quiet_NaN, false); \
_RWSTD_STATIC (type, bool, has_signaling_NaN, false); \
_RWSTD_STATIC (type, float_denorm_style, has_denorm, denorm_absent); \
_RWSTD_STATIC (type, bool, has_denorm_loss, false); \
\
_RWSTD_STATIC_FUN (type, infinity, 0) \
_RWSTD_STATIC_FUN (type, quiet_NaN, 0) \
_RWSTD_STATIC_FUN (type, signaling_NaN, 0) \
_RWSTD_STATIC_FUN (type, denorm_min, 0) \
\
_RWSTD_STATIC (type, bool, is_iec559, false); \
_RWSTD_STATIC (type, bool, is_bounded, true); \
_RWSTD_STATIC (type, bool, is_modulo, 1 != cpfx##_MAX); \
\
_RWSTD_STATIC (type, bool, traps, _RWSTD_INT_TRAPS); \
_RWSTD_STATIC (type, bool, tinyness_before, false); \
_RWSTD_STATIC (type, float_round_style, round_style, round_toward_zero);
#undef _RWSTD_SPECIALIZE_LIMITS
#if !defined (_RWSTD_NO_CLASS_PARTIAL_SPEC) \
|| defined (_RWSTD_NO_EXT_CV_QUALIFIED_LIMITS)
# define _RWSTD_SPECIALIZE_LIMITS(T, cpfx) \
_RWSTD_CLASS_BEGIN (numeric_limits<T>) \
_RWSTD_LIMITS_BODY (T, cpfx) \
_RWSTD_CLASS_END
#else // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)
// define specializations for all cv-qualified types
# define _RWSTD_SPECIALIZE_LIMITS(T, cpfx) \
_RWSTD_CLASS_BEGIN (numeric_limits<T>) \
_RWSTD_LIMITS_BODY (T, cpfx) \
_RWSTD_CLASS_END \
_RWSTD_CLASS_BEGIN (numeric_limits<const T>: numeric_limits<T>) \
_RWSTD_CLASS_END \
_RWSTD_CLASS_BEGIN (numeric_limits<volatile T>: numeric_limits<T>) \
_RWSTD_CLASS_END \
_RWSTD_CLASS_BEGIN (numeric_limits<const volatile T>: numeric_limits<T>) \
_RWSTD_CLASS_END
#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
#ifndef _RWSTD_LIMITS_PRIMARY_TEMPLATE_DEFINED
# define _RWSTD_LIMITS_PRIMARY_TEMPLATE_DEFINED
_RWSTD_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
};
#ifdef _RWSTD_FLT_ROUNDS
# define _RWSTD_ROUND_STYLE \
0 == _RWSTD_FLT_ROUNDS ? round_toward_zero \
: 1 == _RWSTD_FLT_ROUNDS ? round_to_nearest \
: 2 == _RWSTD_FLT_ROUNDS ? round_toward_infinity \
: 3 == _RWSTD_FLT_ROUNDS ? round_toward_neg_infinity \
: round_indeterminate
#else // if !defined (_RWSTD_FLT_ROUNDS)
# define _RWSTD_ROUND_STYLE round_indeterminate
#endif // _RWSTD_FLT_ROUNDS
enum float_denorm_style
{
denorm_indeterminate = -1,
denorm_absent = 0,
denorm_present = 1
};
template <class _TypeT>
struct numeric_limits
{
// static consts below must be initialized in class so that
// they can be used where const expressions are required (such
// as in template parameters)
_RWSTD_STATIC_CONST (bool, is_specialized = false);
static _TypeT (min)() _THROWS (()) { return _TypeT (); }
static _TypeT (max)() _THROWS (()) { return _TypeT (); }
_RWSTD_STATIC_CONST (int, digits = 0);
_RWSTD_STATIC_CONST (int, digits10 = 0);
_RWSTD_STATIC_CONST (bool, is_signed = false);
_RWSTD_STATIC_CONST (bool, is_integer = false);
_RWSTD_STATIC_CONST (bool, is_exact = false);
_RWSTD_STATIC_CONST (int, radix = 0);
static _TypeT epsilon () _THROWS (()) { return _TypeT (); }
static _TypeT round_error () _THROWS (()) { return _TypeT (); }
_RWSTD_STATIC_CONST (int, min_exponent = 0);
_RWSTD_STATIC_CONST (int, min_exponent10 = 0);
_RWSTD_STATIC_CONST (int, max_exponent = 0);
_RWSTD_STATIC_CONST (int, max_exponent10 = 0);
_RWSTD_STATIC_CONST (bool, has_infinity = false);
_RWSTD_STATIC_CONST (bool, has_quiet_NaN = false);
_RWSTD_STATIC_CONST (bool, has_signaling_NaN = false);
_RWSTD_STATIC_CONST (float_denorm_style, has_denorm = denorm_absent);
_RWSTD_STATIC_CONST (bool, has_denorm_loss = false);
static _TypeT infinity () _THROWS (()) { return _TypeT (); }
static _TypeT quiet_NaN () _THROWS (()) { return _TypeT (); }
static _TypeT signaling_NaN () _THROWS (()) { return _TypeT (); }
static _TypeT denorm_min () _THROWS (()) { return _TypeT (); }
_RWSTD_STATIC_CONST (bool, is_iec559 = false);
_RWSTD_STATIC_CONST (bool, is_bounded = false);
_RWSTD_STATIC_CONST (bool, is_modulo = false);
_RWSTD_STATIC_CONST (bool, traps = false);
_RWSTD_STATIC_CONST (bool, tinyness_before = false);
_RWSTD_STATIC_CONST (float_round_style, round_style = round_toward_zero);
};
} // namespace std
#endif // _RWSTD_LIMITS_PRIMARY_TEMPLATE_DEFINED
#ifndef _RWSTD_LIMITS_INCLUDED
#define _RWSTD_LIMITS_INCLUDED
_RWSTD_NAMESPACE (std) {
_RWSTD_CLASS_BEGIN (numeric_limits<float>)
_RWSTD_STATIC (float, bool, is_specialized, true);
_RWSTD_STATIC_FUN (float, (min), _RWSTD_FLT_MIN)
_RWSTD_STATIC_FUN (float, (max), _RWSTD_FLT_MAX)
_RWSTD_STATIC (float, int, digits, _RWSTD_FLT_MANT_DIG);
_RWSTD_STATIC (float, int, digits10, _RWSTD_FLT_DIG);
_RWSTD_STATIC (float, bool, is_signed, true);
_RWSTD_STATIC (float, bool, is_integer, false);
_RWSTD_STATIC (float, bool, is_exact, false);
_RWSTD_STATIC (float, int, radix, _RWSTD_FLT_RADIX);
_RWSTD_STATIC_FUN (float, epsilon, _RWSTD_FLT_EPSILON)
_RWSTD_STATIC_FUN (float, round_error, 0.5f)
_RWSTD_STATIC (float, int, min_exponent, _RWSTD_FLT_MIN_EXP);
_RWSTD_STATIC (float, int, min_exponent10, _RWSTD_FLT_MIN_10_EXP);
_RWSTD_STATIC (float, int, max_exponent, _RWSTD_FLT_MAX_EXP);
_RWSTD_STATIC (float, int, max_exponent10, _RWSTD_FLT_MAX_10_EXP);
_RWSTD_STATIC (float, bool, has_infinity, _RWSTD_HAS_INFINITY);
_RWSTD_STATIC (float, bool, has_quiet_NaN, _RWSTD_HAS_QUIET_NAN);
_RWSTD_STATIC (float, bool, has_signaling_NaN, _RWSTD_HAS_SIG_NAN);
_RWSTD_STATIC (float, float_denorm_style, has_denorm,
float_denorm_style (_RWSTD_FLT_HAS_DENORM));
_RWSTD_STATIC (float, bool, has_denorm_loss, _RWSTD_HAS_DENORM_LOSS);
_RWSTD_STATIC_FUN (float, infinity, _RW::__rw_flt_infinity)
_RWSTD_STATIC_FUN (float, quiet_NaN, _RW::__rw_flt_qNaN)
_RWSTD_STATIC_FUN (float, signaling_NaN, _RW::__rw_flt_sNaN)
_RWSTD_STATIC_FUN (float, denorm_min, _RW::__rw_flt_denorm_min)
_RWSTD_STATIC (float, bool, is_iec559, _RWSTD_IS_IEC559);
_RWSTD_STATIC (float, bool, is_bounded, true);
_RWSTD_STATIC (float, bool, is_modulo, false);
_RWSTD_STATIC (float, bool, traps, _RWSTD_FLT_TRAPS);
_RWSTD_STATIC (float, bool, tinyness_before, false);
_RWSTD_STATIC (float, float_round_style, round_style, _RWSTD_ROUND_STYLE);
_RWSTD_CLASS_END // numeric_limits<float>
_RWSTD_CLASS_BEGIN (numeric_limits<double>)
_RWSTD_STATIC (double, bool, is_specialized, true);
_RWSTD_STATIC_FUN (double, (min), _RWSTD_DBL_MIN)
_RWSTD_STATIC_FUN (double, (max), _RWSTD_DBL_MAX)
_RWSTD_STATIC (double, int, digits, _RWSTD_DBL_MANT_DIG);
_RWSTD_STATIC (double, int, digits10, _RWSTD_DBL_DIG);
_RWSTD_STATIC (double, bool, is_signed, true);
_RWSTD_STATIC (double, bool, is_integer, false);
_RWSTD_STATIC (double, bool, is_exact, false);
_RWSTD_STATIC (double, int, radix, _RWSTD_FLT_RADIX);
_RWSTD_STATIC_FUN (double, epsilon, _RWSTD_DBL_EPSILON)
_RWSTD_STATIC_FUN (double, round_error, 0.5)
_RWSTD_STATIC (double, int, min_exponent, _RWSTD_DBL_MIN_EXP);
_RWSTD_STATIC (double, int, min_exponent10, _RWSTD_DBL_MIN_10_EXP);
_RWSTD_STATIC (double, int, max_exponent, _RWSTD_DBL_MAX_EXP);
_RWSTD_STATIC (double, int, max_exponent10, _RWSTD_DBL_MAX_10_EXP);
_RWSTD_STATIC (double, bool, has_infinity, _RWSTD_HAS_INFINITY);
_RWSTD_STATIC (double, bool, has_quiet_NaN, _RWSTD_HAS_QUIET_NAN);
_RWSTD_STATIC (double, bool, has_signaling_NaN, _RWSTD_HAS_SIG_NAN);
_RWSTD_STATIC (double, float_denorm_style, has_denorm,
float_denorm_style (_RWSTD_DBL_HAS_DENORM));
_RWSTD_STATIC (double, bool, has_denorm_loss, _RWSTD_HAS_DENORM_LOSS);
_RWSTD_STATIC_FUN (double, infinity, _RW::__rw_dbl_infinity)
_RWSTD_STATIC_FUN (double, quiet_NaN, _RW::__rw_dbl_qNaN)
_RWSTD_STATIC_FUN (double, signaling_NaN, _RW::__rw_dbl_sNaN)
_RWSTD_STATIC_FUN (double, denorm_min, _RW::__rw_dbl_denorm_min)
_RWSTD_STATIC (double, bool, is_iec559, _RWSTD_IS_IEC559);
_RWSTD_STATIC (double, bool, is_bounded, true);
_RWSTD_STATIC (double, bool, is_modulo, false);
_RWSTD_STATIC (double, bool, traps, _RWSTD_DBL_TRAPS);
_RWSTD_STATIC (double, bool, tinyness_before, false);
_RWSTD_STATIC (double, float_round_style, round_style, _RWSTD_ROUND_STYLE);
_RWSTD_CLASS_END // numeric_limits<double>
#ifndef _RWSTD_NO_LONG_DOUBLE
_RWSTD_CLASS_BEGIN (numeric_limits<long double>)
_RWSTD_STATIC (long double, bool, is_specialized, true);
_RWSTD_STATIC_FUN (long double, (min), _RWSTD_LDBL_MIN)
_RWSTD_STATIC_FUN (long double, (max), _RWSTD_LDBL_MAX)
_RWSTD_STATIC (long double, int, digits, _RWSTD_LDBL_MANT_DIG);
_RWSTD_STATIC (long double, int, digits10, _RWSTD_LDBL_DIG);
_RWSTD_STATIC (long double, bool, is_signed, true);
_RWSTD_STATIC (long double, bool, is_integer, false);
_RWSTD_STATIC (long double, bool, is_exact, false);
_RWSTD_STATIC (long double, int, radix, _RWSTD_FLT_RADIX);
_RWSTD_STATIC_FUN (long double, epsilon, _RWSTD_LDBL_EPSILON)
_RWSTD_STATIC_FUN (long double, round_error, 0.5L)
_RWSTD_STATIC (long double, int, min_exponent, _RWSTD_LDBL_MIN_EXP);
_RWSTD_STATIC (long double, int, min_exponent10, _RWSTD_LDBL_MIN_10_EXP);
_RWSTD_STATIC (long double, int, max_exponent, _RWSTD_LDBL_MAX_EXP);
_RWSTD_STATIC (long double, int, max_exponent10, _RWSTD_LDBL_MAX_10_EXP);
_RWSTD_STATIC (long double, bool, has_infinity, _RWSTD_HAS_INFINITY);
_RWSTD_STATIC (long double, bool, has_quiet_NaN, _RWSTD_HAS_QUIET_NAN);
_RWSTD_STATIC (long double, bool, has_signaling_NaN, _RWSTD_HAS_SIG_NAN);
_RWSTD_STATIC (long double, float_denorm_style, has_denorm,
float_denorm_style (_RWSTD_LDBL_HAS_DENORM));
_RWSTD_STATIC (long double, bool, has_denorm_loss, _RWSTD_HAS_DENORM_LOSS);
_RWSTD_STATIC_FUN (long double, infinity, _RW::__rw_ldbl_infinity)
_RWSTD_STATIC_FUN (long double, quiet_NaN, _RW::__rw_ldbl_qNaN)
_RWSTD_STATIC_FUN (long double, signaling_NaN, _RW::__rw_ldbl_sNaN)
_RWSTD_STATIC_FUN (long double, denorm_min, _RW::__rw_ldbl_denorm_min)
_RWSTD_STATIC (long double, bool, is_iec559, _RWSTD_IS_IEC559);
_RWSTD_STATIC (long double, bool, is_bounded, true);
_RWSTD_STATIC (long double, bool, is_modulo, false);
_RWSTD_STATIC (long double, bool, traps, _RWSTD_LDBL_TRAPS);
_RWSTD_STATIC (long double, bool, tinyness_before, false);
_RWSTD_STATIC (long double, float_round_style, round_style,
_RWSTD_ROUND_STYLE);
_RWSTD_CLASS_END // numeric_limits<long double>
#endif // _RWSTD_NO_LONG_DOUBLE
// define numeric_limits<> integral specializations
_RWSTD_SPECIALIZE_LIMITS (char, _RWSTD_CHAR)
_RWSTD_SPECIALIZE_LIMITS (unsigned char, _RWSTD_UCHAR)
_RWSTD_SPECIALIZE_LIMITS (signed char, _RWSTD_SCHAR)
_RWSTD_SPECIALIZE_LIMITS (short int, _RWSTD_SHRT)
_RWSTD_SPECIALIZE_LIMITS (unsigned short, _RWSTD_USHRT)
_RWSTD_SPECIALIZE_LIMITS (int, _RWSTD_INT)
_RWSTD_SPECIALIZE_LIMITS (unsigned int, _RWSTD_UINT)
_RWSTD_SPECIALIZE_LIMITS (long int, _RWSTD_LONG)
_RWSTD_SPECIALIZE_LIMITS (unsigned long int, _RWSTD_ULONG)
#ifndef _RWSTD_NO_WCHAR_T
# ifndef _RWSTD_NO_NATIVE_WCHAR_T
_RWSTD_SPECIALIZE_LIMITS (wchar_t, _RWSTD_WCHAR)
# endif // _RWSTD_NO_NATIVE_WCHAR_T
#endif // _RWSTD_NO_WCHAR_T
#ifndef _RWSTD_NO_BOOL
# ifndef _RWSTD_NO_NATIVE_BOOL
_RWSTD_SPECIALIZE_LIMITS (bool, _RWSTD_BOOL)
# endif // _RWSTD_NO_NATIVE_BOOL
#endif // _RWSTD_NO_BOOL
#ifdef _RWSTD_LONG_LONG
_RWSTD_SPECIALIZE_LIMITS (_RWSTD_LONG_LONG, _RWSTD_LLONG)
_RWSTD_SPECIALIZE_LIMITS (unsigned _RWSTD_LONG_LONG, _RWSTD_ULLONG)
#endif // _RWSTD_LONG_LONG
#ifndef _RWSTD_LIMITS_PARTIAL_SPEC_DEFINED
# define _RWSTD_LIMITS_PARTIAL_SPEC_DEFINED
# ifndef _RWSTD_NO_EXT_CV_QUALIFIED_LIMITS
# ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
template <class _TypeT>
struct numeric_limits<const _TypeT>: numeric_limits<_TypeT> { };
template <class _TypeT>
struct numeric_limits<volatile _TypeT>: numeric_limits<_TypeT> { };
template <class _TypeT>
struct numeric_limits<const volatile _TypeT>: numeric_limits<_TypeT> { };
# endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
# endif // _RWSTD_NO_EXT_CV_QUALIFIED_LIMITS
#endif // _RWSTD_LIMITS_PARTIAL_SPEC_DEFINED
} // namespace std
#ifdef _RWSTD_NO_IMPLICIT_INCLUSION
# include <limits.cc>
#endif
#endif // _RWSTD_LIMITS_INCLUDED