/home/ntakagi/work/STLport-5.1.5/stlport/stl/_limits.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 1998,1999
00003  * Silicon Graphics Computer Systems, Inc.
00004  *
00005  * Copyright (c) 1999
00006  * Boris Fomitchev
00007  *
00008  * This material is provided "as is", with absolutely no warranty expressed
00009  * or implied. Any use is at your own risk.
00010  *
00011  * Permission to use or copy this software for any purpose is hereby granted
00012  * without fee, provided the above notices are retained on all copies.
00013  * Permission to modify the code and to distribute modified code is granted,
00014  * provided the above notices are retained, and a notice that the code was
00015  * modified is included with the above copyright notice.
00016  *
00017  */
00018 
00019 #ifndef _STLP_LIMITS_C
00020 #define _STLP_LIMITS_C
00021 
00022 #ifndef _STLP_INTERNAL_LIMITS
00023 #  include <stl/_limits.h>
00024 #endif
00025 
00026 //==========================================================
00027 //  numeric_limits static members
00028 //==========================================================
00029 
00030 _STLP_BEGIN_NAMESPACE
00031 
00032 _STLP_MOVE_TO_PRIV_NAMESPACE
00033 
00034 #if !defined (_STLP_STATIC_CONST_INIT_BUG)
00035 
00036 #  define __declare_numeric_base_member(__type, __mem, _Init) \
00037 template <class __number> \
00038   const __type _Numeric_limits_base<__number>:: __mem
00039 
00040 __declare_numeric_base_member(bool, is_specialized, false);
00041 __declare_numeric_base_member(int, digits, 0);
00042 __declare_numeric_base_member(int, digits10, 0);
00043 __declare_numeric_base_member(bool, is_signed, false);
00044 __declare_numeric_base_member(bool, is_integer, false);
00045 __declare_numeric_base_member(bool, is_exact, false);
00046 __declare_numeric_base_member(int, radix, 0);
00047 __declare_numeric_base_member(int, min_exponent, 0);
00048 __declare_numeric_base_member(int, max_exponent, 0);
00049 __declare_numeric_base_member(int, min_exponent10, 0);
00050 __declare_numeric_base_member(int, max_exponent10, 0);
00051 __declare_numeric_base_member(bool, has_infinity, false);
00052 __declare_numeric_base_member(bool, has_quiet_NaN, false);
00053 __declare_numeric_base_member(bool, has_signaling_NaN, false);
00054 __declare_numeric_base_member(float_denorm_style, has_denorm, denorm_absent);
00055 __declare_numeric_base_member(bool, has_denorm_loss, false);
00056 __declare_numeric_base_member(bool, is_iec559, false);
00057 __declare_numeric_base_member(bool, is_bounded, false);
00058 __declare_numeric_base_member(bool, is_modulo, false);
00059 __declare_numeric_base_member(bool, traps, false);
00060 __declare_numeric_base_member(bool, tinyness_before, false);
00061 __declare_numeric_base_member(float_round_style, round_style, round_toward_zero);
00062 
00063 #  undef __declare_numeric_base_member
00064 
00065 #  define __declare_integer_limits_member(__type, __mem, _Init) \
00066 template <class _Int, _STLP_LIMITS_MIN_TYPE __imin, _STLP_LIMITS_MAX_TYPE __imax, int __idigits, bool __ismod> \
00067   const __type _Integer_limits<_Int, __imin, __imax, __idigits, __ismod>:: __mem
00068 
00069 __declare_integer_limits_member(bool, is_specialized, true);
00070 __declare_integer_limits_member(int, digits, (__idigits < 0) ? \
00071           ((int)((sizeof(_Int) * (CHAR_BIT))) - ((__imin == 0) ? 0 : 1)) \
00072                             : (__idigits) );
00073 __declare_integer_limits_member(int, digits10, (int)(301UL * digits) /1000);
00074 __declare_integer_limits_member(bool, is_signed, __imin != 0);
00075 __declare_integer_limits_member(bool, is_integer, true);
00076 __declare_integer_limits_member(bool, is_exact, true);
00077 __declare_integer_limits_member(int, radix, 2);
00078 __declare_integer_limits_member(bool, is_bounded, true);
00079 __declare_integer_limits_member(bool, is_modulo, true);
00080 #  undef __declare_integer_limits_member
00081 
00082 #  define __declare_float_limits_member(__type, __mem, _Init) \
00083 template <class __number,  \
00084          int __Digits, int __Digits10,    \
00085          int __MinExp, int __MaxExp,      \
00086          int __MinExp10, int __MaxExp10,  \
00087          bool __IsIEC559, \
00088          float_round_style __RoundStyle> \
00089 const __type _Floating_limits< __number, __Digits, __Digits10,    \
00090          __MinExp, __MaxExp, __MinExp10, __MaxExp10,  \
00091          __IsIEC559, __RoundStyle>::\
00092          __mem
00093 
00094 __declare_float_limits_member(bool, is_specialized, true);
00095 __declare_float_limits_member(int, digits, __Digits);
00096 __declare_float_limits_member(int, digits10, __Digits10);
00097 __declare_float_limits_member(bool, is_signed, true);
00098 __declare_float_limits_member(int, radix, FLT_RADIX);
00099 __declare_float_limits_member(int, min_exponent, __MinExp);
00100 __declare_float_limits_member(int, max_exponent, __MaxExp);
00101 __declare_float_limits_member(int, min_exponent10, __MinExp10);
00102 __declare_float_limits_member(int, max_exponent10, __MaxExp10);
00103 __declare_float_limits_member(bool, has_infinity, true);
00104 __declare_float_limits_member(bool, has_quiet_NaN, true);
00105 __declare_float_limits_member(bool, has_signaling_NaN, true);
00106 __declare_float_limits_member(float_denorm_style, has_denorm, denorm_indeterminate);
00107 __declare_float_limits_member(bool, has_denorm_loss, false);
00108 __declare_float_limits_member(bool, is_iec559, __IsIEC559);
00109 __declare_float_limits_member(bool, is_bounded, true);
00110 __declare_float_limits_member(bool, traps, true);
00111 __declare_float_limits_member(bool, tinyness_before, false);
00112 __declare_float_limits_member(float_round_style, round_style, __RoundStyle);
00113 #  undef __declare_float_limits_member
00114 
00115 #endif /* _STLP_STATIC_CONST_INIT_BUG */
00116 
00117 
00118 #if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
00119 
00120 #  if defined (_STLP_BIG_ENDIAN)
00121 #    if defined (__OS400__)
00122 #      define _STLP_FLOAT_INF_REP { 0x7f80, 0 }
00123 #      define _STLP_FLOAT_QNAN_REP { 0xffc0, 0 }
00124 #      define _STLP_FLOAT_SNAN_REP { 0xff80, 0 }
00125 #      define _STLP_DOUBLE_INF_REP { 0x7ff0, 0, 0, 0 }
00126 #      define _STLP_DOUBLE_QNAN_REP { 0xfff8, 0, 0, 0 }
00127 #      define _STLP_DOUBLE_SNAN_REP { 0xfff0, 0, 0, 0 }
00128 #      define _STLP_LDOUBLE_INF_REP { 0x7ff0, 0, 0, 0, 0, 0, 0, 0 }
00129 #      define _STLP_LDOUBLE_QNAN_REP { 0xfff8, 0, 0, 0, 0, 0, 0, 0 }
00130 #      define _STLP_LDOUBLE_SNAN_REP { 0xfff0, 0, 0, 0, 0, 0, 0, 0 }
00131 #    else /* __OS400__ */
00132 #      define _STLP_FLOAT_INF_REP   { 0x7f80, 0 }
00133 #      define _STLP_FLOAT_QNAN_REP  { 0x7fc1, 0 }
00134 #      define _STLP_FLOAT_SNAN_REP  { 0x7f81, 0 }
00135 #      define _STLP_DOUBLE_INF_REP  { 0x7ff0, 0, 0, 0 }
00136 #      define _STLP_DOUBLE_QNAN_REP { 0x7ff9, 0, 0, 0 }
00137 #      define _STLP_DOUBLE_SNAN_REP { 0x7ff1, 0, 0, 0 }
00138 #      define _STLP_LDOUBLE_INF_REP { 0x7ff0, 0, 0, 0, 0, 0, 0, 0 }
00139 #      define _STLP_LDOUBLE_QNAN_REP { 0x7ff1, 0, 0, 0, 0, 0, 0, 0 }
00140 #      define _STLP_LDOUBLE_SNAN_REP { 0x7ff9, 0, 0, 0, 0, 0, 0, 0 }
00141 #    endif /* __OS400__ */
00142 
00143 #  elif defined (_STLP_LITTLE_ENDIAN)
00144 
00145 #    if 0 /* defined(_STLP_MSVC) || defined(__linux__) */
00146 // some IA-32 platform ??
00147 /*
00148 #      define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
00149 #      define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
00150 #      define _STLP_FLOAT_SNAN_REP { 0, 0xff80 }
00151 
00152 #      define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
00153 #      define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 }
00154 #      define _STLP_DOUBLE_SNAN_REP { 0, 0, 0, 0xfff0 }
00155 #      define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x7FF0, 0 } // ????
00156 #      define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xFFF8, 0 } // ????
00157 #      define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xFFF0, 0 } // ????
00158 */
00159 #    elif defined(__DECCXX)
00160 
00161 #      define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
00162 #      define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
00163 #      define _STLP_FLOAT_SNAN_REP { 0x5555, 0x7f85 }
00164 
00165 #      define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
00166 #      define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 }
00167 #      define _STLP_DOUBLE_SNAN_REP { 0x5555, 0x5555, 0x5555, 0x7ff5 }
00168 
00169 #      define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0, 0, 0, 0, 0x7fff }
00170 #      define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0, 0, 0, 0x8000, 0xffff }
00171 #      define _STLP_LDOUBLE_SNAN_REP { 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x7fff}
00172 #    else
00173 #      define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
00174 #      define _STLP_FLOAT_QNAN_REP { 0, 0x7fc0 }
00175 #      define _STLP_FLOAT_SNAN_REP { 0, 0x7fa0 }
00176 #      define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
00177 #      define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0x7ff8 }
00178 #      define _STLP_DOUBLE_SNAN_REP { 0, 0, 0, 0x7ff4 }
00179 #      if defined (_STLP_MSVC) || defined (__ICL)
00180 #        define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x7FF0, 0 }
00181 #        define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xFFF8, 0 }
00182 #        define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xFFF8, 0 }
00183 #      elif defined (__BORLANDC__)
00184 #        define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x8000, 0x7fff }
00185 #        define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xc000, 0x7fff }
00186 #        define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xa000, 0x7fff }
00187 #      else
00188 #        define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x8000, 0x7fff, 0 }
00189 #        define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xa000, 0x7fff, 0 }
00190 #        define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xc000, 0x7fff, 0 }
00191 #      endif
00192 #    endif
00193 #  else
00194 /* This is an architecture we don't know how to handle. Return some
00195 obviously wrong values. */
00196 #    define _STLP_FLOAT_INF_REP { 0, 0 }
00197 #    define _STLP_FLOAT_QNAN_REP { 0, 0 }
00198 #    define _STLP_FLOAT_SNAN_REP { 0, 0 }
00199 #    define _STLP_DOUBLE_INF_REP { 0, 0 }
00200 #    define _STLP_DOUBLE_QNAN_REP { 0, 0 }
00201 #    define _STLP_DOUBLE_SNAN_REP { 0, 0 }
00202 #    define _STLP_LDOUBLE_INF_REP { 0 }
00203 #    define _STLP_LDOUBLE_QNAN_REP { 0 }
00204 #    define _STLP_LDOUBLE_SNAN_REP { 0 }
00205 
00206 #  endif
00207 
00208 #  if 0
00209 /*
00210 #    if defined(_STLP_BIG_ENDIAN)
00211 
00212 #    elif defined (_STLP_LITTLE_ENDIAN)
00213 #    else
00214 
00215 //This is an architecture we don't know how to handle.  Return some
00216 //obviously wrong values.
00217 #      define _STLP_FLOAT_INF_REP  { 0, 0 }
00218 #      define _STLP_FLOAT_QNAN_REP { 0, 0 }
00219 #      define _STLP_FLOAT_SNAN_REP { 0, 0 }
00220 #      define _STLP_DOUBLE_INF_REP  { 0, 0 }
00221 #      define _STLP_DOUBLE_QNAN_REP { 0, 0 }
00222 #      define _STLP_DOUBLE_SNAN_REP { 0, 0 }
00223 #      define _STLP_LDOUBLE_INF_REP  { 0 }
00224 #      define _STLP_LDOUBLE_QNAN_REP { 0 }
00225 #      define _STLP_LDOUBLE_SNAN_REP { 0 }
00226 #    endif
00227 */
00228 #  endif
00229 
00230 union _F_rep {
00231   unsigned short rep[2];
00232   float val;
00233 };
00234 union _D_rep {
00235   unsigned short rep[4];
00236   double val;
00237 };
00238 
00239 #  ifndef _STLP_NO_LONG_DOUBLE
00240 union _LD_rep {
00241   unsigned short rep[8];
00242   long double val;
00243 };
00244 #  endif
00245 
00246 template <class __dummy>
00247 float _STLP_CALL _LimG<__dummy>::get_F_inf() {
00248   _F_rep _F_inf = {_STLP_FLOAT_INF_REP};
00249   return _F_inf.val;
00250 }
00251 template <class __dummy>
00252 float _STLP_CALL _LimG<__dummy>::get_F_qNaN() {
00253   _F_rep _F_qNaN = {_STLP_FLOAT_QNAN_REP};
00254   return _F_qNaN.val;
00255 }
00256 template <class __dummy>
00257 float _STLP_CALL _LimG<__dummy>::get_F_sNaN() {
00258   _F_rep _F_sNaN = {_STLP_FLOAT_SNAN_REP};
00259   return _F_sNaN.val;
00260 }
00261 
00262 template <class __dummy>
00263 double _STLP_CALL _LimG<__dummy>::get_D_inf() {
00264   _D_rep _D_inf = {_STLP_DOUBLE_INF_REP};
00265   return _D_inf.val;
00266 }
00267 template <class __dummy>
00268 double _STLP_CALL _LimG<__dummy>::get_D_qNaN() {
00269   _D_rep _D_qNaN = {_STLP_DOUBLE_QNAN_REP};
00270   return _D_qNaN.val;
00271 }
00272 template <class __dummy>
00273 double _STLP_CALL _LimG<__dummy>::get_D_sNaN() {
00274   _D_rep _D_sNaN = {_STLP_DOUBLE_SNAN_REP};
00275   return _D_sNaN.val;
00276 }
00277 
00278 #  if !defined (_STLP_NO_LONG_DOUBLE)
00279 template <class __dummy>
00280 long double _STLP_CALL _LimG<__dummy>::get_LD_inf() {
00281   _LD_rep _LD_inf = {_STLP_LDOUBLE_INF_REP};
00282   return _LD_inf.val;
00283 }
00284 template <class __dummy>
00285 long double _STLP_CALL _LimG<__dummy>::get_LD_qNaN() {
00286   _LD_rep _LD_qNaN = {_STLP_LDOUBLE_QNAN_REP};
00287   return _LD_qNaN.val;
00288 }
00289 template <class __dummy>
00290 long double _STLP_CALL _LimG<__dummy>::get_LD_sNaN() {
00291   _LD_rep _LD_sNaN = {_STLP_LDOUBLE_SNAN_REP};
00292   return _LD_sNaN.val;
00293 }
00294 #  endif /* _STLP_NO_LONG_DOUBLE */
00295 
00296 #endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
00297 
00298 #undef _STLP_LIMITS_MIN_TYPE
00299 #undef _STLP_LIMITS_MAX_TYPE
00300 
00301 #undef _STLP_FLOAT_INF_REP
00302 #undef _STLP_FLOAT_QNAN_REP
00303 #undef _STLP_FLOAT_SNAN_REP
00304 #undef _STLP_DOUBLE_INF_REP
00305 #undef _STLP_DOUBLE_QNAN_REP
00306 #undef _STLP_DOUBLE_SNAN_REP
00307 #undef _STLP_LDOUBLE_INF_REP
00308 #undef _STLP_LDOUBLE_QNAN_REP
00309 #undef _STLP_LDOUBLE_SNAN_REP
00310 
00311 _STLP_MOVE_TO_STD_NAMESPACE
00312 
00313 _STLP_END_NAMESPACE
00314 
00315 #endif /* _STLP_LIMITS_C_INCLUDED */



Generated on Mon Mar 10 15:32:27 2008 by  doxygen 1.5.1