Merge Algorithm changes to release; hex code cleanups; gather iterator requirements; copy_while and copy_until interface changes

[SVN r83347]
This commit is contained in:
Marshall Clow
2013-03-07 15:37:08 +00:00
parent 2381d0bdac
commit 63da6f5713
8 changed files with 141 additions and 54 deletions

View File

@ -20,6 +20,7 @@
#include <list>
#include <boost/algorithm/cxx11/all_of.hpp>
#include <boost/algorithm/cxx11/none_of.hpp>
namespace ba = boost::algorithm;
// namespace ba = boost;
@ -30,7 +31,7 @@ bool is_even ( int v ) { return v % 2 == 0; }
bool is_odd ( int v ) { return v % 2 == 1; }
template <typename Container>
void test_sequence ( Container const &c ) {
void test_copy_if ( Container const &c ) {
typedef typename Container::value_type value_type;
std::vector<value_type> v;
@ -48,13 +49,13 @@ void test_sequence ( Container const &c ) {
v.clear ();
ba::copy_if ( c.begin (), c.end (), back_inserter ( v ), is_true);
BOOST_CHECK ( v.size () == c.size ());
BOOST_CHECK ( std::equal ( c.begin (), c.end (), v.begin ()));
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 ( c.begin (), c.end (), v.begin ()));
BOOST_CHECK ( std::equal ( v.begin (), v.end (), c.begin ()));
// Some of the elements
v.clear ();
@ -69,16 +70,106 @@ void test_sequence ( Container const &c ) {
}
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 ()));
}
void test_sequence1 () {
std::vector<int> v;
for ( int i = 5; i < 15; ++i )
v.push_back ( i );
test_sequence ( v );
test_copy_if ( v );
test_copy_while ( v );
test_copy_until ( v );
std::list<int> l;
for ( int i = 25; i > 15; --i )
l.push_back ( i );
test_sequence ( l );
test_copy_if ( l );
test_copy_while ( l );
test_copy_until ( l );
}

View File

@ -55,14 +55,12 @@ void test_iterators ( Iterator first, Iterator last, Predicate comp, std::size_t
template <typename Container, typename Predicate>
void test_iterator_types ( const Container &c, Predicate comp, std::size_t offset ) {
typedef std::vector<typename Container::value_type> vec;
typedef forward_iterator<typename vec::iterator> FI;
typedef bidirectional_iterator<typename vec::iterator> BDI;
typedef random_access_iterator<typename vec::iterator> RAI;
vec v;
v.assign ( c.begin (), c.end ());
test_iterators ( FI ( v.begin ()), FI ( v.end ()), comp, offset );
v.assign ( c.begin (), c.end ());
test_iterators ( BDI ( v.begin ()), BDI ( v.end ()), comp, offset );
v.assign ( c.begin (), c.end ());
test_iterators ( RAI ( v.begin ()), RAI ( v.end ()), comp, offset );

View File

@ -14,6 +14,7 @@
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include <ctime> // for clock_t
#include <iostream>
#include <fstream>
#include <iomanip>

View File

@ -14,6 +14,7 @@
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include <ctime> // for clock_t
#include <iostream>
#include <fstream>
#include <iomanip>