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