epoc32/include/tools/stlport/stl/_limits.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
/*
williamr@4
     2
 * Copyright (c) 1998,1999
williamr@4
     3
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     4
 *
williamr@4
     5
 * Copyright (c) 1999
williamr@4
     6
 * Boris Fomitchev
williamr@4
     7
 *
williamr@4
     8
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
     9
 * or implied. Any use is at your own risk.
williamr@4
    10
 *
williamr@4
    11
 * Permission to use or copy this software for any purpose is hereby granted
williamr@4
    12
 * without fee, provided the above notices are retained on all copies.
williamr@4
    13
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    14
 * provided the above notices are retained, and a notice that the code was
williamr@4
    15
 * modified is included with the above copyright notice.
williamr@4
    16
 *
williamr@4
    17
 */
williamr@4
    18
williamr@4
    19
#ifndef _STLP_LIMITS_C
williamr@4
    20
#define _STLP_LIMITS_C
williamr@4
    21
williamr@4
    22
#ifndef _STLP_INTERNAL_LIMITS
williamr@4
    23
#  include <stl/_limits.h>
williamr@4
    24
#endif
williamr@4
    25
williamr@4
    26
//==========================================================
williamr@4
    27
//  numeric_limits static members
williamr@4
    28
//==========================================================
williamr@4
    29
williamr@4
    30
_STLP_BEGIN_NAMESPACE
williamr@4
    31
williamr@4
    32
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    33
williamr@4
    34
#if !defined (_STLP_STATIC_CONST_INIT_BUG)
williamr@4
    35
williamr@4
    36
#  define __declare_numeric_base_member(__type, __mem, _Init) \
williamr@4
    37
template <class __number> \
williamr@4
    38
  const __type _Numeric_limits_base<__number>:: __mem
williamr@4
    39
williamr@4
    40
__declare_numeric_base_member(bool, is_specialized, false);
williamr@4
    41
__declare_numeric_base_member(int, digits, 0);
williamr@4
    42
__declare_numeric_base_member(int, digits10, 0);
williamr@4
    43
__declare_numeric_base_member(bool, is_signed, false);
williamr@4
    44
__declare_numeric_base_member(bool, is_integer, false);
williamr@4
    45
__declare_numeric_base_member(bool, is_exact, false);
williamr@4
    46
__declare_numeric_base_member(int, radix, 0);
williamr@4
    47
__declare_numeric_base_member(int, min_exponent, 0);
williamr@4
    48
__declare_numeric_base_member(int, max_exponent, 0);
williamr@4
    49
__declare_numeric_base_member(int, min_exponent10, 0);
williamr@4
    50
__declare_numeric_base_member(int, max_exponent10, 0);
williamr@4
    51
__declare_numeric_base_member(bool, has_infinity, false);
williamr@4
    52
__declare_numeric_base_member(bool, has_quiet_NaN, false);
williamr@4
    53
__declare_numeric_base_member(bool, has_signaling_NaN, false);
williamr@4
    54
__declare_numeric_base_member(float_denorm_style, has_denorm, denorm_absent);
williamr@4
    55
__declare_numeric_base_member(bool, has_denorm_loss, false);
williamr@4
    56
__declare_numeric_base_member(bool, is_iec559, false);
williamr@4
    57
__declare_numeric_base_member(bool, is_bounded, false);
williamr@4
    58
__declare_numeric_base_member(bool, is_modulo, false);
williamr@4
    59
__declare_numeric_base_member(bool, traps, false);
williamr@4
    60
__declare_numeric_base_member(bool, tinyness_before, false);
williamr@4
    61
__declare_numeric_base_member(float_round_style, round_style, round_toward_zero);
williamr@4
    62
williamr@4
    63
#  undef __declare_numeric_base_member
williamr@4
    64
williamr@4
    65
#  define __declare_integer_limits_member(__type, __mem, _Init) \
williamr@4
    66
template <class _Int, _STLP_LIMITS_MIN_TYPE __imin, _STLP_LIMITS_MAX_TYPE __imax, int __idigits, bool __ismod> \
williamr@4
    67
  const __type _Integer_limits<_Int, __imin, __imax, __idigits, __ismod>:: __mem
williamr@4
    68
williamr@4
    69
__declare_integer_limits_member(bool, is_specialized, true);
williamr@4
    70
