// Copyright (c) 2012 Robert Ramey // // 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) #include #include #include #include #include // works for both GCC and clang #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-value" // note: T should be of type checked_result for some integer type R template bool test_checked_less_than( T v1, T v2, char expected_result ){ using namespace boost::safe_numerics; const boost::logic::tribool result = v1 < v2; std::cout << std::boolalpha << v1 << " < " << v2 << " -> " << result << std::endl; switch(expected_result){ case '<': if(result) return true; break; case '>': case '=': if(!result) return true; break; case '!': if(indeterminate(result)) return true; break; } std::cout << "failed to detect error in addition " << std::hex << result << "(" << std::dec << result << ")" << " != "<< v1 << " < " << v2 << std::endl; v1 < v2; return false; } #pragma GCC diagnostic pop #include "test_checked_comparison.hpp" template struct test_signed_pair { bool operator()() const { std::size_t i = First(); std::size_t j = Second(); std::cout << std::dec << i << ',' << j << ',' << "testing " << boost::core::demangle(typeid(T).name()) << ' '; return test_checked_less_than( signed_values[i], signed_values[j], signed_comparison_results[i][j] ); }; }; template struct test_unsigned_pair { bool operator()() const { std::size_t i = First(); std::size_t j = Second(); std::cout << std::dec << i << ',' << j << ',' << "testing " << boost::core::demangle(typeid(T).name()) << ' '; return test_checked_less_than( unsigned_values[i], unsigned_values[j], unsigned_comparison_results[i][j] ); }; }; #include int main(){ using namespace boost::mp11; bool rval = true; mp_for_each< mp_product< test_signed_pair, signed_test_types, signed_value_indices, signed_value_indices > >([&](auto I){ rval &= I(); }); mp_for_each< mp_product< test_unsigned_pair, unsigned_test_types, unsigned_value_indices, unsigned_value_indices > >([&](auto I){ rval &= I(); }); std::cout << (rval ? "success!" : "failure") << std::endl; return rval ? 0 : 1; }