1 2 // (C) Copyright John maddock 1999. 3 // (C) David Abrahams 2002. Distributed under the Boost 4 // Software License, Version 1.0. (See accompanying file 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 // 7 // use this header as a workaround for missing <limits> 8 9 // See http://www.boost.org/libs/compatibility/index.html for documentation. 10 11 #ifndef BOOST_LIMITS 12 #define BOOST_LIMITS 13 14 #include <boost/config.hpp> 15 16 #ifdef BOOST_NO_LIMITS 17 # include <boost/detail/limits.hpp> 18 #else 19 # include <limits> 20 #endif 21 22 #if (defined(BOOST_HAS_LONG_LONG) && defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS)) \ 23 || (defined(BOOST_HAS_MS_INT64) && defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS)) 24 // Add missing specializations for numeric_limits: 25 #ifdef BOOST_HAS_MS_INT64 26 # define BOOST_LLT __int64 27 # define BOOST_ULLT unsigned __int64 28 #else 29 # define BOOST_LLT ::boost::long_long_type 30 # define BOOST_ULLT ::boost::ulong_long_type 31 #endif 32 33 #include <climits> // for CHAR_BIT 34 35 namespace std 36 { 37 template<> 38 class numeric_limits<BOOST_LLT> 39 { 40 public: 41 42 BOOST_STATIC_CONSTANT(bool, is_specialized = true); 43 #ifdef BOOST_HAS_MS_INT64 44 static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0x8000000000000000i64; } 45 static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0x7FFFFFFFFFFFFFFFi64; } 46 #elif defined(LLONG_MAX) 47 static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LLONG_MIN; } 48 static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LLONG_MAX; } 49 #elif defined(LONGLONG_MAX) 50 static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LONGLONG_MIN; } 51 static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LONGLONG_MAX; } 52 #else 53 static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 1LL << (sizeof(BOOST_LLT) * CHAR_BIT - 1); } 54 static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~(min)(); } 55 #endif 56 BOOST_STATIC_CONSTANT(int, digits = sizeof(BOOST_LLT) * CHAR_BIT -1); 57 BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (BOOST_LLT) - 1) * 301L / 1000); 58 BOOST_STATIC_CONSTANT(bool, is_signed = true); 59 BOOST_STATIC_CONSTANT(bool, is_integer = true); 60 BOOST_STATIC_CONSTANT(bool, is_exact = true); 61 BOOST_STATIC_CONSTANT(int, radix = 2); 62 static BOOST_LLT epsilon() throw() { return 0; }; 63 static BOOST_LLT round_error() throw() { return 0; }; 64 65 BOOST_STATIC_CONSTANT(int, min_exponent = 0); 66 BOOST_STATIC_CONSTANT(int, min_exponent10 = 0); 67 BOOST_STATIC_CONSTANT(int, max_exponent = 0); 68 BOOST_STATIC_CONSTANT(int, max_exponent10 = 0); 69 70 BOOST_STATIC_CONSTANT(bool, has_infinity = false); 71 BOOST_STATIC_CONSTANT(bool, has_quiet_NaN = false); 72 BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false); 73 BOOST_STATIC_CONSTANT(bool, has_denorm = false); 74 BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false); 75 static BOOST_LLT infinity() throw() { return 0; }; 76 static BOOST_LLT quiet_NaN() throw() { return 0; }; 77 static BOOST_LLT signaling_NaN() throw() { return 0; }; 78 static BOOST_LLT denorm_min() throw() { return 0; }; 79 80 BOOST_STATIC_CONSTANT(bool, is_iec559 = false); 81 BOOST_STATIC_CONSTANT(bool, is_bounded = true); 82 BOOST_STATIC_CONSTANT(bool, is_modulo = true); 83 84 BOOST_STATIC_CONSTANT(bool, traps = false); 85 BOOST_STATIC_CONSTANT(bool, tinyness_before = false); 86 BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero); 87 88 }; 89 90 template<> 91 class numeric_limits<BOOST_ULLT> 92 { 93 public: 94 95 BOOST_STATIC_CONSTANT(bool, is_specialized = true); 96 #ifdef BOOST_HAS_MS_INT64 97 static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0ui64; } 98 static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0xFFFFFFFFFFFFFFFFui64; } 99 #elif defined(ULLONG_MAX) && defined(ULLONG_MIN) 100 static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MIN; } 101 static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MAX; } 102 #elif defined(ULONGLONG_MAX) && defined(ULONGLONG_MIN) 103 static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MIN; } 104 static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MAX; } 105 #else 106 static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0uLL; } 107 static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~0uLL; } 108 #endif 109 BOOST_STATIC_CONSTANT(int, digits = sizeof(BOOST_LLT) * CHAR_BIT); 110 BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (BOOST_LLT)) * 301L / 1000); 111 BOOST_STATIC_CONSTANT(bool, is_signed = false); 112 BOOST_STATIC_CONSTANT(bool, is_integer = true); 113 BOOST_STATIC_CONSTANT(bool, is_exact = true); 114 BOOST_STATIC_CONSTANT(int, radix = 2); 115 static BOOST_ULLT epsilon() throw() { return 0; }; 116 static BOOST_ULLT round_error() throw() { return 0; }; 117 118 BOOST_STATIC_CONSTANT(int, min_exponent = 0); 119 BOOST_STATIC_CONSTANT(int, min_exponent10 = 0); 120 BOOST_STATIC_CONSTANT(int, max_exponent = 0); 121 BOOST_STATIC_CONSTANT(int, max_exponent10 = 0); 122 123 BOOST_STATIC_CONSTANT(bool, has_infinity = false); 124 BOOST_STATIC_CONSTANT(bool, has_quiet_NaN = false); 125 BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false); 126 BOOST_STATIC_CONSTANT(bool, has_denorm = false); 127 BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false); 128 static BOOST_ULLT infinity() throw() { return 0; }; 129 static BOOST_ULLT quiet_NaN() throw() { return 0; }; 130 static BOOST_ULLT signaling_NaN() throw() { return 0; }; 131 static BOOST_ULLT denorm_min() throw() { return 0; }; 132 133 BOOST_STATIC_CONSTANT(bool, is_iec559 = false); 134 BOOST_STATIC_CONSTANT(bool, is_bounded = true); 135 BOOST_STATIC_CONSTANT(bool, is_modulo = true); 136 137 BOOST_STATIC_CONSTANT(bool, traps = false); 138 BOOST_STATIC_CONSTANT(bool, tinyness_before = false); 139 BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero); 140 141 }; 142 } 143 #endif 144 145 #endif 146 147