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