/* Copyright (c) Marshall Clow 2011-2012. 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 #include #define BOOST_TEST_MAIN #include #include #include #include #include "iterator_test.hpp" template bool eq ( const T& a, const T& b ) { return a == b; } template bool never_eq ( const T&, const T& ) { return false; } namespace ba = boost::algorithm; void test_sequence1 () { int num[] = { 1, 1, 2, 3, 5 }; const int sz = sizeof (num)/sizeof(num[0]); // Empty sequences BOOST_CHECK ( ba::is_permutation ( forward_iterator(num), forward_iterator(num), forward_iterator(num))); BOOST_CHECK ( ba::is_permutation ( forward_iterator(num), forward_iterator(num), forward_iterator(num), forward_iterator(num))); BOOST_CHECK ( ba::is_permutation ( random_access_iterator(num), random_access_iterator(num), random_access_iterator(num), random_access_iterator(num))); BOOST_CHECK ( ba::is_permutation ( forward_iterator(num), forward_iterator(num), forward_iterator(num), never_eq )); // Since the sequences are empty, the pred is never called // Empty vs. non-empty BOOST_CHECK ( ! ba::is_permutation ( forward_iterator(num), forward_iterator(num), forward_iterator(num), forward_iterator(num + 1))); BOOST_CHECK ( ! ba::is_permutation ( forward_iterator(num + 1), forward_iterator(num + 2), forward_iterator(num), forward_iterator(num))); BOOST_CHECK ( ! ba::is_permutation ( random_access_iterator(num + 1), random_access_iterator(num + 2), random_access_iterator(num), random_access_iterator(num))); BOOST_CHECK ( ! ba::is_permutation ( random_access_iterator(num), random_access_iterator(num), random_access_iterator(num + 1), random_access_iterator(num + 2))); // Something should be a permutation of itself BOOST_CHECK ( ba::is_permutation ( forward_iterator(num), forward_iterator(num + sz), forward_iterator(num))); BOOST_CHECK ( ba::is_permutation ( forward_iterator(num), forward_iterator(num + sz), forward_iterator(num), eq )); BOOST_CHECK ( ba::is_permutation ( forward_iterator(num), forward_iterator(num + sz), forward_iterator(num), forward_iterator(num + sz ))); BOOST_CHECK ( ba::is_permutation ( forward_iterator(num), forward_iterator(num + sz), forward_iterator(num), forward_iterator(num + sz ), eq )); BOOST_CHECK ( ba::is_permutation ( random_access_iterator(num), random_access_iterator(num + sz), random_access_iterator(num), random_access_iterator(num + sz))); BOOST_CHECK ( ba::is_permutation ( random_access_iterator(num), random_access_iterator(num + sz), random_access_iterator(num), random_access_iterator(num + sz), eq )); BOOST_CHECK ( ba::is_permutation ( random_access_iterator(num), random_access_iterator(num + sz), forward_iterator(num), forward_iterator(num + sz), eq )); std::vector v, v1; v.clear (); for ( std::size_t i = 5; i < 15; ++i ) v.push_back ( i ); v1 = v; BOOST_CHECK ( ba::is_permutation ( v.begin (), v.end (), v.begin ())); // better be a permutation of itself! BOOST_CHECK ( ba::is_permutation ( v.begin (), v.end (), v1.begin ())); // With bidirectional iterators. std::list l; std::copy ( v.begin (), v.end (), std::back_inserter ( l )); BOOST_CHECK ( ba::is_permutation ( l.begin (), l.end (), l.begin ())); // better be a permutation of itself! BOOST_CHECK ( ba::is_permutation ( l.begin (), l.end (), v1.begin ())); for ( std::size_t i = 0; i < l.size (); ++i ) { l.push_back ( *l.begin ()); l.pop_front (); // rotation BOOST_CHECK ( ba::is_permutation ( l.begin (), l.end (), v1.begin ())); } } BOOST_AUTO_TEST_CASE( test_main ) { test_sequence1 (); }