__declare_integer_limits_member(int, digits, (__idigits < 0) ? \
williamr@4
    71
          ((int)((sizeof(_Int) * (CHAR_BIT))) - ((__imin == 0) ? 0 : 1)) \
williamr@4
    72
                            : (__idigits) );
williamr@4
    73
__declare_integer_limits_member(int, digits10, (int)(301UL * digits) /1000);
williamr@4
    74
__declare_integer_limits_member(bool, is_signed, __imin != 0);
williamr@4
    75
__declare_integer_limits_member(bool, is_integer, true);
williamr@4
    76
__declare_integer_limits_member(bool, is_exact, true);
williamr@4
    77
__declare_integer_limits_member(int, radix, 2);
williamr@4
    78
__declare_integer_limits_member(bool, is_bounded, true);
williamr@4
    79
__declare_integer_limits_member(bool, is_modulo, true);
williamr@4
    80
#  undef __declare_integer_limits_member
williamr@4
    81
williamr@4
    82
#  define __declare_float_limits_member(__type, __mem, _Init) \
williamr@4
    83
template <class __number,  \
williamr@4
    84
         int __Digits, int __Digits10,    \
williamr@4
    85
         int __MinExp, int __MaxExp,      \
williamr@4
    86
         int __MinExp10, int __MaxExp10,  \
williamr@4
    87
         bool __IsIEC559, \
williamr@4
    88
         float_round_style __RoundStyle> \
williamr@4
    89
const __type _Floating_limits< __number, __Digits, __Digits10,    \
williamr@4
    90
         __MinExp, __MaxExp, __MinExp10, __MaxExp10,  \
williamr@4
    91
         __IsIEC559, __RoundStyle>::\
williamr@4
    92
         __mem
williamr@4
    93
williamr@4
    94
__declare_float_limits_member(bool, is_specialized, true);
williamr@4
    95
__declare_float_limits_member(int, digits, __Digits);
williamr@4
    96
__declare_float_limits_member(int, digits10, __Digits10);
williamr@4
    97
__declare_float_limits_member(bool, is_signed, true);
williamr@4
    98
__declare_float_limits_member(int, radix, FLT_RADIX);
williamr@4
    99
__declare_float_limits_member(int, min_exponent, __MinExp);
williamr@4
   100
__declare_float_limits_member(int, max_exponent, __MaxExp);
williamr@4
   101
__declare_float_limits_member(int, min_exponent10, __MinExp10);
williamr@4
   102
__declare_float_limits_member(int, max_exponent10, __MaxExp10);
williamr@4
   103
__declare_float_limits_member(bool, has_infinity, true);
williamr@4
   104
__declare_float_limits_member(bool, has_quiet_NaN, true);
williamr@4
   105
__declare_float_limits_member(bool, has_signaling_NaN, true);
williamr@4
   106
__declare_float_limits_member(float_denorm_style, has_denorm, denorm_indeterminate);
williamr@4
   107
__declare_float_limits_member(bool, has_denorm_loss, false);
williamr@4
   108
__declare_float_limits_member(bool, is_iec559, __IsIEC559);
williamr@4
   109
__declare_float_limits_member(bool, is_bounded, true);
williamr@4
   110
__declare_float_limits_member(bool, traps, true);
williamr@4
   111
__declare_float_limits_member(bool, tinyness_before, false);
williamr@4
   112
__declare_float_limits_member(float_round_style, round_style, __RoundStyle);
williamr@4
   113
#  undef __declare_float_limits_member
williamr@4
   114
williamr@4
   115
#endif /* _STLP_STATIC_CONST_INIT_BUG */
williamr@4
   116
williamr@4
   117
williamr@4
   118
#if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
williamr@4
   119
williamr@4
   120
#  if defined (_STLP_BIG_ENDIAN)
williamr@4
   121
#    if defined (__OS400__)
williamr@4
   122
#      define _STLP_FLOAT_INF_REP { 0x7f80, 0 }
williamr@4
   123
#      define _STLP_FLOAT_QNAN_REP { 0xffc0, 0 }
williamr@4
   124
#      define _STLP_FLOAT_SNAN_REP { 0xff80, 0 }
williamr@4
   125
