#include #include #include #include #include #include #include #include #include #include #include class custom { int _M_x; friend bool operator<(custom const& x, custom const& y); friend std::ostream& operator<<(std::ostream& str, custom const& x); public: explicit custom(int x = 0) : _M_x(x) {} custom(custom const& y) : _M_x(y._M_x) {} custom operator+(custom const& y) const { return custom(_M_x+y._M_x); } custom& operator+=(custom const& y) { _M_x += y._M_x; return *this; } }; bool operator< (custom const& x, custom const& y) { return x._M_x < y._M_x; } template struct less_count : std::less { typedef std::less Base; less_count(less_count const& lc) : _M_counter(lc._M_counter) {} less_count(int& counter) : _M_counter(counter) {} bool operator()(Value const& a, Value const& b) const { ++_M_counter; return Base::operator()(a,b); } void reset() { _M_counter = 0; } private: int& _M_counter; }; template void test(int n, char* name) { using namespace boost; // Test functionality tuple result = minmax(0, 1); BOOST_CHECK_EQUAL( result.get<0>(), 0 ); BOOST_CHECK_EQUAL( result.get<1>(), 1 ); result = minmax(1, 0); BOOST_CHECK_EQUAL( result.get<0>(), 0 ); BOOST_CHECK_EQUAL( result.get<1>(), 1 ); // Test functionality and number of comparisons int counter = 0; BOOST_CHECK_EQUAL( result.get<0>(), 0 ); BOOST_CHECK_EQUAL( result.get<1>(), 1 ); BOOST_CHECK_EQUAL( counter, 1 ); result = minmax(1, 0, less_count(counter) ); BOOST_CHECK_EQUAL( result.get<0>(), 0 ); BOOST_CHECK_EQUAL( result.get<1>(), 1 ); BOOST_CHECK_EQUAL( counter, 2); } int test_main( int argc, char* argv[] ) { test(n, "builtin"); test(n, "custom "); return 0; }