Merge c++14 changes to release

[SVN r84415]
This commit is contained in:
Marshall Clow
2013-05-22 15:10:49 +00:00
8 changed files with 814 additions and 26 deletions

View File

@ -47,6 +47,10 @@ alias unit_test_framework
[ run is_partitioned_test1.cpp unit_test_framework : : : : is_partitioned_test1 ]
[ run partition_copy_test1.cpp unit_test_framework : : : : partition_copy_test1 ]
# Cxx14 tests
[ run equal_test.cpp unit_test_framework : : : : equal_test ]
[ run mismatch_test.cpp unit_test_framework : : : : mismatch_test ]
# Hex tests
[ run hex_test1.cpp unit_test_framework : : : : hex_test1 ]
[ run hex_test2.cpp unit_test_framework : : : : hex_test2 ]

129
test/equal_test.cpp Normal file
View File

@ -0,0 +1,129 @@
/*
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/equal.hpp>
#include "iterator_test.hpp"
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
template <typename T>
bool eq ( const T& a, const T& b ) { return a == b; }
template <typename T>
bool never_eq ( const T&, const T& ) { return false; }
int comparison_count = 0;
template <typename T>
bool counting_equals ( const T &a, const T &b ) {
++comparison_count;
return a == b;
}
namespace ba = boost::algorithm;
void test_equal ()
{
// Note: The literal values here are tested against directly, careful if you change them:
int num[] = { 1, 1, 2, 3, 5 };
const int sz = sizeof (num)/sizeof(num[0]);
// Empty sequences are equal to each other, but not to non-empty sequences
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num),
input_iterator<int *>(num), input_iterator<int *>(num)));
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num),
input_iterator<int *>(num), input_iterator<int *>(num),
never_eq<int> ));
BOOST_CHECK ( ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num),
random_access_iterator<int *>(num), random_access_iterator<int *>(num),
never_eq<int> ));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num),
input_iterator<int *>(num), input_iterator<int *>(num + 1)));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 1), input_iterator<int *>(num + 2),
input_iterator<int *>(num), input_iterator<int *>(num)));
BOOST_CHECK (!ba::equal ( random_access_iterator<int *>(num + 1), random_access_iterator<int *>(num + 2),
random_access_iterator<int *>(num), random_access_iterator<int *>(num)));
// Single element sequences are equal if they contain the same value
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num), input_iterator<int *>(num + 1)));
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num), input_iterator<int *>(num + 1),
eq<int> ));
BOOST_CHECK ( ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
eq<int> ));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num), input_iterator<int *>(num + 1),
never_eq<int> ));
BOOST_CHECK (!ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
never_eq<int> ));
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num + 1), input_iterator<int *>(num + 2)));
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num + 1), input_iterator<int *>(num + 2),
eq<int> ));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 2), input_iterator<int *>(num + 3),
input_iterator<int *>(num), input_iterator<int *>(num + 1)));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 2), input_iterator<int *>(num + 3),
input_iterator<int *>(num), input_iterator<int *>(num + 1),
eq<int> ));
// Identical long sequences are equal.
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz)));
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz),
eq<int> ));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz),
never_eq<int> ));
BOOST_CHECK ( ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
eq<int> ));
// different sequences are different
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 1), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz)));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num + 1), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz),
eq<int> ));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz - 1)));
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz - 1),
eq<int> ));
// When there's a cheap check, bail early
comparison_count = 0;
BOOST_CHECK (!ba::equal ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz - 1),
counting_equals<int> ));
BOOST_CHECK ( comparison_count == 0 );
// And when there's not, we can't
comparison_count = 0;
BOOST_CHECK (!ba::equal ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz - 1),
counting_equals<int> ));
BOOST_CHECK ( comparison_count > 0 );
}
BOOST_AUTO_TEST_CASE( test_main )
{
test_equal ();
}

View File

@ -19,10 +19,95 @@
#include <vector>
#include <list>
#include "iterator_test.hpp"
template <typename T>
bool eq ( const T& a, const T& b ) { return a == b; }
template <typename T>
bool never_eq ( const T&, const T& ) { return false; }
namespace ba = boost::algorithm;
// namespace ba = boost;
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<int *>(num), forward_iterator<int *>(num),
forward_iterator<int *>(num)));
BOOST_CHECK (
ba::is_permutation (
forward_iterator<int *>(num), forward_iterator<int *>(num),
forward_iterator<int *>(num), forward_iterator<int *>(num)));
BOOST_CHECK (
ba::is_permutation (
random_access_iterator<int *>(num), random_access_iterator<int *>(num),
random_access_iterator<int *>(num), random_access_iterator<int *>(num)));
BOOST_CHECK (
ba::is_permutation (
forward_iterator<int *>(num), forward_iterator<int *>(num),
forward_iterator<int *>(num),
never_eq<int> )); // Since the sequences are empty, the pred is never called
// Empty vs. non-empty
BOOST_CHECK ( !
ba::is_permutation (
forward_iterator<int *>(num), forward_iterator<int *>(num),
forward_iterator<int *>(num), forward_iterator<int *>(num + 1)));
BOOST_CHECK ( !
ba::is_permutation (
forward_iterator<int *>(num + 1), forward_iterator<int *>(num + 2),
forward_iterator<int *>(num), forward_iterator<int *>(num)));
BOOST_CHECK ( !
ba::is_permutation (
random_access_iterator<int *>(num + 1), random_access_iterator<int *>(num + 2),
random_access_iterator<int *>(num), random_access_iterator<int *>(num)));
BOOST_CHECK ( !
ba::is_permutation (
random_access_iterator<int *>(num), random_access_iterator<int *>(num),
random_access_iterator<int *>(num + 1), random_access_iterator<int *>(num + 2)));
// Something should be a permutation of itself
BOOST_CHECK (
ba::is_permutation (
forward_iterator<int *>(num), forward_iterator<int *>(num + sz),
forward_iterator<int *>(num)));
BOOST_CHECK (
ba::is_permutation (
forward_iterator<int *>(num), forward_iterator<int *>(num + sz),
forward_iterator<int *>(num), eq<int> ));
BOOST_CHECK (
ba::is_permutation (
forward_iterator<int *>(num), forward_iterator<int *>(num + sz),
forward_iterator<int *>(num), forward_iterator<int *>(num + sz )));
BOOST_CHECK (
ba::is_permutation (
forward_iterator<int *>(num), forward_iterator<int *>(num + sz),
forward_iterator<int *>(num), forward_iterator<int *>(num + sz ),
eq<int> ));
BOOST_CHECK (
ba::is_permutation (
random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz)));
BOOST_CHECK (
ba::is_permutation (
random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
eq<int> ));
BOOST_CHECK (
ba::is_permutation (
random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
forward_iterator<int *>(num), forward_iterator<int *>(num + sz),
eq<int> ));
std::vector<int> v, v1;
v.clear ();

168
test/mismatch_test.cpp Normal file
View File

@ -0,0 +1,168 @@
/*
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>
bool eq ( const T& a, const T& b ) { return a == b; }
template <typename T>
bool never_eq ( const T&, const T& ) { return false; }
namespace ba = boost::algorithm;
template <typename Iter1, typename Iter2>
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:
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<int *>(num), input_iterator<int *>(num),
input_iterator<int *>(num), input_iterator<int *>(num)),
input_iterator<int *>(num), input_iterator<int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num),
input_iterator<int *>(num), input_iterator<int *>(num),
never_eq<int> ),
input_iterator<int *>(num), input_iterator<int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( random_access_iterator<int *>(num), random_access_iterator<int *>(num),
random_access_iterator<int *>(num), random_access_iterator<int *>(num),
never_eq<int> ),
random_access_iterator<int *>(num), random_access_iterator<int *>(num)));
// Empty vs. non-empty mismatch immediately
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num),
input_iterator<int *>(num), input_iterator<int *>(num + 1)),
input_iterator<int *>(num), input_iterator<int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num + 1), input_iterator<int *>(num + 2),
input_iterator<int *>(num), input_iterator<int *>(num)),
input_iterator<int *>(num + 1), input_iterator<int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( random_access_iterator<int *>(num + 1), random_access_iterator<int *>(num + 2),
random_access_iterator<int *>(num), random_access_iterator<int *>(num)),
random_access_iterator<int *>(num + 1), random_access_iterator<int *>(num)));
// Single element sequences are equal if they contain the same value
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num), input_iterator<int *>(num + 1)),
input_iterator<int *>(num + 1), input_iterator<int *>(num + 1)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num), input_iterator<int *>(num + 1),
eq<int> ),
input_iterator<int *>(num + 1), input_iterator<int *>(num + 1)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
eq<int> ),
random_access_iterator<int *>(num + 1), random_access_iterator<int *>(num + 1)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num), input_iterator<int *>(num + 1),
never_eq<int> ),
input_iterator<int *>(num), input_iterator<int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + 1),
never_eq<int> ),
random_access_iterator<int *>(num), random_access_iterator<int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num + 1), input_iterator<int *>(num + 2)),
input_iterator<int *>(num + 1), input_iterator<int *>(num + 2)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + 1),
input_iterator<int *>(num + 1), input_iterator<int *>(num + 2),
eq<int> ),
input_iterator<int *>(num + 1), input_iterator<int *>(num + 2)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num + 2), input_iterator<int *>(num + 3),
input_iterator<int *>(num), input_iterator<int *>(num + 1)),
input_iterator<int *>(num + 2), input_iterator<int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num + 2), input_iterator<int *>(num + 3),
input_iterator<int *>(num), input_iterator<int *>(num + 1),
eq<int> ),
input_iterator<int *>(num + 2), input_iterator<int *>(num)));
// Identical long sequences are equal.
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz)),
input_iterator<int *>(num + sz), input_iterator<int *>(num + sz)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz),
eq<int> ),
input_iterator<int *>(num + sz), input_iterator<int *>(num + sz)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz),
never_eq<int> ),
input_iterator<int *>(num), input_iterator<int *>(num)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num), input_iterator<int *>(num + sz),
random_access_iterator<int *>(num), random_access_iterator<int *>(num + sz),
never_eq<int> ),
input_iterator<int *>(num), random_access_iterator<int *>(num)));
// different sequences are different
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num + 1), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz)),
input_iterator<int *>(num + 2), input_iterator<int *>(num + 1)));
BOOST_CHECK ( iter_eq (
ba::mismatch ( input_iterator<int *>(num + 1), input_iterator<int *>(num + sz),
input_iterator<int *>(num), input_iterator<int *>(num + sz),
eq<int> ),
input_iterator<int *>(num + 2), input_iterator<int *>(num + 1)));
}
BOOST_AUTO_TEST_CASE( test_main )
{
test_mismatch ();
}