this repo has no description
1/* Boost interval/checking.hpp template implementation file 2 * 3 * Copyright 2002 Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion 4 * 5 * Distributed under the Boost Software License, Version 1.0. 6 * (See accompanying file LICENSE_1_0.txt or 7 * copy at http://www.boost.org/LICENSE_1_0.txt) 8 */ 9 10#ifndef GECODE_BOOST_NUMERIC_INTERVAL_CHECKING_HPP 11#define GECODE_BOOST_NUMERIC_INTERVAL_CHECKING_HPP 12 13#include <stdexcept> 14#include <string> 15#include <cassert> 16#include <gecode/third-party/boost/limits.hpp> 17 18namespace gecode_boost { 19namespace numeric { 20namespace interval_lib { 21 22struct exception_create_empty 23{ 24 void operator()() 25 { 26 throw std::runtime_error("gecode_boost::interval: empty interval created"); 27 } 28}; 29 30struct exception_invalid_number 31{ 32 void operator()() 33 { 34 throw std::invalid_argument("gecode_boost::interval: invalid number"); 35 } 36}; 37 38template<class T> 39struct checking_base 40{ 41 static T pos_inf() 42 { 43 assert(std::numeric_limits<T>::has_infinity); 44 return std::numeric_limits<T>::infinity(); 45 } 46 static T neg_inf() 47 { 48 assert(std::numeric_limits<T>::has_infinity); 49 return -std::numeric_limits<T>::infinity(); 50 } 51 static T nan() 52 { 53 assert(std::numeric_limits<T>::has_quiet_NaN); 54 return std::numeric_limits<T>::quiet_NaN(); 55 } 56 static bool is_nan(const T& x) 57 { 58 return std::numeric_limits<T>::has_quiet_NaN && (x != x); 59 } 60 static T empty_lower() 61 { 62 return (std::numeric_limits<T>::has_quiet_NaN ? 63 std::numeric_limits<T>::quiet_NaN() : static_cast<T>(1)); 64 } 65 static T empty_upper() 66 { 67 return (std::numeric_limits<T>::has_quiet_NaN ? 68 std::numeric_limits<T>::quiet_NaN() : static_cast<T>(0)); 69 } 70 static bool is_empty(const T& l, const T& u) 71 { 72 return !(l <= u); // safety for partial orders 73 } 74}; 75 76template<class T, class Checking = checking_base<T>, 77 class Exception = exception_create_empty> 78struct checking_no_empty: Checking 79{ 80 static T nan() 81 { 82 assert(false); 83 return Checking::nan(); 84 } 85 static T empty_lower() 86 { 87 Exception()(); 88 return Checking::empty_lower(); 89 } 90 static T empty_upper() 91 { 92 Exception()(); 93 return Checking::empty_upper(); 94 } 95 static bool is_empty(const T&, const T&) 96 { 97 return false; 98 } 99}; 100 101template<class T, class Checking = checking_base<T> > 102struct checking_no_nan: Checking 103{ 104 static bool is_nan(const T&) 105 { 106 return false; 107 } 108}; 109 110template<class T, class Checking = checking_base<T>, 111 class Exception = exception_invalid_number> 112struct checking_catch_nan: Checking 113{ 114 static bool is_nan(const T& x) 115 { 116 if (Checking::is_nan(x)) Exception()(); 117 return false; 118 } 119}; 120 121template<class T> 122struct checking_strict: 123 checking_no_nan<T, checking_no_empty<T> > 124{}; 125 126} // namespace interval_lib 127} // namespace numeric 128} // namespace gecode_boost 129 130#endif // GECODE_BOOST_NUMERIC_INTERVAL_CHECKING_HPP