#ifndef FTM_CHECK_H #define FTM_CHECK_H #include #define FTM_WARN_COLLECTION_MONO_INCREASE(Begin, End) \ BOOST_CHECK_WITH_ARGS_IMPL(::ftm::test::detail::check_mono_increase_func_frwd(), "FTM_WARN_COLLECTION_MONO_INCREASE", WARN, CHECK_PRED_WITH_ARGS, (Begin)(End)); #define FTM_CHECK_COLLECTION_MONO_INCREASE(Begin, End) \ BOOST_CHECK_WITH_ARGS_IMPL(::ftm::test::detail::check_mono_increase_func_frwd(), "FTM_CHECK_COLLECTION_MONO_INCREASE", CHECK, CHECK_PRED_WITH_ARGS, (Begin)(End)); #define FTM_REQUIRE_COLLECTION_MONO_INCREASE(Begin, End) \ BOOST_CHECK_WITH_ARGS_IMPL(::ftm::test::detail::check_mono_increase_func_frwd(), "FTM_REQUIRE_COLLECTION_MONO_INCREASE", REQUIRE, CHECK_PRED_WITH_ARGS, (Begin)(End)); namespace ftm{ namespace test{ namespace detail{ struct check_mono_increase_func_frwd{ template boost::test_tools::predicate_result operator()(ForwardIteratorA begin, ForwardIteratorB end) const{ boost::test_tools::predicate_result result = true; std::size_t pos = 0; if(begin == end) return result; ForwardIteratorA previous = begin; ForwardIteratorA current = begin; current++; while(current != end){ if(*previous > *current){ result = false; result.message() << "\n(position: " << pos << "): "<< *previous << " > " << *current; } previous = current; current++; pos++; } return result; } }; }}} #endif