/* Copyright (c) Marshall Clow 2013. 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) For more information, see http://www.boost.org */ #include #include #include "iterator_test.hpp" #define BOOST_TEST_MAIN #include template BOOST_CXX14_CONSTEXPR bool eq ( const T& a, const T& b ) { return a == b; } template BOOST_CXX14_CONSTEXPR bool never_eq ( const T&, const T& ) { return false; } namespace ba = boost::algorithm; template BOOST_CXX14_CONSTEXPR bool iter_eq ( std::pair pr, Iter1 first, Iter2 second ) { return pr.first == first && pr.second == second; } void test_mismatch () { // Note: The literal values here are tested against directly, careful if you change them: BOOST_CXX14_CONSTEXPR int num[] = { 1, 1, 2, 3, 5 }; const int sz = sizeof (num)/sizeof(num[0]); // No mismatch for empty sequences BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num), input_iterator(num), input_iterator(num)), input_iterator(num), input_iterator(num))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num), input_iterator(num), input_iterator(num), never_eq ), input_iterator(num), input_iterator(num))); BOOST_CHECK ( iter_eq ( ba::mismatch ( random_access_iterator(num), random_access_iterator(num), random_access_iterator(num), random_access_iterator(num), never_eq ), random_access_iterator(num), random_access_iterator(num))); // Empty vs. non-empty mismatch immediately BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num), input_iterator(num), input_iterator(num + 1)), input_iterator(num), input_iterator(num))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num + 1), input_iterator(num + 2), input_iterator(num), input_iterator(num)), input_iterator(num + 1), input_iterator(num))); BOOST_CHECK ( iter_eq ( ba::mismatch ( random_access_iterator(num + 1), random_access_iterator(num + 2), random_access_iterator(num), random_access_iterator(num)), random_access_iterator(num + 1), random_access_iterator(num))); // Single element sequences are equal if they contain the same value BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + 1), input_iterator(num), input_iterator(num + 1)), input_iterator(num + 1), input_iterator(num + 1))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + 1), input_iterator(num), input_iterator(num + 1), eq ), input_iterator(num + 1), input_iterator(num + 1))); BOOST_CHECK ( iter_eq ( ba::mismatch ( random_access_iterator(num), random_access_iterator(num + 1), random_access_iterator(num), random_access_iterator(num + 1), eq ), random_access_iterator(num + 1), random_access_iterator(num + 1))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + 1), input_iterator(num), input_iterator(num + 1), never_eq ), input_iterator(num), input_iterator(num))); BOOST_CHECK ( iter_eq ( ba::mismatch ( random_access_iterator(num), random_access_iterator(num + 1), random_access_iterator(num), random_access_iterator(num + 1), never_eq ), random_access_iterator(num), random_access_iterator(num))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + 1), input_iterator(num + 1), input_iterator(num + 2)), input_iterator(num + 1), input_iterator(num + 2))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + 1), input_iterator(num + 1), input_iterator(num + 2), eq ), input_iterator(num + 1), input_iterator(num + 2))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num + 2), input_iterator(num + 3), input_iterator(num), input_iterator(num + 1)), input_iterator(num + 2), input_iterator(num))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num + 2), input_iterator(num + 3), input_iterator(num), input_iterator(num + 1), eq ), input_iterator(num + 2), input_iterator(num))); // Identical long sequences are equal. BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + sz), input_iterator(num), input_iterator(num + sz)), input_iterator(num + sz), input_iterator(num + sz))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + sz), input_iterator(num), input_iterator(num + sz), eq ), input_iterator(num + sz), input_iterator(num + sz))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + sz), input_iterator(num), input_iterator(num + sz), never_eq ), input_iterator(num), input_iterator(num))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + sz), random_access_iterator(num), random_access_iterator(num + sz), never_eq ), input_iterator(num), random_access_iterator(num))); // Different sequences are different BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num + 1), input_iterator(num + sz), input_iterator(num), input_iterator(num + sz)), input_iterator(num + 2), input_iterator(num + 1))); BOOST_CHECK ( iter_eq ( ba::mismatch ( input_iterator(num + 1), input_iterator(num + sz), input_iterator(num), input_iterator(num + sz), eq ), input_iterator(num + 2), input_iterator(num + 1))); // Checks constexpr BOOST_CXX14_CONSTEXPR bool res = ( // No mismatch for empty iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num), input_iterator(num), input_iterator(num)), input_iterator(num), input_iterator(num)) // Empty vs. non-empty mismatch immediately && iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num), input_iterator(num), input_iterator(num + 1)), input_iterator(num), input_iterator(num)) // Single element sequences are equal if they contain the same value && iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + 1), input_iterator(num), input_iterator(num + 1), eq), input_iterator(num + 1), input_iterator(num + 1)) // Identical long sequences are equal. && iter_eq ( ba::mismatch ( input_iterator(num), input_iterator(num + sz), input_iterator(num), input_iterator(num + sz), eq ), input_iterator(num + sz), input_iterator(num + sz)) ); BOOST_CHECK ( res ); } BOOST_AUTO_TEST_CASE( test_main ) { test_mismatch (); }