/* Copyright (c) Marshall Clow 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 "iterator_test.hpp" #define BOOST_TEST_MAIN #include #include #include #include #include #include #include #include #include namespace ba = boost::algorithm; // namespace ba = boost; BOOST_CXX14_CONSTEXPR bool is_true ( int v ) { return true; } BOOST_CXX14_CONSTEXPR bool is_false ( int v ) { return false; } BOOST_CXX14_CONSTEXPR bool is_even ( int v ) { return v % 2 == 0; } BOOST_CXX14_CONSTEXPR bool is_odd ( int v ) { return v % 2 == 1; } BOOST_CXX14_CONSTEXPR bool is_zero ( int v ) { return v == 0; } template void test_copy_if ( Container const &c ) { typedef typename Container::value_type value_type; std::vector v; // None of the elements v.clear (); ba::copy_if ( c.begin (), c.end (), back_inserter ( v ), is_false); BOOST_CHECK ( v.size () == 0 ); v.clear (); ba::copy_if ( c, back_inserter ( v ), is_false); BOOST_CHECK ( v.size () == 0 ); // All the elements v.clear (); ba::copy_if ( c.begin (), c.end (), back_inserter ( v ), is_true); BOOST_CHECK ( v.size () == c.size ()); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); v.clear (); ba::copy_if ( c, back_inserter ( v ), is_true); BOOST_CHECK ( v.size () == c.size ()); BOOST_CHECK ( v.size () == c.size ()); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); // Some of the elements v.clear (); ba::copy_if ( c.begin (), c.end (), back_inserter ( v ), is_even ); BOOST_CHECK ( v.size () == (size_t) std::count_if ( c.begin (), c.end (), is_even )); BOOST_CHECK ( ba::all_of ( v.begin (), v.end (), is_even )); v.clear (); ba::copy_if ( c, back_inserter ( v ), is_even ); BOOST_CHECK ( v.size () == (size_t) std::count_if ( c.begin (), c.end (), is_even )); BOOST_CHECK ( ba::all_of ( v.begin (), v.end (), is_even )); } template void test_copy_while ( Container const &c ) { typedef typename Container::value_type value_type; typename Container::const_iterator it; std::vector v; // None of the elements v.clear (); ba::copy_while ( c.begin (), c.end (), back_inserter ( v ), is_false); BOOST_CHECK ( v.size () == 0 ); v.clear (); ba::copy_while ( c, back_inserter ( v ), is_false); BOOST_CHECK ( v.size () == 0 ); // All the elements v.clear (); ba::copy_while ( c.begin (), c.end (), back_inserter ( v ), is_true); BOOST_CHECK ( v.size () == c.size ()); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); v.clear (); ba::copy_while ( c, back_inserter ( v ), is_true); BOOST_CHECK ( v.size () == c.size ()); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); // Some of the elements v.clear (); it = ba::copy_while ( c.begin (), c.end (), back_inserter ( v ), is_even ).first; BOOST_CHECK ( v.size () == (size_t) std::distance ( c.begin (), it )); BOOST_CHECK ( it == c.end () || !is_even ( *it )); BOOST_CHECK ( ba::all_of ( v.begin (), v.end (), is_even )); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); v.clear (); it = ba::copy_while ( c, back_inserter ( v ), is_even ).first; BOOST_CHECK ( v.size () == (size_t) std::distance ( c.begin (), it )); BOOST_CHECK ( it == c.end () || !is_even ( *it )); BOOST_CHECK ( ba::all_of ( v.begin (), v.end (), is_even )); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); } template void test_copy_until ( Container const &c ) { typedef typename Container::value_type value_type; typename Container::const_iterator it; std::vector v; // None of the elements v.clear (); ba::copy_until ( c.begin (), c.end (), back_inserter ( v ), is_true); BOOST_CHECK ( v.size () == 0 ); v.clear (); ba::copy_until ( c, back_inserter ( v ), is_true); BOOST_CHECK ( v.size () == 0 ); // All the elements v.clear (); ba::copy_until ( c.begin (), c.end (), back_inserter ( v ), is_false); BOOST_CHECK ( v.size () == c.size ()); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); v.clear (); ba::copy_until ( c, back_inserter ( v ), is_false); BOOST_CHECK ( v.size () == c.size ()); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); // Some of the elements v.clear (); it = ba::copy_until ( c.begin (), c.end (), back_inserter ( v ), is_even ).first; BOOST_CHECK ( v.size () == (size_t) std::distance ( c.begin (), it )); BOOST_CHECK ( it == c.end () || is_even ( *it )); BOOST_CHECK ( ba::none_of ( v.begin (), v.end (), is_even )); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); v.clear (); it = ba::copy_until ( c, back_inserter ( v ), is_even ).first; BOOST_CHECK ( v.size () == (size_t) std::distance ( c.begin (), it )); BOOST_CHECK ( it == c.end () || is_even ( *it )); BOOST_CHECK ( ba::none_of ( v.begin (), v.end (), is_even )); BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ())); } BOOST_CXX14_CONSTEXPR inline bool constexpr_test_copy_if() { const int sz = 64; int in_data[sz] = {0}; bool res = true; const int* from = in_data; const int* to = in_data + sz; int out_data[sz] = {0}; int* out = out_data; out = ba::copy_if ( from, to, out, is_false ); // copy none res = (res && out == out_data); out = ba::copy_if ( from, to, out, is_true ); // copy all res = (res && out == out_data + sz && ba::equal( input_iterator(out_data), input_iterator(out_data + sz), input_iterator(from), input_iterator(to))); return res; } BOOST_CXX14_CONSTEXPR inline bool constexpr_test_copy_while() { const int sz = 64; int in_data[sz] = {0}; bool res = true; const int* from = in_data; const int* to = in_data + sz; int out_data[sz] = {0}; int* out = out_data; out = ba::copy_while ( from, to, out, is_false ).second; // copy none res = (res && out == out_data && ba::all_of(out, out + sz, is_zero)); out = ba::copy_while ( from, to, out, is_true ).second; // copy all res = (res && out == out_data + sz && ba::equal( input_iterator(out_data), input_iterator(out_data + sz), input_iterator(from), input_iterator(to))); return res; } BOOST_CXX14_CONSTEXPR inline bool constexpr_test_copy_until() { const int sz = 64; int in_data[sz] = {0}; bool res = true; const int* from = in_data; const int* to = in_data + sz; int out_data[sz] = {0}; int* out = out_data; out = ba::copy_until ( from, to, out, is_true ).second; // copy none res = (res && out == out_data && ba::all_of(out, out + sz, is_zero)); out = ba::copy_until ( from, to, out, is_false ).second; // copy all res = (res && out == out_data + sz && ba::equal( input_iterator(out_data), input_iterator(out_data + sz), input_iterator(from), input_iterator(to))); return res; } void test_sequence1 () { std::vector v; for ( int i = 5; i < 15; ++i ) v.push_back ( i ); test_copy_if ( v ); test_copy_while ( v ); test_copy_until ( v ); BOOST_CXX14_CONSTEXPR bool constexpr_res_if = constexpr_test_copy_if(); BOOST_CHECK ( constexpr_res_if ); BOOST_CXX14_CONSTEXPR bool constexpr_res_while = constexpr_test_copy_while(); BOOST_CHECK ( constexpr_res_while ); BOOST_CXX14_CONSTEXPR bool constexpr_res_until = constexpr_test_copy_until(); BOOST_CHECK ( constexpr_res_until ); std::list l; for ( int i = 25; i > 15; --i ) l.push_back ( i ); test_copy_if ( l ); test_copy_while ( l ); test_copy_until ( l ); } BOOST_AUTO_TEST_CASE( test_main ) { test_sequence1 (); }