| // -*- 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 |