#include #include #include #include #include #include "../include/interval.hpp" #include bool test1(){ using namespace boost::numeric; std::cout << "test1" << std::endl; interval x = {-64, 63}; std::cout << "x = " << x; interval y(-128, 126); std::cout << "y = " << y; assert(operator+(x,x) == y); std::cout << "x + x =" << operator+(x, x); std::cout << "x - x = " << operator-(x, x); return true; } bool test2(){ using namespace boost::numeric; std::cout << "test2" << std::endl; boost::numeric::interval x = {-64, 63}; std::cout << "x = " << x; std::cout << std::boolalpha << "(x == x) = " << (x == x) << std::endl; return true; } bool test3(){ using namespace boost::numeric; std::cout << "test3" << std::endl; interval t; std::cout << "t = " << t; interval u; std::cout << "u = " << u; using max_t = unsigned long long; interval< max_t> r = operator+(t, u); std::cout << "r = " << r << std::endl; return true; } #include namespace test4 { using namespace boost::numeric; using max_t = std::intmax_t; // typedef typename print::type p_max_t; template SAFE_NUMERIC_CONSTEXPR static const interval r_upper(const interval & t){ static_assert( std::is_literal_type< interval >::value, "interval is not literal type" ); return interval( max(checked_result(1), t.l), t.u ); } template SAFE_NUMERIC_CONSTEXPR static const interval r_lower(const interval & t){ static_assert( std::is_literal_type< interval >::value, "interval is not literal type" ); return interval( t.l, min(checked_result(-1), t.u) ); } template SAFE_NUMERIC_CONSTEXPR static const interval r( const interval & t, const interval & u ){ if(std::numeric_limits::is_signed){ if(u.l > 0 || u.u < 0){ auto retval = operator/(t, u); // typedef print p_retval; return retval; //return operator/(t, u); } else{ auto lower = operator/(t,r_lower(u)); // typedef print p_lower; auto upper = operator/(t,r_upper(u)); // typedef print p_lower; return interval< max_t>( min(lower.l, upper.l), max(lower.u, upper.u) ); /* */ // return t; } } else{ // u is unsigned if(u.l > 0) return operator/(t, u); else return operator/(t, r_upper(u)) ; }; }; bool test1(){ using namespace boost::numeric; int status; std::cout << "test4::test1" << std::endl; const interval t; std::cout << abi::__cxa_demangle(typeid(t).name(),0,0,&status) << " t = " << t; const interval u; std::cout << abi::__cxa_demangle(typeid(u).name(),0,0,&status) << " u = " << u; const interval rx = r(t, u); std::cout << abi::__cxa_demangle(typeid(rx).name(),0,0,&status) << " rx = " << rx; return true; } bool test2(){ using namespace boost::numeric; int status; std::cout << "test4::test2" << std::endl; const interval t; std::cout << abi::__cxa_demangle(typeid(t).name(),0,0,&status) << " t = " << t; const interval u; std::cout << abi::__cxa_demangle(typeid(u).name(),0,0,&status) << " u = " << u; const interval rx = r(t, u); std::cout << abi::__cxa_demangle(typeid(rx).name(),0,0,&status) << " rx = " << rx; return true; } bool test3(){ using namespace boost::numeric; int status; std::cout << "test4::test2" << std::endl; const interval t; std::cout << abi::__cxa_demangle(typeid(t).name(),0,0,&status) << " t = " << t; const interval u; std::cout << abi::__cxa_demangle(typeid(u).name(),0,0,&status) << " u = " << u; const interval rx = r(t, u); std::cout << abi::__cxa_demangle(typeid(rx).name(),0,0,&status) << " rx = " << rx; return true; } }; int main(){ return ( test1() && test2() && test3() && test4::test1() && test4::test2() && test4::test3() ) ? EXIT_SUCCESS : EXIT_FAILURE; }