2 * Copyright (c) 1998,1999
3 * Silicon Graphics Computer Systems, Inc.
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
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.
19 #ifndef _STLP_LIMITS_C
20 #define _STLP_LIMITS_C
22 #ifndef _STLP_INTERNAL_LIMITS
23 # include <stl/_limits.h>
26 //==========================================================
27 // numeric_limits static members
28 //==========================================================
32 _STLP_MOVE_TO_PRIV_NAMESPACE
34 #if !defined (_STLP_STATIC_CONST_INIT_BUG)
36 # define __declare_numeric_base_member(__type, __mem, _Init) \
37 template <class __number> \
38 const __type _Numeric_limits_base<__number>:: __mem
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);
63 # undef __declare_numeric_base_member
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
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)) \
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
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, \
88 float_round_style __RoundStyle> \
89 const __type _Floating_limits< __number, __Digits, __Digits10, \
90 __MinExp, __MaxExp, __MinExp10, __MaxExp10, \
91 __IsIEC559, __RoundStyle>::\
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
115 #endif /* _STLP_STATIC_CONST_INIT_BUG */
118 #if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
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__ */
143 # elif defined (_STLP_LITTLE_ENDIAN)
145 # if 0 /* defined(_STLP_MSVC) || defined(__linux__) */
146 // some IA-32 platform ??
148 # define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
149 # define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
150 # define _STLP_FLOAT_SNAN_REP { 0, 0xff80 }
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 } // ????
159 # elif defined(__DECCXX)
161 # define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
162 # define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
163 # define _STLP_FLOAT_SNAN_REP { 0x5555, 0x7f85 }
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 }
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}
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 }
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 }
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 }
210 # if defined(_STLP_BIG_ENDIAN)
212 # elif defined (_STLP_LITTLE_ENDIAN)
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 }
231 unsigned short rep[2];
235 unsigned short rep[4];
239 # ifndef _STLP_NO_LONG_DOUBLE
241 unsigned short rep[8];
246 template <class __dummy>
247 float _STLP_CALL _LimG<__dummy>::get_F_inf() {
248 _F_rep _F_inf = {_STLP_FLOAT_INF_REP};
251 template <class __dummy>
252 float _STLP_CALL _LimG<__dummy>::get_F_qNaN() {
253 _F_rep _F_qNaN = {_STLP_FLOAT_QNAN_REP};
256 template <class __dummy>
257 float _STLP_CALL _LimG<__dummy>::get_F_sNaN() {
258 _F_rep _F_sNaN = {_STLP_FLOAT_SNAN_REP};
262 template <class __dummy>
263 double _STLP_CALL _LimG<__dummy>::get_D_inf() {
264 _D_rep _D_inf = {_STLP_DOUBLE_INF_REP};
267 template <class __dummy>
268 double _STLP_CALL _LimG<__dummy>::get_D_qNaN() {
269 _D_rep _D_qNaN = {_STLP_DOUBLE_QNAN_REP};
272 template <class __dummy>
273 double _STLP_CALL _LimG<__dummy>::get_D_sNaN() {
274 _D_rep _D_sNaN = {_STLP_DOUBLE_SNAN_REP};
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};
284 template <class __dummy>
285 long double _STLP_CALL _LimG<__dummy>::get_LD_qNaN() {
286 _LD_rep _LD_qNaN = {_STLP_LDOUBLE_QNAN_REP};
289 template <class __dummy>
290 long double _STLP_CALL _LimG<__dummy>::get_LD_sNaN() {
291 _LD_rep _LD_sNaN = {_STLP_LDOUBLE_SNAN_REP};
294 # endif /* _STLP_NO_LONG_DOUBLE */
296 #endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
298 #undef _STLP_LIMITS_MIN_TYPE
299 #undef _STLP_LIMITS_MAX_TYPE
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
311 _STLP_MOVE_TO_STD_NAMESPACE
315 #endif /* _STLP_LIMITS_C_INCLUDED */