blob: 1c056c7295e3ed3eadb2ba2a5b67089436b206f1 [file] [log] [blame]
/*
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 <boost/config.hpp>
#include <boost/algorithm/cxx14/mismatch.hpp>
#include "iterator_test.hpp"
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
template <typename T>
BOOST_CXX14_CONSTEXPR bool eq ( const T& a, const T& b ) { return a == b; }
template <typename T>
BOOST_CXX14_CONSTEXPR bool never_eq ( const T&, const T& ) { return false; }
namespace ba = boost::algorithm;
template <typename Iter1, typename Iter2>
BOOST_CXX14_CONSTEXPR bool iter_eq ( std::pair<Iter1, Iter2> 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<const int *>(num), input_iterator<const int *>(num),
input_iterator<const int *>(num), input_iterator<const int *>(num)),
input_iterator<const int *>(num), input_iterator<const int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
input_iterator<const int *>(num), input_iterator<const int *>(num),
never_eq<int> ),
input_iterator<const int *>(num), input_iterator<const int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( random_access_iterator<const int *>(num), random_access_iterator<const int *>(num),
random_access_iterator<const int *>(num), random_access_iterator<const int *>(num),
never_eq<int> ),
random_access_iterator<const int *>(num), random_access_iterator<const int *>(num)));
// Empty vs. non-empty mismatch immediately
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
input_iterator<const int *>(num), input_iterator<const int *>(num + 1)),
input_iterator<const int *>(num), input_iterator<const int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2),
input_iterator<const int *>(num), input_iterator<const int *>(num)),
input_iterator<const int *>(num + 1), input_iterator<const int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num + 2),
random_access_iterator<const int *>(num), random_access_iterator<const int *>(num)),
random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num)));
// Single element sequences are equal if they contain the same value
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
input_iterator<const int *>(num), input_iterator<const int *>(num + 1)),
input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
eq<int> ),
input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + 1),
random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + 1),
eq<int> ),
random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num + 1)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
never_eq<int> ),
input_iterator<const int *>(num), input_iterator<const int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + 1),
random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + 1),
never_eq<int> ),
random_access_iterator<const int *>(num), random_access_iterator<const int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)),
input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2),
eq<int> ),
input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 3),
input_iterator<const int *>(num), input_iterator<const int *>(num + 1)),
input_iterator<const int *>(num + 2), input_iterator<const int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 3),
input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
eq<int> ),
input_iterator<const int *>(num + 2), input_iterator<const int *>(num)));
// Identical long sequences are equal.
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
input_iterator<const int *>(num), input_iterator<const int *>(num + sz)),
input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
eq<int> ),
input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
never_eq<int> ),
input_iterator<const int *>(num), input_iterator<const int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + sz),
never_eq<int> ),
input_iterator<const int *>(num), random_access_iterator<const int *>(num)));
// Different sequences are different
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + sz),
input_iterator<const int *>(num), input_iterator<const int *>(num + sz)),
input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 1)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + sz),
input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
eq<int> ),
input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 1)));
// Checks constexpr
BOOST_CXX14_CONSTEXPR bool res = (
// No mismatch for empty
iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
input_iterator<const int *>(num), input_iterator<const int *>(num)),
input_iterator<const int *>(num), input_iterator<const int *>(num))
// Empty vs. non-empty mismatch immediately
&& iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
input_iterator<const int *>(num), input_iterator<const int *>(num + 1)),
input_iterator<const int *>(num), input_iterator<const int *>(num))
// Single element sequences are equal if they contain the same value
&& iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
eq<int>),
input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1))
// Identical long sequences are equal.
&& iter_eq (
ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
eq<int> ),
input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz))
);
BOOST_CHECK ( res );
}
BOOST_AUTO_TEST_CASE( test_main )
{
test_mismatch ();
}