Chris@16: /* Boost interval/checking.hpp template implementation file Chris@16: * Chris@16: * Copyright 2002 Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion Chris@16: * Chris@16: * Distributed under the Boost Software License, Version 1.0. Chris@16: * (See accompanying file LICENSE_1_0.txt or Chris@16: * copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: Chris@16: #ifndef BOOST_NUMERIC_INTERVAL_CHECKING_HPP Chris@16: #define BOOST_NUMERIC_INTERVAL_CHECKING_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace numeric { Chris@16: namespace interval_lib { Chris@16: Chris@16: struct exception_create_empty Chris@16: { Chris@16: void operator()() Chris@16: { Chris@16: throw std::runtime_error("boost::interval: empty interval created"); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct exception_invalid_number Chris@16: { Chris@16: void operator()() Chris@16: { Chris@16: throw std::invalid_argument("boost::interval: invalid number"); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct checking_base Chris@16: { Chris@16: static T pos_inf() Chris@16: { Chris@16: assert(std::numeric_limits::has_infinity); Chris@16: return std::numeric_limits::infinity(); Chris@16: } Chris@16: static T neg_inf() Chris@16: { Chris@16: assert(std::numeric_limits::has_infinity); Chris@16: return -std::numeric_limits::infinity(); Chris@16: } Chris@16: static T nan() Chris@16: { Chris@16: assert(std::numeric_limits::has_quiet_NaN); Chris@16: return std::numeric_limits::quiet_NaN(); Chris@16: } Chris@16: static bool is_nan(const T& x) Chris@16: { Chris@16: return std::numeric_limits::has_quiet_NaN && (x != x); Chris@16: } Chris@16: static T empty_lower() Chris@16: { Chris@16: return (std::numeric_limits::has_quiet_NaN ? Chris@16: std::numeric_limits::quiet_NaN() : static_cast(1)); Chris@16: } Chris@16: static T empty_upper() Chris@16: { Chris@16: return (std::numeric_limits::has_quiet_NaN ? Chris@16: std::numeric_limits::quiet_NaN() : static_cast(0)); Chris@16: } Chris@16: static bool is_empty(const T& l, const T& u) Chris@16: { Chris@16: return !(l <= u); // safety for partial orders Chris@16: } Chris@16: }; Chris@16: Chris@16: template, Chris@16: class Exception = exception_create_empty> Chris@16: struct checking_no_empty: Checking Chris@16: { Chris@16: static T nan() Chris@16: { Chris@16: assert(false); Chris@16: return Checking::nan(); Chris@16: } Chris@16: static T empty_lower() Chris@16: { Chris@16: Exception()(); Chris@16: return Checking::empty_lower(); Chris@16: } Chris@16: static T empty_upper() Chris@16: { Chris@16: Exception()(); Chris@16: return Checking::empty_upper(); Chris@16: } Chris@16: static bool is_empty(const T&, const T&) Chris@16: { Chris@16: return false; Chris@16: } Chris@16: }; Chris@16: Chris@16: template > Chris@16: struct checking_no_nan: Checking Chris@16: { Chris@16: static bool is_nan(const T&) Chris@16: { Chris@16: return false; Chris@16: } Chris@16: }; Chris@16: Chris@16: template, Chris@16: class Exception = exception_invalid_number> Chris@16: struct checking_catch_nan: Checking Chris@16: { Chris@16: static bool is_nan(const T& x) Chris@16: { Chris@16: if (Checking::is_nan(x)) Exception()(); Chris@16: return false; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct checking_strict: Chris@16: checking_no_nan > Chris@16: {}; Chris@16: Chris@16: } // namespace interval_lib Chris@16: } // namespace numeric Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_NUMERIC_INTERVAL_CHECKING_HPP