// Boost.Range library // // Copyright Neil Groves 2009. Use, modification and // distribution is subject to 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) // // // For more information, see http://www.boost.org/libs/range/ // #include #include #include #include #include #include #include #include namespace boost { namespace { template< class Container1, class Container2 > void eval_mismatch(Container1& cont1, Container2& cont2, BOOST_DEDUCED_TYPENAME range_iterator::type ref_it1, BOOST_DEDUCED_TYPENAME range_iterator::type ref_it2 ) { typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter1_t; typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter2_t; typedef std::pair result_pair_t; result_pair_t result = boost::mismatch(cont1, cont2); BOOST_CHECK( result.first == ref_it1 ); BOOST_CHECK( result.second == ref_it2 ); result = boost::mismatch(boost::make_iterator_range(cont1), cont2); BOOST_CHECK( result.first == ref_it1 ); BOOST_CHECK( result.second == ref_it2 ); result = boost::mismatch(cont1, boost::make_iterator_range(cont2)); BOOST_CHECK( result.first == ref_it1 ); BOOST_CHECK( result.second == ref_it2 ); result = boost::mismatch(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2)); BOOST_CHECK( result.first == ref_it1 ); BOOST_CHECK( result.second == ref_it2 ); } template< class Container1, class Container2, class Pred > void eval_mismatch(Container1& cont1, Container2& cont2, Pred pred, BOOST_DEDUCED_TYPENAME range_iterator::type ref_it1, BOOST_DEDUCED_TYPENAME range_iterator::type ref_it2 ) { typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter1_t; typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter2_t; typedef std::pair result_pair_t; result_pair_t result = boost::mismatch(cont1, cont2, pred); BOOST_CHECK( result.first == ref_it1 ); BOOST_CHECK( result.second == ref_it2 ); result = boost::mismatch(boost::make_iterator_range(cont1), cont2, pred); BOOST_CHECK( result.first == ref_it1 ); BOOST_CHECK( result.second == ref_it2 ); result = boost::mismatch(cont1, boost::make_iterator_range(cont2), pred); BOOST_CHECK( result.first == ref_it1 ); BOOST_CHECK( result.second == ref_it2 ); result = boost::mismatch(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), pred); BOOST_CHECK( result.first == ref_it1 ); BOOST_CHECK( result.second == ref_it2 ); } template< class Container1, class Container2 > void eval_mismatch(Container1& cont1, Container2& cont2, const int ref1, const int ref2) { typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter1_t; typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter2_t; typedef std::pair result_pair_t; result_pair_t result = boost::mismatch(cont1, cont2); BOOST_CHECK_EQUAL( ref1, *result.first ); BOOST_CHECK_EQUAL( ref2, *result.second ); result = boost::mismatch(boost::make_iterator_range(cont1), cont2); BOOST_CHECK_EQUAL( ref1, *result.first ); BOOST_CHECK_EQUAL( ref2, *result.second ); result = boost::mismatch(cont1, boost::make_iterator_range(cont2)); BOOST_CHECK_EQUAL( ref1, *result.first ); BOOST_CHECK_EQUAL( ref2, *result.second ); result = boost::mismatch(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2)); BOOST_CHECK_EQUAL( ref1, *result.first ); BOOST_CHECK_EQUAL( ref2, *result.second ); } template< class Container1, class Container2, class Pred > void eval_mismatch(Container1& cont1, Container2& cont2, Pred pred, const int ref1, const int ref2) { typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter1_t; typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter2_t; typedef std::pair result_pair_t; result_pair_t result = boost::mismatch(cont1, cont2, pred); BOOST_CHECK_EQUAL( ref1, *result.first ); BOOST_CHECK_EQUAL( ref2, *result.second ); result = boost::mismatch(boost::make_iterator_range(cont1), cont2, pred); BOOST_CHECK_EQUAL( ref1, *result.first ); BOOST_CHECK_EQUAL( ref2, *result.second ); result = boost::mismatch(cont1, boost::make_iterator_range(cont2), pred); BOOST_CHECK_EQUAL( ref1, *result.first ); BOOST_CHECK_EQUAL( ref2, *result.second ); result = boost::mismatch(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), pred); BOOST_CHECK_EQUAL( ref1, *result.first ); BOOST_CHECK_EQUAL( ref2, *result.second ); } template< class Container1, class Container2 > void test_mismatch_impl() { using namespace boost::assign; typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type MutableContainer1; typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type MutableContainer2; MutableContainer1 cont1; const Container1& cref_cont1 = cont1; MutableContainer2 cont2; const Container2& cref_cont2 = cont2; typedef BOOST_DEDUCED_TYPENAME Container1::iterator iterator1_t BOOST_RANGE_UNUSED; typedef BOOST_DEDUCED_TYPENAME Container1::const_iterator const_iterator1_t BOOST_RANGE_UNUSED; typedef BOOST_DEDUCED_TYPENAME Container2::iterator iterator2_t BOOST_RANGE_UNUSED; typedef BOOST_DEDUCED_TYPENAME Container2::const_iterator const_iterator2_t BOOST_RANGE_UNUSED; eval_mismatch(cont1, cont2, cont1.end(), cont2.end()); eval_mismatch(cont1, cont2, std::equal_to(), cont1.end(), cont2.end()); eval_mismatch(cref_cont1, cont2, cref_cont1.end(), cont2.end()); eval_mismatch(cref_cont1, cont2, std::equal_to(), cref_cont1.end(), cont2.end()); eval_mismatch(cont1, cref_cont2, cont1.end(), cref_cont2.end()); eval_mismatch(cont1, cref_cont2, std::equal_to(), cont1.end(), cref_cont2.end()); eval_mismatch(cref_cont1, cref_cont2, cref_cont1.end(), cref_cont2.end()); eval_mismatch(cref_cont1, cref_cont2, std::equal_to(), cref_cont1.end(), cref_cont2.end()); cont1 += 1,2,3,4; cont2 += 1,2,3,4; eval_mismatch(cont1, cont2, cont1.end(), cont2.end()); eval_mismatch(cont1, cont2, std::equal_to(), cont1.end(), cont2.end()); eval_mismatch(cref_cont1, cont2, cref_cont1.end(), cont2.end()); eval_mismatch(cref_cont1, cont2, std::equal_to(), cref_cont1.end(), cont2.end()); eval_mismatch(cont1, cref_cont2, cont1.end(), cref_cont2.end()); eval_mismatch(cont1, cref_cont2, std::equal_to(), cont1.end(), cref_cont2.end()); eval_mismatch(cref_cont1, cref_cont2, cref_cont1.end(), cref_cont2.end()); eval_mismatch(cref_cont1, cref_cont2, std::equal_to(), cref_cont1.end(), cref_cont2.end()); cont1.clear(); cont2.clear(); cont1 += 1,2,3,4; cont2 += 1,2,5,4; eval_mismatch(cont1, cont2, 3, 5); eval_mismatch(cont1, cont2, std::equal_to(), 3, 5); eval_mismatch(cont1, cont2, std::not_equal_to(), cont1.begin(), cont2.begin()); eval_mismatch(cref_cont1, cont2, 3, 5); eval_mismatch(cref_cont1, cont2, std::equal_to(), 3, 5); eval_mismatch(cref_cont1, cont2, std::not_equal_to(), cref_cont1.begin(), cont2.begin()); eval_mismatch(cont1, cref_cont2, 3, 5); eval_mismatch(cont1, cref_cont2, std::equal_to(), 3, 5); eval_mismatch(cont1, cref_cont2, std::not_equal_to(), cont1.begin(), cref_cont2.begin()); eval_mismatch(cref_cont1, cref_cont2, 3, 5); eval_mismatch(cref_cont1, cref_cont2, std::equal_to(), 3, 5); eval_mismatch(cref_cont1, cref_cont2, std::not_equal_to(), cref_cont1.begin(), cref_cont2.begin()); } void test_mismatch() { test_mismatch_impl< std::list, std::list >(); test_mismatch_impl< const std::list, std::list >(); test_mismatch_impl< std::list, const std::list >(); test_mismatch_impl< const std::list, const std::list >(); test_mismatch_impl< std::vector, std::list >(); test_mismatch_impl< const std::vector, std::list >(); test_mismatch_impl< std::vector, const std::list >(); test_mismatch_impl< const std::vector, const std::list >(); test_mismatch_impl< std::list, std::vector >(); test_mismatch_impl< const std::list, std::vector >(); test_mismatch_impl< std::list, const std::vector >(); test_mismatch_impl< const std::list, const std::vector >(); } } } boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[]) { boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.mismatch" ); test->add( BOOST_TEST_CASE( &boost::test_mismatch ) ); return test; }