123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- /*
- 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 ();
- }
|