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