/home/ntakagi/work/STLport-5.1.5/stlport/stl/_limits.cGo 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 ![]() |