xref: /reactos/sdk/include/c++/stlport/stl/_limits.h (revision 4561998a)
1 /*
2  * Copyright (c) 1997
3  * Silicon Graphics Computer Systems, Inc.
4  *
5  * Copyright (c) 1999
6  * Boris Fomitchev
7  *
8  * This material is provided "as is", with absolutely no warranty expressed
9  * or implied. Any use is at your own risk.
10  *
11  * Permission to use or copy this software for any purpose is hereby granted
12  * without fee, provided the above notices are retained on all copies.
13  * Permission to modify the code and to distribute modified code is granted,
14  * provided the above notices are retained, and a notice that the code was
15  * modified is included with the above copyright notice.
16  *
17  */
18 
19 /* NOTE: This may be not portable code. Parts of numeric_limits<> are
20  * inherently machine-dependent.  At present this file is suitable
21  * for the MIPS, SPARC, Alpha and ia32 architectures.
22  */
23 
24 #ifndef _STLP_INTERNAL_LIMITS
25 #define _STLP_INTERNAL_LIMITS
26 
27 #ifndef _STLP_CLIMITS
28 #  include <climits>
29 #endif
30 
31 #ifndef _STLP_CFLOAT
32 #  include <cfloat>
33 #endif
34 
35 #if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_INTERNAL_CWCHAR)
36 #  include <stl/_cwchar.h>
37 #endif
38 
39 _STLP_BEGIN_NAMESPACE
40 
41 enum float_round_style {
42   round_indeterminate       = -1,
43   round_toward_zero         =  0,
44   round_to_nearest          =  1,
45   round_toward_infinity     =  2,
46   round_toward_neg_infinity =  3
47 };
48 
49 enum float_denorm_style {
50   denorm_indeterminate = -1,
51   denorm_absent        =  0,
52   denorm_present       =  1
53 };
54 
55 #ifdef min
56 # undef min
57 #endif
58 #ifdef max
59 # undef max
60 #endif
61 
62 _STLP_MOVE_TO_PRIV_NAMESPACE
63 
64 // Base class for all specializations of numeric_limits.
65 template <class __number>
66 class _Numeric_limits_base {
67 public:
68 
69   static __number _STLP_CALL min() _STLP_NOTHROW { return __number(); }
70   static __number _STLP_CALL max() _STLP_NOTHROW { return __number(); }
71 
72   _STLP_STATIC_CONSTANT(int, digits = 0);
73   _STLP_STATIC_CONSTANT(int, digits10 = 0);
74   _STLP_STATIC_CONSTANT(int, radix = 0);
75   _STLP_STATIC_CONSTANT(int, min_exponent = 0);
76   _STLP_STATIC_CONSTANT(int, min_exponent10 = 0);
77   _STLP_STATIC_CONSTANT(int, max_exponent = 0);
78   _STLP_STATIC_CONSTANT(int, max_exponent10 = 0);
79 
80   _STLP_STATIC_CONSTANT(float_denorm_style, has_denorm = denorm_absent);
81   _STLP_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero);
82 
83   _STLP_STATIC_CONSTANT(bool, is_specialized = false);
84   _STLP_STATIC_CONSTANT(bool, is_signed  = false);
85   _STLP_STATIC_CONSTANT(bool, is_integer = false);
86   _STLP_STATIC_CONSTANT(bool, is_exact = false);
87   _STLP_STATIC_CONSTANT(bool, has_infinity = false);
88   _STLP_STATIC_CONSTANT(bool, has_quiet_NaN = false);
89   _STLP_STATIC_CONSTANT(bool, has_signaling_NaN = false);
90   _STLP_STATIC_CONSTANT(bool, has_denorm_loss = false);
91   _STLP_STATIC_CONSTANT(bool, is_iec559 = false);
92   _STLP_STATIC_CONSTANT(bool, is_bounded = false);
93   _STLP_STATIC_CONSTANT(bool, is_modulo = false);
94   _STLP_STATIC_CONSTANT(bool, traps = false);
95   _STLP_STATIC_CONSTANT(bool, tinyness_before = false);
96 
97   static __number _STLP_CALL epsilon() _STLP_NOTHROW     { return __number(); }
98   static __number _STLP_CALL round_error() _STLP_NOTHROW { return __number(); }
99 
100   static __number _STLP_CALL infinity() _STLP_NOTHROW      { return __number(); }
101   static __number _STLP_CALL quiet_NaN() _STLP_NOTHROW     { return __number(); }
102   static __number _STLP_CALL signaling_NaN() _STLP_NOTHROW { return __number(); }
103   static __number _STLP_CALL denorm_min() _STLP_NOTHROW    { return __number(); }
104 };
105 
106 // Base class for integers.
107 
108 #ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
109 #  ifdef _STLP_LONG_LONG
110 #    define _STLP_LIMITS_MIN_TYPE _STLP_LONG_LONG
111 #    define _STLP_LIMITS_MAX_TYPE unsigned _STLP_LONG_LONG
112 #  else
113 #    define _STLP_LIMITS_MIN_TYPE long
114 #    define _STLP_LIMITS_MAX_TYPE unsigned long
115 #  endif
116 #else
117 #  define _STLP_LIMITS_MIN_TYPE _Int
118 #  define _STLP_LIMITS_MAX_TYPE _Int
119 #endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
120 
121 template <class _Int,
122           _STLP_LIMITS_MIN_TYPE __imin,
123           _STLP_LIMITS_MAX_TYPE __imax,
124           int __idigits, bool __ismod>
125 class _Integer_limits : public _Numeric_limits_base<_Int> {
126 public:
127 
128   static _Int _STLP_CALL min () _STLP_NOTHROW { return (_Int)__imin; }
129   static _Int _STLP_CALL max () _STLP_NOTHROW { return (_Int)__imax; }
130 
131   _STLP_STATIC_CONSTANT(int, digits = (__idigits < 0) ? ((int)((sizeof(_Int) * (CHAR_BIT))) - ((__imin == 0) ? 0 : 1)) : (__idigits));
132   _STLP_STATIC_CONSTANT(int, digits10 = (digits * 301UL) / 1000);
133   _STLP_STATIC_CONSTANT(int, radix = 2);
134   _STLP_STATIC_CONSTANT(bool, is_specialized = true);
135   _STLP_STATIC_CONSTANT(bool, is_signed = (__imin != 0));
136   _STLP_STATIC_CONSTANT(bool, is_integer = true);
137   _STLP_STATIC_CONSTANT(bool, is_exact = true);
138   _STLP_STATIC_CONSTANT(bool, is_bounded = true);
139   _STLP_STATIC_CONSTANT(bool, is_modulo = __ismod);
140 };
141 
142 // Base class for floating-point numbers.
143 template <class __number,
144          int __Digits, int __Digits10,
145          int __MinExp, int __MaxExp,
146          int __MinExp10, int __MaxExp10,
147          bool __IsIEC559,
148          float_denorm_style __DenormStyle,
149          float_round_style __RoundStyle>
150 class _Floating_limits : public _Numeric_limits_base<__number> {
151 public:
152 
153   _STLP_STATIC_CONSTANT(int, digits = __Digits);
154   _STLP_STATIC_CONSTANT(int, digits10 = __Digits10);
155   _STLP_STATIC_CONSTANT(int, radix = FLT_RADIX);
156   _STLP_STATIC_CONSTANT(int, min_exponent = __MinExp);
157   _STLP_STATIC_CONSTANT(int, max_exponent = __MaxExp);
158   _STLP_STATIC_CONSTANT(int, min_exponent10 = __MinExp10);
159   _STLP_STATIC_CONSTANT(int, max_exponent10 = __MaxExp10);
160 
161   _STLP_STATIC_CONSTANT(float_denorm_style, has_denorm = __DenormStyle);
162   _STLP_STATIC_CONSTANT(float_round_style, round_style = __RoundStyle);
163 
164   _STLP_STATIC_CONSTANT(bool, is_specialized = true);
165   _STLP_STATIC_CONSTANT(bool, is_signed = true);
166 
167   _STLP_STATIC_CONSTANT(bool, has_infinity = true);
168 #if (!defined (_STLP_MSVC) || (_STLP_MSVC > 1300)) && \
169     (!defined (__BORLANDC__) || (__BORLANDC__ >= 0x590)) && \
170     (!defined (_CRAY) || defined (_CRAYIEEE))
171   _STLP_STATIC_CONSTANT(bool, has_quiet_NaN = true);
172   _STLP_STATIC_CONSTANT(bool, has_signaling_NaN = true);
173 #else
174   _STLP_STATIC_CONSTANT(bool, has_quiet_NaN = false);
175   _STLP_STATIC_CONSTANT(bool, has_signaling_NaN = false);
176 #endif
177 
178   _STLP_STATIC_CONSTANT(bool, is_iec559 = __IsIEC559 && has_infinity && has_quiet_NaN && has_signaling_NaN && (has_denorm == denorm_present));
179   _STLP_STATIC_CONSTANT(bool, has_denorm_loss =  false);
180   _STLP_STATIC_CONSTANT(bool, is_bounded = true);
181   _STLP_STATIC_CONSTANT(bool, traps = true);
182   _STLP_STATIC_CONSTANT(bool, tinyness_before = false);
183 };
184 
185 _STLP_MOVE_TO_STD_NAMESPACE
186 
187 // Class numeric_limits
188 
189 // The unspecialized class.
190 
191 template<class _Tp>
192 class numeric_limits : public _STLP_PRIV _Numeric_limits_base<_Tp> {};
193 
194 // Specializations for all built-in integral types.
195 
196 #if !defined (_STLP_NO_BOOL)
197 _STLP_TEMPLATE_NULL
198 class numeric_limits<bool>
199   : public _STLP_PRIV _Integer_limits<bool, false, true, 1, false>
200 {};
201 #endif /* _STLP_NO_BOOL */
202 
203 _STLP_TEMPLATE_NULL
204 class numeric_limits<char>
205   : public _STLP_PRIV _Integer_limits<char, CHAR_MIN, CHAR_MAX, -1, true>
206 {};
207 
208 #if !defined (_STLP_NO_SIGNED_BUILTINS)
209 _STLP_TEMPLATE_NULL
210 class numeric_limits<signed char>
211   : public _STLP_PRIV _Integer_limits<signed char, SCHAR_MIN, SCHAR_MAX, -1, true>
212 {};
213 #endif
214 
215 _STLP_TEMPLATE_NULL
216 class numeric_limits<unsigned char>
217   : public _STLP_PRIV _Integer_limits<unsigned char, 0, UCHAR_MAX, -1, true>
218 {};
219 
220 #if !(defined (_STLP_NO_WCHAR_T) || defined (_STLP_WCHAR_T_IS_USHORT))
221 
222 _STLP_TEMPLATE_NULL
223 class numeric_limits<wchar_t>
224   : public _STLP_PRIV _Integer_limits<wchar_t, WCHAR_MIN, WCHAR_MAX, -1, true>
225 {};
226 
227 #endif
228 
229 _STLP_TEMPLATE_NULL
230 class numeric_limits<short>
231   : public _STLP_PRIV _Integer_limits<short, SHRT_MIN, SHRT_MAX, -1, true>
232 {};
233 
234 _STLP_TEMPLATE_NULL
235 class numeric_limits<unsigned short>
236   : public _STLP_PRIV _Integer_limits<unsigned short, 0, USHRT_MAX, -1, true>
237 {};
238 
239 #if defined (__xlC__) && (__xlC__ == 0x500)
240 #  undef INT_MIN
241 #  define INT_MIN -2147483648
242 #endif
243 
244 _STLP_TEMPLATE_NULL
245 class numeric_limits<int>
246   : public _STLP_PRIV _Integer_limits<int, INT_MIN, INT_MAX, -1, true>
247 {};
248 
249 _STLP_TEMPLATE_NULL
250 class numeric_limits<unsigned int>
251   : public _STLP_PRIV _Integer_limits<unsigned int, 0, UINT_MAX, -1, true>
252 {};
253 
254 _STLP_TEMPLATE_NULL
255 class numeric_limits<long>
256   : public _STLP_PRIV _Integer_limits<long, LONG_MIN, LONG_MAX, -1, true>
257 {};
258 
259 _STLP_TEMPLATE_NULL
260 class numeric_limits<unsigned long>
261   : public _STLP_PRIV _Integer_limits<unsigned long, 0, ULONG_MAX, -1, true>
262 {};
263 
264 #if defined (_STLP_LONG_LONG)
265 
266 #  if defined (_STLP_MSVC) || defined (__BORLANDC__)
267 #    define LONGLONG_MAX     0x7fffffffffffffffi64
268 #    define LONGLONG_MIN     (-LONGLONG_MAX-1i64)
269 #    define ULONGLONG_MAX    0xffffffffffffffffUi64
270 #  else
271 #    ifndef LONGLONG_MAX
272 #      define LONGLONG_MAX   0x7fffffffffffffffLL
273 #    endif
274 #    ifndef LONGLONG_MIN
275 #      define LONGLONG_MIN   (-LONGLONG_MAX-1LL)
276 #    endif
277 #    ifndef ULONGLONG_MAX
278 #      define ULONGLONG_MAX  0xffffffffffffffffULL
279 #    endif
280 #  endif
281 
282 #  if !defined (__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ <= 96) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 3)
283 
284 _STLP_TEMPLATE_NULL
285 class numeric_limits<_STLP_LONG_LONG>
286   : public _STLP_PRIV _Integer_limits<_STLP_LONG_LONG, LONGLONG_MIN, LONGLONG_MAX, -1, true>
287 {};
288 
289 _STLP_TEMPLATE_NULL
290 class numeric_limits<unsigned _STLP_LONG_LONG>
291   : public _STLP_PRIV _Integer_limits<unsigned _STLP_LONG_LONG, 0, ULONGLONG_MAX, -1, true>
292 {};
293 #  else /* gcc 2.97 (after 2000-11-01), 2.98, 3.0 */
294 /*
295  newest gcc has new mangling scheme, that has problem
296  with generating name [instantiated] of template specialization like
297  _Integer_limits<_STLP_LONG_LONG, LONGLONG_MIN, LONGLONG_MAX, -1, true>
298                                   ~~~~~~~~~~~~  ~~~~~~~~~~~~
299  Below is code that solve this problem.
300    - ptr
301  */
302 _STLP_TEMPLATE_NULL
303 class numeric_limits<_STLP_LONG_LONG>
304   : public _STLP_PRIV _Numeric_limits_base<_STLP_LONG_LONG> {
305 public:
306 
307   static _STLP_LONG_LONG (_STLP_CALL min) () _STLP_NOTHROW { return LONGLONG_MIN; }
308   static _STLP_LONG_LONG (_STLP_CALL max) () _STLP_NOTHROW { return LONGLONG_MAX; }
309 
310   _STLP_STATIC_CONSTANT(int, digits = ((int)((sizeof(_STLP_LONG_LONG) * (CHAR_BIT))) - 1));
311   _STLP_STATIC_CONSTANT(int, digits10 = (digits * 301UL) / 1000);
312   _STLP_STATIC_CONSTANT(int, radix = 2);
313   _STLP_STATIC_CONSTANT(bool, is_specialized = true);
314   _STLP_STATIC_CONSTANT(bool, is_signed = true);
315   _STLP_STATIC_CONSTANT(bool, is_integer = true);
316   _STLP_STATIC_CONSTANT(bool, is_exact = true);
317   _STLP_STATIC_CONSTANT(bool, is_bounded = true);
318   _STLP_STATIC_CONSTANT(bool, is_modulo = true);
319 };
320 
321 _STLP_TEMPLATE_NULL
322 class numeric_limits<unsigned _STLP_LONG_LONG>
323   : public _STLP_PRIV _Numeric_limits_base<unsigned _STLP_LONG_LONG> {
324 public:
325 
326   static unsigned _STLP_LONG_LONG (_STLP_CALL min) () _STLP_NOTHROW { return 0ULL; }
327   static unsigned _STLP_LONG_LONG (_STLP_CALL max) () _STLP_NOTHROW { return ULONGLONG_MAX; }
328 
329   _STLP_STATIC_CONSTANT(int, digits = ((int)((sizeof(unsigned _STLP_LONG_LONG) * (CHAR_BIT)))));
330   _STLP_STATIC_CONSTANT(int, digits10 = (digits * 301UL) / 1000);
331   _STLP_STATIC_CONSTANT(int, radix = 2);
332   _STLP_STATIC_CONSTANT(bool, is_specialized = true);
333   _STLP_STATIC_CONSTANT(bool, is_signed = false);
334   _STLP_STATIC_CONSTANT(bool, is_integer = true);
335   _STLP_STATIC_CONSTANT(bool, is_exact = true);
336   _STLP_STATIC_CONSTANT(bool, is_bounded = true);
337   _STLP_STATIC_CONSTANT(bool, is_modulo = true);
338 };
339 
340 #  endif /* __GNUC__ > 2000-11-01 */
341 
342 #endif /* _STLP_LONG_LONG */
343 
344 _STLP_MOVE_TO_PRIV_NAMESPACE
345 
346 // Specializations for all built-in floating-point types.
347 template <class __dummy>
348 class _LimG {
349 public:
350   static float _STLP_CALL get_F_inf();
351   static float _STLP_CALL get_F_qNaN();
352   static float _STLP_CALL get_F_sNaN();
353   static float _STLP_CALL get_F_denormMin();
354   static double _STLP_CALL get_D_inf();
355   static double _STLP_CALL get_D_qNaN();
356   static double _STLP_CALL get_D_sNaN();
357   static double _STLP_CALL get_D_denormMin();
358 
359 #if !defined (_STLP_NO_LONG_DOUBLE)
360   static long double _STLP_CALL get_LD_inf();
361   static long double _STLP_CALL get_LD_qNaN();
362   static long double _STLP_CALL get_LD_sNaN();
363   static long double _STLP_CALL get_LD_denormMin();
364 #endif
365 };
366 
367 #if defined (_STLP_USE_TEMPLATE_EXPORT)
368 _STLP_EXPORT_TEMPLATE_CLASS _LimG<bool>;
369 #endif
370 
371 #if defined (__GNUC__)
372 #  if defined (__FLT_DENORM_MIN__)
373 #    define _STLP_FLT_DENORM_MIN __FLT_DENORM_MIN__
374 #  else
375 #    define _STLP_FLT_DENORM_STYLE denorm_absent
376 #  endif
377 #  if defined (__DBL_DENORM_MIN__)
378 #    define _STLP_DBL_DENORM_MIN __DBL_DENORM_MIN__
379 #  else
380 #    define _STLP_DBL_DENORM_STYLE denorm_absent
381 #  endif
382 #  if defined (__LDBL_DENORM_MIN__)
383 #    define _STLP_LDBL_DENORM_MIN __LDBL_DENORM_MIN__
384 #  else
385 #    define _STLP_LDBL_DENORM_STYLE denorm_absent
386 #  endif
387 #endif
388 
389 /* If compiler do not expose thanks to some macro its status regarding
390  * denormalized floating point numbers, we consider that denormalization
391  * is present. Unit tests will tell us if compiler do not support them. */
392 #if !defined (_STLP_FLT_DENORM_STYLE)
393 #  define _STLP_FLT_DENORM_STYLE denorm_present
394 #endif
395 
396 #if !defined (_STLP_DBL_DENORM_STYLE)
397 #  define _STLP_DBL_DENORM_STYLE denorm_present
398 #endif
399 
400 #if !defined (_STLP_LDBL_DENORM_STYLE)
401 #  define _STLP_LDBL_DENORM_STYLE denorm_present
402 #endif
403 
404 _STLP_MOVE_TO_STD_NAMESPACE
405 
406 _STLP_TEMPLATE_NULL
407 class numeric_limits<float>
408   : public _STLP_PRIV _Floating_limits<float,
409                                        FLT_MANT_DIG,   // Binary digits of precision
410                                        FLT_DIG,        // Decimal digits of precision
411                                        FLT_MIN_EXP,    // Minimum exponent
412                                        FLT_MAX_EXP,    // Maximum exponent
413                                        FLT_MIN_10_EXP, // Minimum base 10 exponent
414                                        FLT_MAX_10_EXP, // Maximum base 10 exponent
415                                        true,
416                                        _STLP_FLT_DENORM_STYLE,
417                                        round_to_nearest> {
418 public:
419   static float (_STLP_CALL min) () _STLP_NOTHROW { return FLT_MIN; }
420   static float _STLP_CALL denorm_min() _STLP_NOTHROW
421 #if defined (_STLP_FLT_DENORM_MIN)
422   { return _STLP_FLT_DENORM_MIN; }
423 #else
424   { return _STLP_FLT_DENORM_STYLE ? _STLP_PRIV _LimG<bool>::get_F_denormMin() : FLT_MIN; }
425 #endif
426   static float (_STLP_CALL max) () _STLP_NOTHROW { return FLT_MAX; }
427   static float _STLP_CALL epsilon() _STLP_NOTHROW { return FLT_EPSILON; }
428   static float _STLP_CALL round_error() _STLP_NOTHROW { return 0.5f; } // Units: ulps.
429   static  float _STLP_CALL infinity() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_F_inf(); }
430   static  float _STLP_CALL quiet_NaN() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_F_qNaN(); }
431   static  float _STLP_CALL signaling_NaN() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_F_sNaN(); }
432 };
433 
434 #undef _STLP_FLT_DENORM_MIN
435 #undef _STLP_FLT_DNORM_STYLE
436 
437 _STLP_TEMPLATE_NULL
438 class numeric_limits<double>
439   : public _STLP_PRIV _Floating_limits<double,
440                                        DBL_MANT_DIG,   // Binary digits of precision
441                                        DBL_DIG,        // Decimal digits of precision
442                                        DBL_MIN_EXP,    // Minimum exponent
443                                        DBL_MAX_EXP,    // Maximum exponent
444                                        DBL_MIN_10_EXP, // Minimum base 10 exponent
445                                        DBL_MAX_10_EXP, // Maximum base 10 exponent
446                                        true,
447                                        _STLP_DBL_DENORM_STYLE,
448                                        round_to_nearest> {
449 public:
450   static double (_STLP_CALL min)() _STLP_NOTHROW { return DBL_MIN; }
451   static double _STLP_CALL denorm_min() _STLP_NOTHROW
452 #if defined (_STLP_DBL_DENORM_MIN)
453   { return _STLP_DBL_DENORM_MIN; }
454 #else
455   { return _STLP_DBL_DENORM_STYLE ? _STLP_PRIV _LimG<bool>::get_D_denormMin() : DBL_MIN; }
456 #endif
457   static double (_STLP_CALL max)() _STLP_NOTHROW { return DBL_MAX; }
458   static double _STLP_CALL epsilon() _STLP_NOTHROW { return DBL_EPSILON; }
459   static double _STLP_CALL round_error() _STLP_NOTHROW { return 0.5; } // Units: ulps.
460   static  double _STLP_CALL infinity() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_D_inf(); }
461   static  double _STLP_CALL quiet_NaN() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_D_qNaN(); }
462   static  double _STLP_CALL signaling_NaN() _STLP_NOTHROW { return _STLP_PRIV _LimG<bool>::get_D_sNaN(); }
463 };
464 
465 #if !defined (_STLP_NO_LONG_DOUBLE)
466 
467 _STLP_TEMPLATE_NULL
468 class numeric_limits<long double>
469   : public _STLP_PRIV _Floating_limits<long double,
470                                        LDBL_MANT_DIG,  // Binary digits of precision
471                                        LDBL_DIG,       // Decimal digits of precision
472                                        LDBL_MIN_EXP,   // Minimum exponent
473                                        LDBL_MAX_EXP,   // Maximum exponent
474                                        LDBL_MIN_10_EXP,// Minimum base 10 exponent
475                                        LDBL_MAX_10_EXP,// Maximum base 10 exponent
476                                        false,          // do not conform to iec559
477                                        _STLP_LDBL_DENORM_STYLE,
478                                        round_to_nearest> {
479 public:
480   static long double (_STLP_CALL min) () _STLP_NOTHROW { return LDBL_MIN; }
481   static long double _STLP_CALL denorm_min() _STLP_NOTHROW
482 #if defined (_STLP_LDBL_DENORM_MIN)
483   { return _STLP_LDBL_DENORM_MIN; }
484 #else
485   { return _STLP_LDBL_DENORM_STYLE ? _STLP_PRIV _LimG<bool>::get_LD_denormMin() : LDBL_MIN; }
486 #endif
487   _STLP_STATIC_CONSTANT(bool, is_iec559 = false);
488   static long double (_STLP_CALL max) () _STLP_NOTHROW { return LDBL_MAX; }
489   static long double _STLP_CALL epsilon() _STLP_NOTHROW { return LDBL_EPSILON; }
490   static long double _STLP_CALL round_error() _STLP_NOTHROW { return 0.5l; }
491   static long double _STLP_CALL infinity() _STLP_NOTHROW
492   //For MSVC, long double is nothing more than an alias for double.
493 #if !defined (_STLP_MSVC)
494   { return _STLP_PRIV _LimG<bool>::get_LD_inf(); }
495 #else
496   { return _STLP_PRIV _LimG<bool>::get_D_inf(); }
497 #endif
498   static long double _STLP_CALL quiet_NaN() _STLP_NOTHROW
499 #if !defined (_STLP_MSVC)
500   { return _STLP_PRIV _LimG<bool>::get_LD_qNaN(); }
501 #else
502   { return _STLP_PRIV _LimG<bool>::get_D_qNaN(); }
503 #endif
504   static long double _STLP_CALL signaling_NaN() _STLP_NOTHROW
505 #if !defined (_STLP_MSVC)
506   { return _STLP_PRIV _LimG<bool>::get_LD_sNaN(); }
507 #else
508   { return _STLP_PRIV _LimG<bool>::get_D_sNaN(); }
509 #endif
510 };
511 
512 #endif
513 
514 // We write special values (Inf and NaN) as bit patterns and
515 // cast the the appropriate floating-point types.
516 _STLP_END_NAMESPACE
517 
518 #if !defined (_STLP_LINK_TIME_INSTANTIATION)
519 #  include <stl/_limits.c>
520 #endif
521 
522 #endif
523 
524 // Local Variables:
525 // mode:C++
526 // End:
527