checking.hpp stdexcept string cassert gecode/third-party/boost/limits.hpp /usr/include/gecode/third-party/boost/numeric/interval.hpp boost::numeric::interval_lib::exception_create_empty boost::numeric::interval_lib::exception_invalid_number boost::numeric::interval_lib::checking_base boost::numeric::interval_lib::checking_no_empty boost::numeric::interval_lib::checking_no_nan boost::numeric::interval_lib::checking_catch_nan boost::numeric::interval_lib::checking_strict boost boost::numeric boost::numeric::interval_lib /*Boostinterval/checking.hpptemplateimplementationfile * *Copyright2002HervéBrönnimann,GuillaumeMelquiond,SylvainPion * *DistributedundertheBoostSoftwareLicense,Version1.0. *(SeeaccompanyingfileLICENSE_1_0.txtor *copyathttp://www.boost.org/LICENSE_1_0.txt) */ #ifndefBOOST_NUMERIC_INTERVAL_CHECKING_HPP #defineBOOST_NUMERIC_INTERVAL_CHECKING_HPP #include<stdexcept> #include<string> #include<cassert> #include<gecode/third-party/boost/limits.hpp> namespaceboost{ namespacenumeric{ namespaceinterval_lib{ structexception_create_empty { voidoperator()() { throwstd::runtime_error("boost::interval:emptyintervalcreated"); } }; structexception_invalid_number { voidoperator()() { throwstd::invalid_argument("boost::interval:invalidnumber"); } }; template<classT> structchecking_base { staticTpos_inf() { assert(std::numeric_limits<T>::has_infinity); returnstd::numeric_limits<T>::infinity(); } staticTneg_inf() { assert(std::numeric_limits<T>::has_infinity); return-std::numeric_limits<T>::infinity(); } staticTnan() { assert(std::numeric_limits<T>::has_quiet_NaN); returnstd::numeric_limits<T>::quiet_NaN(); } staticboolis_nan(constT&x) { returnstd::numeric_limits<T>::has_quiet_NaN&&(x!=x); } staticTempty_lower() { return(std::numeric_limits<T>::has_quiet_NaN? std::numeric_limits<T>::quiet_NaN():static_cast<T>(1)); } staticTempty_upper() { return(std::numeric_limits<T>::has_quiet_NaN? std::numeric_limits<T>::quiet_NaN():static_cast<T>(0)); } staticboolis_empty(constT&l,constT&u) { return!(l<=u);//safetyforpartialorders } }; template<classT,classChecking=checking_base<T>, classException=exception_create_empty> structchecking_no_empty:Checking { staticTnan() { assert(false); returnChecking::nan(); } staticTempty_lower() { Exception()(); returnChecking::empty_lower(); } staticTempty_upper() { Exception()(); returnChecking::empty_upper(); } staticboolis_empty(constT&,constT&) { returnfalse; } }; template<classT,classChecking=checking_base<T>> structchecking_no_nan:Checking { staticboolis_nan(constT&) { returnfalse; } }; template<classT,classChecking=checking_base<T>, classException=exception_invalid_number> structchecking_catch_nan:Checking { staticboolis_nan(constT&x) { if(Checking::is_nan(x))Exception()(); returnfalse; } }; template<classT> structchecking_strict: checking_no_nan<T,checking_no_empty<T>> {}; }//namespaceinterval_lib }//namespacenumeric }//namespaceboost #endif//BOOST_NUMERIC_INTERVAL_CHECKING_HPP