Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
2.9 kB · 130 lines
C++
at develop
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131/* Boost interval/checking.hpp template implementation file * * Copyright 2002 Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or * copy at http://www.boost.org/LICENSE_1_0.txt) */
#ifndef GECODE_BOOST_NUMERIC_INTERVAL_CHECKING_HPP#define GECODE_BOOST_NUMERIC_INTERVAL_CHECKING_HPP
#include <stdexcept>#include <string>#include <cassert>#include <gecode/third-party/boost/limits.hpp>
namespace gecode_boost {namespace numeric {namespace interval_lib {
struct exception_create_empty{ void operator()() { throw std::runtime_error("gecode_boost::interval: empty interval created"); }};
struct exception_invalid_number{ void operator()() { throw std::invalid_argument("gecode_boost::interval: invalid number"); }};
template<class T>struct checking_base{ static T pos_inf() { assert(std::numeric_limits<T>::has_infinity); return std::numeric_limits<T>::infinity(); } static T neg_inf() { assert(std::numeric_limits<T>::has_infinity); return -std::numeric_limits<T>::infinity(); } static T nan() { assert(std::numeric_limits<T>::has_quiet_NaN); return std::numeric_limits<T>::quiet_NaN(); } static bool is_nan(const T& x) { return std::numeric_limits<T>::has_quiet_NaN && (x != x); } static T empty_lower() { return (std::numeric_limits<T>::has_quiet_NaN ? std::numeric_limits<T>::quiet_NaN() : static_cast<T>(1)); } static T empty_upper() { return (std::numeric_limits<T>::has_quiet_NaN ? std::numeric_limits<T>::quiet_NaN() : static_cast<T>(0)); } static bool is_empty(const T& l, const T& u) { return !(l <= u); // safety for partial orders }};
template<class T, class Checking = checking_base<T>, class Exception = exception_create_empty>struct checking_no_empty: Checking{ static T nan() { assert(false); return Checking::nan(); } static T empty_lower() { Exception()(); return Checking::empty_lower(); } static T empty_upper() { Exception()(); return Checking::empty_upper(); } static bool is_empty(const T&, const T&) { return false; }};
template<class T, class Checking = checking_base<T> >struct checking_no_nan: Checking{ static bool is_nan(const T&) { return false; }};
template<class T, class Checking = checking_base<T>, class Exception = exception_invalid_number>struct checking_catch_nan: Checking{ static bool is_nan(const T& x) { if (Checking::is_nan(x)) Exception()(); return false; }};
template<class T>struct checking_strict: checking_no_nan<T, checking_no_empty<T> >{};
} // namespace interval_lib} // namespace numeric} // namespace gecode_boost
#endif // GECODE_BOOST_NUMERIC_INTERVAL_CHECKING_HPP