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 GECODE_BOOST_LIMITS 12 #define GECODE_BOOST_LIMITS 13 14 #include <gecode/third-party/boost/config.hpp> 15 16 #ifdef GECODE_BOOST_NO_LIMITS 17 # include <gecode/third-party/boost/detail/limits.hpp> 18 #else 19 # include <limits> 20 #endif 21 22 #if (defined(GECODE_BOOST_HAS_LONG_LONG) && defined(GECODE_BOOST_NO_LONG_LONG_NUMERIC_LIMITS)) \ 23 || (defined(GECODE_BOOST_HAS_MS_INT64) && defined(GECODE_BOOST_NO_MS_INT64_NUMERIC_LIMITS)) 24 // Add missing specializations for numeric_limits: 25 #ifdef GECODE_BOOST_HAS_MS_INT64 26 # define GECODE_BOOST_LLT __int64 27 # define GECODE_BOOST_ULLT unsigned __int64 28 #else 29 # define GECODE_BOOST_LLT ::gecode_boost::long_long_type 30 # define GECODE_BOOST_ULLT ::gecode_boost::ulong_long_type 31 #endif 32 33 #include <climits> // for CHAR_BIT 34 35 namespace std 36 { 37 template<> 38 class numeric_limits<GECODE_BOOST_LLT> 39 { 40 public: 41 42 GECODE_BOOST_STATIC_CONSTANT(bool, is_specialized = true); 43 #ifdef GECODE_BOOST_HAS_MS_INT64 GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()44 static GECODE_BOOST_LLT min GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0x8000000000000000i64; } GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()45 static GECODE_BOOST_LLT max GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0x7FFFFFFFFFFFFFFFi64; } 46 #elif defined(LLONG_MAX) GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()47 static GECODE_BOOST_LLT min GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LLONG_MIN; } GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()48 static GECODE_BOOST_LLT max GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LLONG_MAX; } 49 #elif defined(LONGLONG_MAX) GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()50 static GECODE_BOOST_LLT min GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LONGLONG_MIN; } GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()51 static GECODE_BOOST_LLT max GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LONGLONG_MAX; } 52 #else GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()53 static GECODE_BOOST_LLT min GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 1LL << (sizeof(GECODE_BOOST_LLT) * CHAR_BIT - 1); } GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()54 static GECODE_BOOST_LLT max GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~(min)(); } 55 #endif 56 GECODE_BOOST_STATIC_CONSTANT(int, digits = sizeof(GECODE_BOOST_LLT) * CHAR_BIT -1); 57 GECODE_BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (GECODE_BOOST_LLT) - 1) * 301L / 1000); 58 GECODE_BOOST_STATIC_CONSTANT(bool, is_signed = true); 59 GECODE_BOOST_STATIC_CONSTANT(bool, is_integer = true); 60 GECODE_BOOST_STATIC_CONSTANT(bool, is_exact = true); 61 GECODE_BOOST_STATIC_CONSTANT(int, radix = 2); epsilon()62 static GECODE_BOOST_LLT epsilon() throw() { return 0; }; round_error()63 static GECODE_BOOST_LLT round_error() throw() { return 0; }; 64 65 GECODE_BOOST_STATIC_CONSTANT(int, min_exponent = 0); 66 GECODE_BOOST_STATIC_CONSTANT(int, min_exponent10 = 0); 67 GECODE_BOOST_STATIC_CONSTANT(int, max_exponent = 0); 68 GECODE_BOOST_STATIC_CONSTANT(int, max_exponent10 = 0); 69 70 GECODE_BOOST_STATIC_CONSTANT(bool, has_infinity = false); 71 GECODE_BOOST_STATIC_CONSTANT(bool, has_quiet_NaN = false); 72 GECODE_BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false); 73 GECODE_BOOST_STATIC_CONSTANT(bool, has_denorm = false); 74 GECODE_BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false); infinity()75 static GECODE_BOOST_LLT infinity() throw() { return 0; }; quiet_NaN()76 static GECODE_BOOST_LLT quiet_NaN() throw() { return 0; }; signaling_NaN()77 static GECODE_BOOST_LLT signaling_NaN() throw() { return 0; }; denorm_min()78 static GECODE_BOOST_LLT denorm_min() throw() { return 0; }; 79 80 GECODE_BOOST_STATIC_CONSTANT(bool, is_iec559 = false); 81 GECODE_BOOST_STATIC_CONSTANT(bool, is_bounded = true); 82 GECODE_BOOST_STATIC_CONSTANT(bool, is_modulo = true); 83 84 GECODE_BOOST_STATIC_CONSTANT(bool, traps = false); 85 GECODE_BOOST_STATIC_CONSTANT(bool, tinyness_before = false); 86 GECODE_BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero); 87 88 }; 89 90 template<> 91 class numeric_limits<GECODE_BOOST_ULLT> 92 { 93 public: 94 95 GECODE_BOOST_STATIC_CONSTANT(bool, is_specialized = true); 96 #ifdef GECODE_BOOST_HAS_MS_INT64 GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()97 static GECODE_BOOST_ULLT min GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0ui64; } GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()98 static GECODE_BOOST_ULLT max GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0xFFFFFFFFFFFFFFFFui64; } 99 #elif defined(ULLONG_MAX) && defined(ULLONG_MIN) GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()100 static GECODE_BOOST_ULLT min GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MIN; } GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()101 static GECODE_BOOST_ULLT max GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MAX; } 102 #elif defined(ULONGLONG_MAX) && defined(ULONGLONG_MIN) GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()103 static GECODE_BOOST_ULLT min GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MIN; } GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()104 static GECODE_BOOST_ULLT max GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MAX; } 105 #else GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()106 static GECODE_BOOST_ULLT min GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0uLL; } GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION()107 static GECODE_BOOST_ULLT max GECODE_BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~0uLL; } 108 #endif 109 GECODE_BOOST_STATIC_CONSTANT(int, digits = sizeof(GECODE_BOOST_LLT) * CHAR_BIT); 110 GECODE_BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (GECODE_BOOST_LLT)) * 301L / 1000); 111 GECODE_BOOST_STATIC_CONSTANT(bool, is_signed = false); 112 GECODE_BOOST_STATIC_CONSTANT(bool, is_integer = true); 113 GECODE_BOOST_STATIC_CONSTANT(bool, is_exact = true); 114 GECODE_BOOST_STATIC_CONSTANT(int, radix = 2); epsilon()115 static GECODE_BOOST_ULLT epsilon() throw() { return 0; }; round_error()116 static GECODE_BOOST_ULLT round_error() throw() { return 0; }; 117 118 GECODE_BOOST_STATIC_CONSTANT(int, min_exponent = 0); 119 GECODE_BOOST_STATIC_CONSTANT(int, min_exponent10 = 0); 120 GECODE_BOOST_STATIC_CONSTANT(int, max_exponent = 0); 121 GECODE_BOOST_STATIC_CONSTANT(int, max_exponent10 = 0); 122 123 GECODE_BOOST_STATIC_CONSTANT(bool, has_infinity = false); 124 GECODE_BOOST_STATIC_CONSTANT(bool, has_quiet_NaN = false); 125 GECODE_BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false); 126 GECODE_BOOST_STATIC_CONSTANT(bool, has_denorm = false); 127 GECODE_BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false); infinity()128 static GECODE_BOOST_ULLT infinity() throw() { return 0; }; quiet_NaN()129 static GECODE_BOOST_ULLT quiet_NaN() throw() { return 0; }; signaling_NaN()130 static GECODE_BOOST_ULLT signaling_NaN() throw() { return 0; }; denorm_min()131 static GECODE_BOOST_ULLT denorm_min() throw() { return 0; }; 132 133 GECODE_BOOST_STATIC_CONSTANT(bool, is_iec559 = false); 134 GECODE_BOOST_STATIC_CONSTANT(bool, is_bounded = true); 135 GECODE_BOOST_STATIC_CONSTANT(bool, is_modulo = true); 136 137 GECODE_BOOST_STATIC_CONSTANT(bool, traps = false); 138 GECODE_BOOST_STATIC_CONSTANT(bool, tinyness_before = false); 139 GECODE_BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero); 140 141 }; 142 } 143 #endif 144 145 #endif 146 147