#include #include #define BOOST_TEST_MAIN #include struct any { any(...) {} }; struct no_overload {}; no_overload operator+(any, any) { return no_overload(); } no_overload operator-(any, any) { return no_overload(); } no_overload operator*(any, any) { return no_overload(); } no_overload operator/(any, any) { return no_overload(); } no_overload operator%(any, any) { return no_overload(); } no_overload operator|(any, any) { return no_overload(); } no_overload operator&(any, any) { return no_overload(); } no_overload operator^(any, any) { return no_overload(); } no_overload operator==(any, any) { return no_overload(); } no_overload operator!=(any, any) { return no_overload(); } no_overload operator<(any, any) { return no_overload(); } no_overload operator>(any, any) { return no_overload(); } no_overload operator<=(any, any) { return no_overload(); } no_overload operator>=(any, any) { return no_overload(); } no_overload operator~(any) { return no_overload(); } template boost::test_tools::predicate_result not_overloaded(const T&) { if(typeid(T) == typeid(no_overload)) return true; else { boost::test_tools::predicate_result result(false); result.message() = } } #define CHECK_NOT_OVERLOADED(expr) \ BOOST_CHECK_MESSAGE(typeid(expr) == typeid(no_overload), \ "Unexpected overload found for expression: " #expr) struct unrelated_type {}; typedef boost::mpl::vector< std::string, const char*, unrelated_type > other_types; BOOST_AUTO_TEST_CASE_TEMPLATE(test_arithmetic, T, other_types) { boost::xint::integer i; T arg = T(); CHECK_NOT_OVERLOADED(i + arg); CHECK_NOT_OVERLOADED(arg + i); CHECK_NOT_OVERLOADED(i - arg); CHECK_NOT_OVERLOADED(arg - i); CHECK_NOT_OVERLOADED(i * arg); CHECK_NOT_OVERLOADED(arg * i); CHECK_NOT_OVERLOADED(i / arg); CHECK_NOT_OVERLOADED(arg / i); CHECK_NOT_OVERLOADED(i % arg); CHECK_NOT_OVERLOADED(arg % i); } BOOST_AUTO_TEST_CASE_TEMPLATE(test_bitwise, T, other_types) { boost::xint::integer i; T arg = T(); CHECK_NOT_OVERLOADED(i & arg); CHECK_NOT_OVERLOADED(arg & i); CHECK_NOT_OVERLOADED(i | arg); CHECK_NOT_OVERLOADED(arg | i); CHECK_NOT_OVERLOADED(i ^ arg); CHECK_NOT_OVERLOADED(arg ^ i); } BOOST_AUTO_TEST_CASE(test_complement) { boost::xint::integer i; CHECK_NOT_OVERLOADED(~i); } BOOST_AUTO_TEST_CASE_TEMPLATE(test_compare, T, other_types) { boost::xint::integer i; T arg = T(); CHECK_NOT_OVERLOADED(i == arg); CHECK_NOT_OVERLOADED(arg == i); CHECK_NOT_OVERLOADED(i != arg); CHECK_NOT_OVERLOADED(arg != i); CHECK_NOT_OVERLOADED(i < arg); CHECK_NOT_OVERLOADED(arg < i); CHECK_NOT_OVERLOADED(i > arg); CHECK_NOT_OVERLOADED(arg > i); CHECK_NOT_OVERLOADED(i <= arg); CHECK_NOT_OVERLOADED(arg <= i); CHECK_NOT_OVERLOADED(i >= arg); CHECK_NOT_OVERLOADED(arg >= i); }