19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This may be not portable code. Parts of numeric_limits<> are
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * inherently machine-dependent.  At present this file is suitable
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * for the MIPS, SPARC, Alpha and ia32 architectures.
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_LIMITS
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_LIMITS
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_CLIMITS
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <climits>
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_CFLOAT
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <cfloat>
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_INTERNAL_CWCHAR)
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cwchar.h>
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockenum float_round_style {
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  round_indeterminate       = -1,
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  round_toward_zero         =  0,
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  round_to_nearest          =  1,
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  round_toward_infinity     =  2,
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  round_toward_neg_infinity =  3
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockenum float_denorm_style {
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  denorm_indeterminate = -1,
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  denorm_absent        =  0,
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  denorm_present       =  1
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Base class for all specializations of numeric_limits.
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class __number>
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Numeric_limits_base {
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static __number (_STLP_CALL min)() _STLP_NOTHROW { return __number(); }
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static __number (_STLP_CALL max)() _STLP_NOTHROW { return __number(); }
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits = 0);
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits10 = 0);
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, radix = 0);
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, min_exponent = 0);
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, min_exponent10 = 0);
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, max_exponent = 0);
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, max_exponent10 = 0);
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(float_denorm_style, has_denorm = denorm_absent);
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero);
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_specialized = false);
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_signed  = false);
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_integer = false);
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_exact = false);
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_infinity = false);
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_quiet_NaN = false);
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_signaling_NaN = false);
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_denorm_loss = false);
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_iec559 = false);
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_bounded = false);
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_modulo = false);
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, traps = false);
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, tinyness_before = false);
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static __number _STLP_CALL epsilon() _STLP_NOTHROW     { return __number(); }
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static __number _STLP_CALL round_error() _STLP_NOTHROW { return __number(); }
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static __number _STLP_CALL infinity() _STLP_NOTHROW      { return __number(); }
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static __number _STLP_CALL quiet_NaN() _STLP_NOTHROW     { return __number(); }
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static __number _STLP_CALL signaling_NaN() _STLP_NOTHROW { return __number(); }
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static __number _STLP_CALL denorm_min() _STLP_NOTHROW    { return __number(); }
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Base class for integers.
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  ifdef _STLP_LONG_LONG
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_LIMITS_MIN_TYPE _STLP_LONG_LONG
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_LIMITS_MAX_TYPE unsigned _STLP_LONG_LONG
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_LIMITS_MIN_TYPE long
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define _STLP_LIMITS_MAX_TYPE unsigned long
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_LIMITS_MIN_TYPE _Int
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_LIMITS_MAX_TYPE _Int
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Int,
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_LIMITS_MIN_TYPE __imin,
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_LIMITS_MAX_TYPE __imax,
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          int __idigits, bool __ismod>
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Integer_limits : public _Numeric_limits_base<_Int> {
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static _Int (_STLP_CALL min) () _STLP_NOTHROW { return (_Int)__imin; }
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static _Int (_STLP_CALL max) () _STLP_NOTHROW { return (_Int)__imax; }
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits = (__idigits < 0) ? ((int)((sizeof(_Int) * (CHAR_BIT))) - ((__imin == 0) ? 0 : 1)) : (__idigits));
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits10 = (digits * 301UL) / 1000);
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, radix = 2);
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_specialized = true);
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_signed = (__imin != 0));
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_integer = true);
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_exact = true);
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_bounded = true);
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_modulo = __ismod);
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Base class for floating-point numbers.
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class __number,
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         int __Digits, int __Digits10,
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         int __MinExp, int __MaxExp,
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         int __MinExp10, int __MaxExp10,
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         bool __IsIEC559,
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott         float_denorm_style __DenormStyle,
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         float_round_style __RoundStyle>
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Floating_limits : public _Numeric_limits_base<__number> {
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits = __Digits);
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits10 = __Digits10);
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, radix = FLT_RADIX);
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, min_exponent = __MinExp);
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, max_exponent = __MaxExp);
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, min_exponent10 = __MinExp10);
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, max_exponent10 = __MaxExp10);
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(float_denorm_style, has_denorm = __DenormStyle);
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(float_round_style, round_style = __RoundStyle);
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_specialized = true);
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_signed = true);
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_infinity = true);
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if (!defined (_STLP_MSVC) || (_STLP_MSVC > 1300)) && \
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    (!defined (__BORLANDC__) || (__BORLANDC__ >= 0x590)) && \
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    (!defined (_CRAY) || defined (_CRAYIEEE))
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_quiet_NaN = true);
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_signaling_NaN = true);
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_quiet_NaN = false);
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_signaling_NaN = false);
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_iec559 = __IsIEC559 && has_infinity && has_quiet_NaN && has_signaling_NaN && (has_denorm == denorm_present));
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, has_denorm_loss =  false);
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_bounded = true);
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, traps = true);
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, tinyness_before = false);
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Class numeric_limits
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The unspecialized class.
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate<class _Tp>
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits : public _STLP_PRIV _Numeric_limits_base<_Tp> {};
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Specializations for all built-in integral types.
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_BOOL)
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<bool>
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<bool, false, true, 1, false>
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_NO_BOOL */
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<char>
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<char, CHAR_MIN, CHAR_MAX, -1, true>
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_SIGNED_BUILTINS)
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<signed char>
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<signed char, SCHAR_MIN, SCHAR_MAX, -1, true>
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<unsigned char>
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<unsigned char, 0, UCHAR_MAX, -1, true>
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !(defined (_STLP_NO_WCHAR_T) || defined (_STLP_WCHAR_T_IS_USHORT))
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<wchar_t>
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<wchar_t, WCHAR_MIN, WCHAR_MAX, -1, true>
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<short>
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<short, SHRT_MIN, SHRT_MAX, -1, true>
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<unsigned short>
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<unsigned short, 0, USHRT_MAX, -1, true>
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (__xlC__) && (__xlC__ == 0x500)
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef INT_MIN
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define INT_MIN -2147483648
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<int>
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<int, INT_MIN, INT_MAX, -1, true>
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<unsigned int>
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<unsigned int, 0, UINT_MAX, -1, true>
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<long>
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<long, LONG_MIN, LONG_MAX, -1, true>
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<unsigned long>
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<unsigned long, 0, ULONG_MAX, -1, true>
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_LONG_LONG)
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_MSVC) || defined (__BORLANDC__)
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define LONGLONG_MAX     0x7fffffffffffffffi64
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define LONGLONG_MIN     (-LONGLONG_MAX-1i64)
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define ULONGLONG_MAX    0xffffffffffffffffUi64
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    ifndef LONGLONG_MAX
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#      define LONGLONG_MAX   0x7fffffffffffffffLL
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    endif
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    ifndef LONGLONG_MIN
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#      define LONGLONG_MIN   (-LONGLONG_MAX-1LL)
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    endif
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    ifndef ULONGLONG_MAX
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#      define ULONGLONG_MAX  0xffffffffffffffffULL
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    endif
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ <= 96) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 3)
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<_STLP_LONG_LONG>
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<_STLP_LONG_LONG, LONGLONG_MIN, LONGLONG_MAX, -1, true>
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<unsigned _STLP_LONG_LONG>
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Integer_limits<unsigned _STLP_LONG_LONG, 0, ULONGLONG_MAX, -1, true>
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{};
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else /* gcc 2.97 (after 2000-11-01), 2.98, 3.0 */
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block newest gcc has new mangling scheme, that has problem
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block with generating name [instantiated] of template specialization like
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Integer_limits<_STLP_LONG_LONG, LONGLONG_MIN, LONGLONG_MAX, -1, true>
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                  ~~~~~~~~~~~~  ~~~~~~~~~~~~
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block Below is code that solve this problem.
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block   - ptr
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<_STLP_LONG_LONG>
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Numeric_limits_base<_STLP_LONG_LONG> {
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static _STLP_LONG_LONG (_STLP_CALL min) () _STLP_NOTHROW { return LONGLONG_MIN; }
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static _STLP_LONG_LONG (_STLP_CALL max) () _STLP_NOTHROW { return LONGLONG_MAX; }
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits = ((int)((sizeof(_STLP_LONG_LONG) * (CHAR_BIT))) - 1));
304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits10 = (digits * 301UL) / 1000);
305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, radix = 2);
306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_specialized = true);
307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_signed = true);
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_integer = true);
309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_exact = true);
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_bounded = true);
311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_modulo = true);
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<unsigned _STLP_LONG_LONG>
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Numeric_limits_base<unsigned _STLP_LONG_LONG> {
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static unsigned _STLP_LONG_LONG (_STLP_CALL min) () _STLP_NOTHROW { return 0ULL; }
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static unsigned _STLP_LONG_LONG (_STLP_CALL max) () _STLP_NOTHROW { return ULONGLONG_MAX; }
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits = ((int)((sizeof(unsigned _STLP_LONG_LONG) * (CHAR_BIT)))));
323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, digits10 = (digits * 301UL) / 1000);
324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(int, radix = 2);
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_specialized = true);
326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_signed = false);
327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_integer = true);
328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_exact = true);
329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_bounded = true);
330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_modulo = true);
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif /* __GNUC__ > 2000-11-01 */
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_LONG_LONG */
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Specializations for all built-in floating-point types.
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class __dummy>
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _LimG {
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static float _STLP_CALL get_F_inf();
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static float _STLP_CALL get_F_qNaN();
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static float _STLP_CALL get_F_sNaN();
346e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static float _STLP_CALL get_F_denormMin();
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static double _STLP_CALL get_D_inf();
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static double _STLP_CALL get_D_qNaN();
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static double _STLP_CALL get_D_sNaN();
350e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static double _STLP_CALL get_D_denormMin();
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_LONG_DOUBLE)
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static long double _STLP_CALL get_LD_inf();
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static long double _STLP_CALL get_LD_qNaN();
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static long double _STLP_CALL get_LD_sNaN();
356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long double _STLP_CALL get_LD_denormMin();
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_TEMPLATE_EXPORT)
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_EXPORT_TEMPLATE_CLASS _LimG<bool>;
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
364e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__GNUC__)
365e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (__FLT_DENORM_MIN__)
366e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_FLT_DENORM_MIN __FLT_DENORM_MIN__
367e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
368e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_FLT_DENORM_STYLE denorm_absent
369e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
370e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (__DBL_DENORM_MIN__)
371e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_DBL_DENORM_MIN __DBL_DENORM_MIN__
372e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_DBL_DENORM_STYLE denorm_absent
374e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
375e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (__LDBL_DENORM_MIN__)
376e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_LDBL_DENORM_MIN __LDBL_DENORM_MIN__
377e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
378e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_LDBL_DENORM_STYLE denorm_absent
379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
380e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
381e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
382e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* If compiler do not expose thanks to some macro its status regarding
383e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * denormalized floating point numbers, we consider that denormalization
384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * is present. Unit tests will tell us if compiler do not support them. */
385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_FLT_DENORM_STYLE)
386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_FLT_DENORM_STYLE denorm_present
387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
388e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
389e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_DBL_DENORM_STYLE)
390e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_DBL_DENORM_STYLE denorm_present
391e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
392e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
393e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_LDBL_DENORM_STYLE)
394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_LDBL_DENORM_STYLE denorm_present
395e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
396e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<float>
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Floating_limits<float,
402e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       FLT_MANT_DIG,   // Binary digits of precision
403e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       FLT_DIG,        // Decimal digits of precision
404e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       FLT_MIN_EXP,    // Minimum exponent
405e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       FLT_MAX_EXP,    // Maximum exponent
406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       FLT_MIN_10_EXP, // Minimum base 10 exponent
407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       FLT_MAX_10_EXP, // Maximum base 10 exponent
408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       true,
409e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       _STLP_FLT_DENORM_STYLE,
410e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       round_to_nearest> {
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static float (_STLP_CALL min) () _STLP_NOTHROW { return FLT_MIN; }
413e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static float _STLP_CALL denorm_min() _STLP_NOTHROW
414e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_FLT_DENORM_MIN)
415e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_FLT_DENORM_MIN; }
416e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
417e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_FLT_DENORM_STYLE ? _STLP_PRIV _LimG<bool>::get_F_denormMin() : FLT_MIN; }
418e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
419e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static float (_STLP_CALL max) () _STLP_NOTHROW { return FLT_MAX; }
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static float _STLP_CALL epsilon() _STLP_NOTHROW { return FLT_EPSILON; }
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static float _STLP_CALL round_error() _STLP_NOTHROW { return 0.5f; } // Units: ulps.
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static  float _STLP_CALL infinity() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_F_inf(); }
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static  float _STLP_CALL quiet_NaN() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_F_qNaN(); }
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static  float _STLP_CALL signaling_NaN() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_F_sNaN(); }
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
427e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#undef _STLP_FLT_DENORM_MIN
428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#undef _STLP_FLT_DNORM_STYLE
429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<double>
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Floating_limits<double,
433e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       DBL_MANT_DIG,   // Binary digits of precision
434e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       DBL_DIG,        // Decimal digits of precision
435e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       DBL_MIN_EXP,    // Minimum exponent
436e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       DBL_MAX_EXP,    // Maximum exponent
437e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       DBL_MIN_10_EXP, // Minimum base 10 exponent
438e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       DBL_MAX_10_EXP, // Maximum base 10 exponent
439e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       true,
440e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       _STLP_DBL_DENORM_STYLE,
441e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       round_to_nearest> {
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static double (_STLP_CALL min)() _STLP_NOTHROW { return DBL_MIN; }
444e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static double _STLP_CALL denorm_min() _STLP_NOTHROW
445e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_DBL_DENORM_MIN)
446e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_DBL_DENORM_MIN; }
447e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
448e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_DBL_DENORM_STYLE ? _STLP_PRIV _LimG<bool>::get_D_denormMin() : DBL_MIN; }
449e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
450e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static double (_STLP_CALL max)() _STLP_NOTHROW { return DBL_MAX; }
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static double _STLP_CALL epsilon() _STLP_NOTHROW { return DBL_EPSILON; }
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static double _STLP_CALL round_error() _STLP_NOTHROW { return 0.5; } // Units: ulps.
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static  double _STLP_CALL infinity() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_D_inf(); }
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static  double _STLP_CALL quiet_NaN() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_D_qNaN(); }
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static  double _STLP_CALL signaling_NaN() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_D_sNaN(); }
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_LONG_DOUBLE)
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass numeric_limits<long double>
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  : public _STLP_PRIV _Floating_limits<long double,
463e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       LDBL_MANT_DIG,  // Binary digits of precision
464e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       LDBL_DIG,       // Decimal digits of precision
465e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       LDBL_MIN_EXP,   // Minimum exponent
466e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       LDBL_MAX_EXP,   // Maximum exponent
467e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       LDBL_MIN_10_EXP,// Minimum base 10 exponent
468e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       LDBL_MAX_10_EXP,// Maximum base 10 exponent
469e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       false,          // do not conform to iec559
470e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       _STLP_LDBL_DENORM_STYLE,
471e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                       round_to_nearest> {
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
473e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long double (_STLP_CALL min) () _STLP_NOTHROW { return LDBL_MIN; }
474e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long double _STLP_CALL denorm_min() _STLP_NOTHROW
475e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_LDBL_DENORM_MIN)
476e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_LDBL_DENORM_MIN; }
477e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
478e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_LDBL_DENORM_STYLE ? _STLP_PRIV _LimG<bool>::get_LD_denormMin() : LDBL_MIN; }
479e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
480e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _STLP_STATIC_CONSTANT(bool, is_iec559 = false);
481e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long double (_STLP_CALL max) () _STLP_NOTHROW { return LDBL_MAX; }
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  static long double _STLP_CALL epsilon() _STLP_NOTHROW { return LDBL_EPSILON; }
483e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long double _STLP_CALL round_error() _STLP_NOTHROW { return 0.5l; }
484e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long double _STLP_CALL infinity() _STLP_NOTHROW
485e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //For MSVC, long double is nothing more than an alias for double.
486e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_MSVC)
487e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_PRIV _LimG<bool>::get_LD_inf(); }
488e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
489e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_PRIV _LimG<bool>::get_D_inf(); }
490e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
491e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long double _STLP_CALL quiet_NaN() _STLP_NOTHROW
492e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_MSVC)
493e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_PRIV _LimG<bool>::get_LD_qNaN(); }
494e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
495e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_PRIV _LimG<bool>::get_D_qNaN(); }
496e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
497e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long double _STLP_CALL signaling_NaN() _STLP_NOTHROW
498e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_MSVC)
499e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_PRIV _LimG<bool>::get_LD_sNaN(); }
500e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
501e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  { return _STLP_PRIV _LimG<bool>::get_D_sNaN(); }
502e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// We write special values (Inf and NaN) as bit patterns and
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// cast the the appropriate floating-point types.
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION)
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_limits.c>
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
520