123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- /*
- 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 <boost/config.hpp>
- #include <boost/algorithm/cxx11/copy_if.hpp>
- #include "iterator_test.hpp"
- #define BOOST_TEST_MAIN
- #include <boost/test/unit_test.hpp>
- #include <algorithm>
- #include <string>
- #include <iostream>
- #include <vector>
- #include <list>
- #include <boost/algorithm/cxx11/all_of.hpp>
- #include <boost/algorithm/cxx14/equal.hpp>
- #include <boost/algorithm/cxx11/none_of.hpp>
- 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 <typename Container>
- void test_copy_if ( Container const &c ) {
- typedef typename Container::value_type value_type;
- std::vector<value_type> 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 <typename Container>
- void test_copy_while ( Container const &c ) {
- typedef typename Container::value_type value_type;
- typename Container::const_iterator it;
- std::vector<value_type> 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 <typename Container>
- void test_copy_until ( Container const &c ) {
- typedef typename Container::value_type value_type;
- typename Container::const_iterator it;
- std::vector<value_type> 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<const int *>(out_data), input_iterator<const int *>(out_data + sz),
- input_iterator<const int *>(from), input_iterator<const int *>(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<const int *>(out_data), input_iterator<const int *>(out_data + sz),
- input_iterator<const int *>(from), input_iterator<const int *>(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<const int *>(out_data), input_iterator<const int *>(out_data + sz),
- input_iterator<const int *>(from), input_iterator<const int *>(to)));
-
- return res;
- }
-
-
- void test_sequence1 () {
- std::vector<int> 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<int> 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 ();
- }
|