#      define _STLP_DOUBLE_INF_REP { 0x7ff0, 0, 0, 0 }
williamr@4
   126
#      define _STLP_DOUBLE_QNAN_REP { 0xfff8, 0, 0, 0 }
williamr@4
   127
#      define _STLP_DOUBLE_SNAN_REP { 0xfff0, 0, 0, 0 }
williamr@4
   128
#      define _STLP_LDOUBLE_INF_REP { 0x7ff0, 0, 0, 0, 0, 0, 0, 0 }
williamr@4
   129
#      define _STLP_LDOUBLE_QNAN_REP { 0xfff8, 0, 0, 0, 0, 0, 0, 0 }
williamr@4
   130
#      define _STLP_LDOUBLE_SNAN_REP { 0xfff0, 0, 0, 0, 0, 0, 0, 0 }
williamr@4
   131
#    else /* __OS400__ */
williamr@4
   132
#      define _STLP_FLOAT_INF_REP   { 0x7f80, 0 }
williamr@4
   133
#      define _STLP_FLOAT_QNAN_REP  { 0x7fc1, 0 }
williamr@4
   134
#      define _STLP_FLOAT_SNAN_REP  { 0x7f81, 0 }
williamr@4
   135
#      define _STLP_DOUBLE_INF_REP  { 0x7ff0, 0, 0, 0 }
williamr@4
   136
#      define _STLP_DOUBLE_QNAN_REP { 0x7ff9, 0, 0, 0 }
williamr@4
   137
#      define _STLP_DOUBLE_SNAN_REP { 0x7ff1, 0, 0, 0 }
williamr@4
   138
#      define _STLP_LDOUBLE_INF_REP { 0x7ff0, 0, 0, 0, 0, 0, 0, 0 }
williamr@4
   139
#      define _STLP_LDOUBLE_QNAN_REP { 0x7ff1, 0, 0, 0, 0, 0, 0, 0 }
williamr@4
   140
#      define _STLP_LDOUBLE_SNAN_REP { 0x7ff9, 0, 0, 0, 0, 0, 0, 0 }
williamr@4
   141
#    endif /* __OS400__ */
williamr@4
   142
williamr@4
   143
#  elif defined (_STLP_LITTLE_ENDIAN)
williamr@4
   144
williamr@4
   145
#    if 0 /* defined(_STLP_MSVC) || defined(__linux__) */
williamr@4
   146
// some IA-32 platform ??
williamr@4
   147
/*
williamr@4
   148
#      define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
williamr@4
   149
#      define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
williamr@4
   150
#      define _STLP_FLOAT_SNAN_REP { 0, 0xff80 }
williamr@4
   151
williamr@4
   152
#      define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
williamr@4
   153
#      define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 }
williamr@4
   154
#      define _STLP_DOUBLE_SNAN_REP { 0, 0, 0, 0xfff0 }
williamr@4
   155
#      define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x7FF0, 0 } // ????
williamr@4
   156
#      define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xFFF8, 0 } // ????
williamr@4
   157
#      define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xFFF0, 0 } // ????
williamr@4
   158
*/
williamr@4
   159
#    elif defined(__DECCXX)
williamr@4
   160
williamr@4
   161
#      define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
williamr@4
   162
#      define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
williamr@4
   163
#      define _STLP_FLOAT_SNAN_REP { 0x5555, 0x7f85 }
williamr@4
   164
williamr@4
   165
#      define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
williamr@4
   166
#      define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 }
williamr@4
   167
#      define _STLP_DOUBLE_SNAN_REP { 0x5555, 0x5555, 0x5555, 0x7ff5 }
williamr@4
   168
williamr@4
   169
#      define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0, 0, 0, 0, 0x7fff }
williamr@4
   170
#      define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0, 0, 0, 0x8000, 0xffff }
williamr@4
   171
#      define _STLP_LDOUBLE_SNAN_REP { 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x7fff}
williamr@4
   172
#    else
williamr@4
   173
#      define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
williamr@4
   174
#      define _STLP_FLOAT_QNAN_REP { 0, 0x7fc0 }
williamr@4
   175
#      define _STLP_FLOAT_SNAN_REP { 0, 0x7fa0 }
williamr@4
   176
#      define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
williamr@4
   177
#      define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0x7ff8 }
williamr@4
   178
