1 | // Copyright 2005 Google Inc. |
---|---|
2 | // All Rights Reserved. |
3 | // |
4 | // |
5 | |
6 | #include "util/math/mathlimits.h" |
7 | |
8 | #include "base/integral_types.h" |
9 | |
10 | // MSVC++ 2005 thinks the header declaration was a definition, and |
11 | // erroneously flags these as a duplicate definition. |
12 | #ifdef COMPILER_MSVC |
13 | |
14 | #define DEF_COMMON_LIMITS(Type) |
15 | #define DEF_UNSIGNED_INT_LIMITS(Type) |
16 | #define DEF_SIGNED_INT_LIMITS(Type) |
17 | #define DEF_PRECISION_LIMITS(Type) |
18 | |
19 | #else |
20 | |
21 | #define DEF_COMMON_LIMITS(Type) \ |
22 | const bool MathLimits<Type>::kIsSigned; \ |
23 | const bool MathLimits<Type>::kIsInteger; \ |
24 | const int MathLimits<Type>::kMin10Exp; \ |
25 | const int MathLimits<Type>::kMax10Exp; |
26 | |
27 | #define DEF_UNSIGNED_INT_LIMITS(Type) \ |
28 | DEF_COMMON_LIMITS(Type) \ |
29 | const Type MathLimits<Type>::kPosMin; \ |
30 | const Type MathLimits<Type>::kPosMax; \ |
31 | const Type MathLimits<Type>::kMin; \ |
32 | const Type MathLimits<Type>::kMax; \ |
33 | const Type MathLimits<Type>::kEpsilon; \ |
34 | const Type MathLimits<Type>::kStdError; |
35 | |
36 | #define DEF_SIGNED_INT_LIMITS(Type) \ |
37 | DEF_UNSIGNED_INT_LIMITS(Type) \ |
38 | const Type MathLimits<Type>::kNegMin; \ |
39 | const Type MathLimits<Type>::kNegMax; |
40 | |
41 | #define DEF_PRECISION_LIMITS(Type) \ |
42 | const int MathLimits<Type>::kPrecisionDigits; |
43 | |
44 | #endif // not COMPILER_MSVC |
45 | |
46 | #define DEF_FP_LIMITS(Type, PREFIX) \ |
47 | DEF_COMMON_LIMITS(Type) \ |
48 | const Type MathLimits<Type>::kPosMin = PREFIX##_MIN; \ |
49 | const Type MathLimits<Type>::kPosMax = PREFIX##_MAX; \ |
50 | const Type MathLimits<Type>::kMin = -MathLimits<Type>::kPosMax; \ |
51 | const Type MathLimits<Type>::kMax = MathLimits<Type>::kPosMax; \ |
52 | const Type MathLimits<Type>::kNegMin = -MathLimits<Type>::kPosMin; \ |
53 | const Type MathLimits<Type>::kNegMax = -MathLimits<Type>::kPosMax; \ |
54 | const Type MathLimits<Type>::kEpsilon = PREFIX##_EPSILON; \ |
55 | /* 32 is 5 bits of mantissa error; should be adequate for common errors */ \ |
56 | const Type MathLimits<Type>::kStdError = MathLimits<Type>::kEpsilon * 32; \ |
57 | DEF_PRECISION_LIMITS(Type) \ |
58 | const Type MathLimits<Type>::kNaN = HUGE_VAL - HUGE_VAL; \ |
59 | const Type MathLimits<Type>::kPosInf = HUGE_VAL; \ |
60 | const Type MathLimits<Type>::kNegInf = -HUGE_VAL; |
61 | |
62 | DEF_SIGNED_INT_LIMITS(int8) |
63 | DEF_SIGNED_INT_LIMITS(int16) |
64 | DEF_SIGNED_INT_LIMITS(int32) |
65 | DEF_SIGNED_INT_LIMITS(int64) |
66 | DEF_UNSIGNED_INT_LIMITS(uint8) |
67 | DEF_UNSIGNED_INT_LIMITS(uint16) |
68 | DEF_UNSIGNED_INT_LIMITS(uint32) |
69 | DEF_UNSIGNED_INT_LIMITS(uint64) |
70 | |
71 | DEF_SIGNED_INT_LIMITS(long int) |
72 | DEF_UNSIGNED_INT_LIMITS(unsigned long int) |
73 | |
74 | DEF_FP_LIMITS(float, FLT) |
75 | DEF_FP_LIMITS(double, DBL) |
76 | DEF_FP_LIMITS(long double, LDBL); |
77 | |
78 | #undef DEF_COMMON_LIMITS |
79 | #undef DEF_SIGNED_INT_LIMITS |
80 | #undef DEF_UNSIGNED_INT_LIMITS |
81 | #undef DEF_FP_LIMITS |
82 | #undef DEF_PRECISION_LIMITS |
83 |