#      define _STLP_DOUBLE_SNAN_REP { 0, 0, 0, 0x7ff4 }
williamr@4
   179
#      if defined (_STLP_MSVC) || defined (__ICL)
williamr@4
   180
#        define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x7FF0, 0 }
williamr@4
   181
#        define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xFFF8, 0 }
williamr@4
   182
#        define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xFFF8, 0 }
williamr@4
   183
#      elif defined (__BORLANDC__)
williamr@4
   184
#        define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x8000, 0x7fff }
williamr@4
   185
#        define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xc000, 0x7fff }
williamr@4
   186
#        define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xa000, 0x7fff }
williamr@4
   187
#      else
williamr@4
   188
#        define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x8000, 0x7fff, 0 }
williamr@4
   189
#        define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xa000, 0x7fff, 0 }
williamr@4
   190
#        define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xc000, 0x7fff, 0 }
williamr@4
   191
#      endif
williamr@4
   192
#    endif
williamr@4
   193
#  else
williamr@4
   194
/* This is an architecture we don't know how to handle. Return some
williamr@4
   195
obviously wrong values. */
williamr@4
   196
#    define _STLP_FLOAT_INF_REP { 0, 0 }
williamr@4
   197
#    define _STLP_FLOAT_QNAN_REP { 0, 0 }
williamr@4
   198
#    define _STLP_FLOAT_SNAN_REP { 0, 0 }
williamr@4
   199
#    define _STLP_DOUBLE_INF_REP { 0, 0 }
williamr@4
   200
#    define _STLP_DOUBLE_QNAN_REP { 0, 0 }
williamr@4
   201
#    define _STLP_DOUBLE_SNAN_REP { 0, 0 }
williamr@4
   202
#    define _STLP_LDOUBLE_INF_REP { 0 }
williamr@4
   203
#    define _STLP_LDOUBLE_QNAN_REP { 0 }
williamr@4
   204
#    define _STLP_LDOUBLE_SNAN_REP { 0 }
williamr@4
   205
williamr@4
   206
#  endif
williamr@4
   207
williamr@4
   208
#  if 0
williamr@4
   209
/*
williamr@4
   210
#    if defined(_STLP_BIG_ENDIAN)
williamr@4
   211
williamr@4
   212
#    elif defined (_STLP_LITTLE_ENDIAN)
williamr@4
   213
#    else
williamr@4
   214
williamr@4
   215
//This is an architecture we don't know how to handle.  Return some
williamr@4
   216
//obviously wrong values.
williamr@4
   217
#      define _STLP_FLOAT_INF_REP  { 0, 0 }
williamr@4
   218
#      define _STLP_FLOAT_QNAN_REP { 0, 0 }
williamr@4
   219
#      define _STLP_FLOAT_SNAN_REP { 0, 0 }
williamr@4
   220
#      define _STLP_DOUBLE_INF_REP  { 0, 0 }
williamr@4
   221
#      define _STLP_DOUBLE_QNAN_REP { 0, 0 }
williamr@4
   222
#      define _STLP_DOUBLE_SNAN_REP { 0, 0 }
williamr@4
   223
#      define _STLP_LDOUBLE_INF_REP  { 0 }
williamr@4
   224
#      define _STLP_LDOUBLE_QNAN_REP { 0 }
williamr@4
   225
#      define _STLP_LDOUBLE_SNAN_REP { 0 }
williamr@4
   226
#    endif
williamr@4
   227
*/
williamr@4
   228
#  endif
williamr@4
   229
williamr@4
   230
union _F_rep {
williamr@4
   231
  unsigned short rep[2];
williamr@4
   232
  float val;
williamr@4
   233
};
williamr@4
   234
union _D_rep {
williamr@4
   235
  unsigned short rep[4];
williamr@4
   236
  double val;
williamr@4
   237
};
williamr@4
   238
williamr@4
   239
#  ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   240
union _LD_rep {
williamr@4
   241
  unsigned short rep[8];
williamr@4
   242
  long double val;
williamr@4
   243
};
williamr@4
   244
#  endif
williamr@4
   245
williamr@4
   246
template <class __dummy>
williamr@4
   247
float _STLP_CALL _LimG<__dummy>::get_F_inf() {
williamr@4
   248
  _F_rep _F_inf = {_STLP_FLOAT_INF_REP};
williamr@4
   249
  return _F_inf.val;
williamr@4
   250
}
williamr@4
   251
template <class __dummy>
williamr@4
   252
float _STLP_CALL _LimG<__dummy>::get_F_qNaN() {
williamr@4
   253
  _F_rep _F_qNaN = {_STLP_FLOAT_QNAN_REP};
williamr@4
   254
  return _F_qNaN.val;
williamr@4
   255
}
williamr@4
   256
template <class __dummy>
williamr@4
   257
float _STLP_CALL _LimG<__dummy>::get_F_sNaN() {
williamr@4
   258
  _F_rep _F_sNaN = {_STLP_FLOAT_SNAN_REP};
williamr@4
   259
  return _F_sNaN.val;
williamr@4
   260
}
williamr@4
   261
williamr@4
   262
template <class __dummy>
williamr@4
   263
double _STLP_CALL _LimG<__dummy>::get_D_inf() {
williamr@4
   264
  _D_rep _D_inf = {_STLP_DOUBLE_INF_REP};
williamr@4
   265
  return _D_inf.val;
williamr@4
   266
}
williamr@4
   267
template <class __dummy>
williamr@4
   268
double _STLP_CALL _LimG<__dummy>::get_D_qNaN() {
williamr@4
   269
  _D_rep _D_qNaN = {_STLP_DOUBLE_QNAN_REP};
williamr@4
   270
  return _D_qNaN.val;
williamr@4
   271
}
williamr@4
   272
template <class __dummy>
williamr@4
   273
double _STLP_CALL _LimG<__dummy>::get_D_sNaN() {
williamr@4
   274
  _D_rep _D_sNaN = {_STLP_DOUBLE_SNAN_REP};
williamr@4
   275
  return _D_sNaN.val;
williamr@4
   276
}
williamr@4
   277
williamr@4
   278
#  if !defined (_STLP_NO_LONG_DOUBLE)
williamr@4
   279
template <class __dummy>
williamr@4
   280
long double _STLP_CALL _LimG<__dummy>::get_LD_inf() {
williamr@4
   281
  _LD_rep _LD_inf = {_STLP_LDOUBLE_INF_REP};
williamr@4
   282
  return _LD_inf.val;
williamr@4
   283
}
williamr@4
   284
template <class __dummy>
williamr@4
   285
long double _STLP_CALL _LimG<__dummy>::get_LD_qNaN() {
williamr@4
   286
  _LD_rep _LD_qNaN = {_STLP_LDOUBLE_QNAN_REP};
williamr@4
   287
  return _LD_qNaN.val;
williamr@4
   288
}
williamr@4
   289
template <class __dummy>
williamr@4
   290
long double _STLP_CALL _LimG<__dummy>::get_LD_sNaN() {
williamr@4
   291
  _LD_rep _LD_sNaN = {_STLP_LDOUBLE_SNAN_REP};
williamr@4
   292
  return _LD_sNaN.val;
williamr@4
   293
}
williamr@4
   294
#  endif /* _STLP_NO_LONG_DOUBLE */
williamr@4
   295
williamr@4
   296
#endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
williamr@4
   297
williamr@4
   298
#undef _STLP_LIMITS_MIN_TYPE
williamr@4
   299
#undef _STLP_LIMITS_MAX_TYPE
williamr@4
   300
williamr@4
   301
#undef _STLP_FLOAT_INF_REP
williamr@4
   302
#undef _STLP_FLOAT_QNAN_REP
williamr@4
   303
#undef _STLP_FLOAT_SNAN_REP
williamr@4
   304
#undef _STLP_DOUBLE_INF_REP
williamr@4
   305
#undef _STLP_DOUBLE_QNAN_REP
williamr@4
   306
#undef _STLP_DOUBLE_SNAN_REP
williamr@4
   307
#undef _STLP_LDOUBLE_INF_REP
williamr@4
   308
#undef _STLP_LDOUBLE_QNAN_REP
williamr@4
   309
#undef _STLP_LDOUBLE_SNAN_REP
williamr@4
   310
williamr@4
   311
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   312
williamr@4
   313
_STLP_END_NAMESPACE
williamr@4
   314
williamr@4
   315
#endif /* _STLP_LIMITS_C_INCLUDED */