diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-09-06 18:46:46 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-09-06 18:46:46 +0000 |
| commit | 61b9a7258a7693d7f3674a5a1daf7b036ff1d382 (patch) | |
| tree | ec41ed70ffca97240e76f9a78bb2dedba28f310c /test/std/algorithms/alg.sorting/alg.merge | |
| parent | f857581820d15e410e9945d2fcd5f7163be25a96 (diff) | |
Notes
Diffstat (limited to 'test/std/algorithms/alg.sorting/alg.merge')
4 files changed, 712 insertions, 0 deletions
diff --git a/test/std/algorithms/alg.sorting/alg.merge/inplace_merge.pass.cpp b/test/std/algorithms/alg.sorting/alg.merge/inplace_merge.pass.cpp new file mode 100644 index 000000000000..829157353fb3 --- /dev/null +++ b/test/std/algorithms/alg.sorting/alg.merge/inplace_merge.pass.cpp @@ -0,0 +1,108 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <algorithm> + +// template<BidirectionalIterator Iter> +// requires ShuffleIterator<Iter> +// && LessThanComparable<Iter::value_type> +// void +// inplace_merge(Iter first, Iter middle, Iter last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +#if TEST_STD_VER >= 11 +struct S { + S() : i_(0) {} + S(int i) : i_(i) {} + + S(const S& rhs) : i_(rhs.i_) {} + S( S&& rhs) : i_(rhs.i_) { rhs.i_ = -1; } + + S& operator =(const S& rhs) { i_ = rhs.i_; return *this; } + S& operator =( S&& rhs) { i_ = rhs.i_; rhs.i_ = -2; assert(this != &rhs); return *this; } + S& operator =(int i) { i_ = i; return *this; } + + bool operator <(const S& rhs) const { return i_ < rhs.i_; } + bool operator ==(const S& rhs) const { return i_ == rhs.i_; } + bool operator ==(int i) const { return i_ == i; } + + void set(int i) { i_ = i; } + + int i_; + }; +#endif + +template <class Iter> +void +test_one(unsigned N, unsigned M) +{ + typedef typename std::iterator_traits<Iter>::value_type value_type; + assert(M <= N); + value_type* ia = new value_type[N]; + for (unsigned i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::sort(ia, ia+M); + std::sort(ia+M, ia+N); + std::inplace_merge(Iter(ia), Iter(ia+M), Iter(ia+N)); + if(N > 0) + { + assert(ia[0] == 0); + assert(ia[N-1] == N-1); + assert(std::is_sorted(ia, ia+N)); + } + delete [] ia; +} + +template <class Iter> +void +test(unsigned N) +{ + test_one<Iter>(N, 0); + test_one<Iter>(N, N/4); + test_one<Iter>(N, N/2); + test_one<Iter>(N, 3*N/4); + test_one<Iter>(N, N); +} + +template <class Iter> +void +test() +{ + test_one<Iter>(0, 0); + test_one<Iter>(1, 0); + test_one<Iter>(1, 1); + test_one<Iter>(2, 0); + test_one<Iter>(2, 1); + test_one<Iter>(2, 2); + test_one<Iter>(3, 0); + test_one<Iter>(3, 1); + test_one<Iter>(3, 2); + test_one<Iter>(3, 3); + test<Iter>(4); + test<Iter>(100); + test<Iter>(1000); +} + +int main() +{ + test<bidirectional_iterator<int*> >(); + test<random_access_iterator<int*> >(); + test<int*>(); + +#if TEST_STD_VER >= 11 + test<bidirectional_iterator<S*> >(); + test<random_access_iterator<S*> >(); + test<S*>(); +#endif // TEST_STD_VER >= 11 +} diff --git a/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp b/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp new file mode 100644 index 000000000000..ca6f8e40cbd3 --- /dev/null +++ b/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp @@ -0,0 +1,146 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <algorithm> + +// template<BidirectionalIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires ShuffleIterator<Iter> +// && CopyConstructible<Compare> +// void +// inplace_merge(Iter first, Iter middle, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_macros.h" + +#if TEST_STD_VER >= 11 +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +struct S { + S() : i_(0) {} + S(int i) : i_(i) {} + + S(const S& rhs) : i_(rhs.i_) {} + S( S&& rhs) : i_(rhs.i_) { rhs.i_ = -1; } + + S& operator =(const S& rhs) { i_ = rhs.i_; return *this; } + S& operator =( S&& rhs) { i_ = rhs.i_; rhs.i_ = -2; assert(this != &rhs); return *this; } + S& operator =(int i) { i_ = i; return *this; } + + bool operator <(const S& rhs) const { return i_ < rhs.i_; } + bool operator >(const S& rhs) const { return i_ > rhs.i_; } + bool operator ==(const S& rhs) const { return i_ == rhs.i_; } + bool operator ==(int i) const { return i_ == i; } + + void set(int i) { i_ = i; } + + int i_; + }; + + +#endif // TEST_STD_VER >= 11 + +#include "test_iterators.h" +#include "counting_predicates.hpp" + +template <class Iter> +void +test_one(unsigned N, unsigned M) +{ + assert(M <= N); + typedef typename std::iterator_traits<Iter>::value_type value_type; + value_type* ia = new value_type[N]; + for (unsigned i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::sort(ia, ia+M, std::greater<value_type>()); + std::sort(ia+M, ia+N, std::greater<value_type>()); + binary_counting_predicate<std::greater<value_type>, value_type, value_type> pred((std::greater<value_type>())); + std::inplace_merge(Iter(ia), Iter(ia+M), Iter(ia+N), std::ref(pred)); + if(N > 0) + { + assert(ia[0] == N-1); + assert(ia[N-1] == 0); + assert(std::is_sorted(ia, ia+N, std::greater<value_type>())); + assert(pred.count() <= (N-1)); + } + delete [] ia; +} + +template <class Iter> +void +test(unsigned N) +{ + test_one<Iter>(N, 0); + test_one<Iter>(N, N/4); + test_one<Iter>(N, N/2); + test_one<Iter>(N, 3*N/4); + test_one<Iter>(N, N); +} + +template <class Iter> +void +test() +{ + test_one<Iter>(0, 0); + test_one<Iter>(1, 0); + test_one<Iter>(1, 1); + test_one<Iter>(2, 0); + test_one<Iter>(2, 1); + test_one<Iter>(2, 2); + test_one<Iter>(3, 0); + test_one<Iter>(3, 1); + test_one<Iter>(3, 2); + test_one<Iter>(3, 3); + test<Iter>(4); + test<Iter>(20); + test<Iter>(100); + test<Iter>(1000); +} + +int main() +{ + test<bidirectional_iterator<int*> >(); + test<random_access_iterator<int*> >(); + test<int*>(); + +#if TEST_STD_VER >= 11 + test<bidirectional_iterator<S*> >(); + test<random_access_iterator<S*> >(); + test<S*>(); + + { + unsigned N = 100; + unsigned M = 50; + std::unique_ptr<int>* ia = new std::unique_ptr<int>[N]; + for (unsigned i = 0; i < N; ++i) + ia[i].reset(new int(i)); + std::random_shuffle(ia, ia+N); + std::sort(ia, ia+M, indirect_less()); + std::sort(ia+M, ia+N, indirect_less()); + std::inplace_merge(ia, ia+M, ia+N, indirect_less()); + if(N > 0) + { + assert(*ia[0] == 0); + assert(*ia[N-1] == N-1); + assert(std::is_sorted(ia, ia+N, indirect_less())); + } + delete [] ia; + } +#endif // TEST_STD_VER >= 11 +} diff --git a/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp b/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp new file mode 100644 index 000000000000..de96c419c4ea --- /dev/null +++ b/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp @@ -0,0 +1,224 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// REQUIRES: long_tests + +// <algorithm> + +// template<InputIterator InIter1, InputIterator InIter2, typename OutIter> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && HasLess<InIter2::value_type, InIter1::value_type> +// OutIter +// merge(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, OutIter result); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class InIter1, class InIter2, class OutIter> +void +test() +{ + { + unsigned N = 100000; + int* ia = new int[N]; + int* ib = new int[N]; + int* ic = new int[2*N]; + for (unsigned i = 0; i < N; ++i) + ia[i] = 2*i; + for (unsigned i = 0; i < N; ++i) + ib[i] = 2*i+1; + OutIter r = std::merge(InIter1(ia), InIter1(ia+N), + InIter2(ib), InIter2(ib+N), OutIter(ic)); + assert(base(r) == ic+2*N); + assert(ic[0] == 0); + assert(ic[2*N-1] == 2*N-1); + assert(std::is_sorted(ic, ic+2*N)); + delete [] ic; + delete [] ib; + delete [] ia; + } + { + unsigned N = 100; + int* ia = new int[N]; + int* ib = new int[N]; + int* ic = new int[2*N]; + for (unsigned i = 0; i < 2*N; ++i) + ic[i] = i; + std::random_shuffle(ic, ic+2*N); + std::copy(ic, ic+N, ia); + std::copy(ic+N, ic+2*N, ib); + std::sort(ia, ia+N); + std::sort(ib, ib+N); + OutIter r = std::merge(InIter1(ia), InIter1(ia+N), + InIter2(ib), InIter2(ib+N), OutIter(ic)); + assert(base(r) == ic+2*N); + assert(ic[0] == 0); + assert(ic[2*N-1] == 2*N-1); + assert(std::is_sorted(ic, ic+2*N)); + delete [] ic; + delete [] ib; + delete [] ia; + } +} + +int main() +{ + test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >(); + test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >(); + test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >(); + test<input_iterator<const int*>, input_iterator<const int*>, int*>(); + + test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*>, int*>(); + + test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>(); + + test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*>, int*>(); + + test<input_iterator<const int*>, const int*, output_iterator<int*> >(); + test<input_iterator<const int*>, const int*, forward_iterator<int*> >(); + test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, const int*, random_access_iterator<int*> >(); + test<input_iterator<const int*>, const int*, int*>(); + + test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >(); + test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >(); + test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, input_iterator<const int*>, int*>(); + + test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*>, int*>(); + + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>(); + + test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>(); + + test<forward_iterator<const int*>, const int*, output_iterator<int*> >(); + test<forward_iterator<const int*>, const int*, forward_iterator<int*> >(); + test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, const int*, int*>(); + + test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>(); + + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>(); + + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>(); + + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>(); + + test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >(); + test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, const int*, int*>(); + + test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >(); + test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, input_iterator<const int*>, int*>(); + + test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>(); + + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>(); + + test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>(); + + test<random_access_iterator<const int*>, const int*, output_iterator<int*> >(); + test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >(); + test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, const int*, int*>(); + + test<const int*, input_iterator<const int*>, output_iterator<int*> >(); + test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, input_iterator<const int*>, random_access_iterator<int*> >(); + test<const int*, input_iterator<const int*>, int*>(); + + test<const int*, forward_iterator<const int*>, output_iterator<int*> >(); + test<const int*, forward_iterator<const int*>, forward_iterator<int*> >(); + test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<const int*, forward_iterator<const int*>, int*>(); + + test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<const int*, bidirectional_iterator<const int*>, int*>(); + + test<const int*, random_access_iterator<const int*>, output_iterator<int*> >(); + test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<const int*, random_access_iterator<const int*>, int*>(); + + test<const int*, const int*, output_iterator<int*> >(); + test<const int*, const int*, forward_iterator<int*> >(); + test<const int*, const int*, bidirectional_iterator<int*> >(); + test<const int*, const int*, random_access_iterator<int*> >(); + test<const int*, const int*, int*>(); +} diff --git a/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp b/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp new file mode 100644 index 000000000000..bd38d7de6894 --- /dev/null +++ b/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp @@ -0,0 +1,234 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// REQUIRES: long_tests + +// <algorithm> + +// template<InputIterator InIter1, InputIterator InIter2, typename OutIter, +// Predicate<auto, InIter2::value_type, InIter1::value_type> Compare> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && CopyConstructible<Compare> +// OutIter +// merge(InIter1 first1, InIter1 last1, +// InIter2 first2, InIter2 last2, OutIter result, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" +#include "counting_predicates.hpp" + +template <class InIter1, class InIter2, class OutIter> +void +test() +{ + { + unsigned N = 100000; + int* ia = new int[N]; + int* ib = new int[N]; + int* ic = new int[2*N]; + for (unsigned i = 0; i < N; ++i) + ia[i] = 2*i; + for (unsigned i = 0; i < N; ++i) + ib[i] = 2*i+1; + std::reverse(ia, ia+N); + std::reverse(ib, ib+N); + binary_counting_predicate<std::greater<int>, int, int> pred((std::greater<int>())); + OutIter r = std::merge(InIter1(ia), InIter1(ia+N), + InIter2(ib), InIter2(ib+N), OutIter(ic), pred); + assert(base(r) == ic+2*N); + assert(ic[0] == 2*N-1); + assert(ic[2*N-1] == 0); + assert(std::is_sorted(ic, ic+2*N, std::greater<int>())); + assert(pred.count() <= (N + N - 1)); + delete [] ic; + delete [] ib; + delete [] ia; + } + { + unsigned N = 100; + int* ia = new int[N]; + int* ib = new int[N]; + int* ic = new int[2*N]; + for (unsigned i = 0; i < 2*N; ++i) + ic[i] = i; + std::random_shuffle(ic, ic+2*N); + std::copy(ic, ic+N, ia); + std::copy(ic+N, ic+2*N, ib); + std::sort(ia, ia+N, std::greater<int>()); + std::sort(ib, ib+N, std::greater<int>()); + binary_counting_predicate<std::greater<int>, int, int> pred((std::greater<int>())); + OutIter r = std::merge(InIter1(ia), InIter1(ia+N), + InIter2(ib), InIter2(ib+N), OutIter(ic), pred); + assert(base(r) == ic+2*N); + assert(ic[0] == 2*N-1); + assert(ic[2*N-1] == 0); + assert(std::is_sorted(ic, ic+2*N, std::greater<int>())); + assert(pred.count() <= (N + N - 1)); + delete [] ic; + delete [] ib; + delete [] ia; + } +} + +int main() +{ + test<input_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >(); + test<input_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >(); + test<input_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >(); + test<input_iterator<const int*>, input_iterator<const int*>, int*>(); + + test<input_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*>, int*>(); + + test<input_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*>, int*>(); + + test<input_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*>, int*>(); + + test<input_iterator<const int*>, const int*, output_iterator<int*> >(); + test<input_iterator<const int*>, const int*, forward_iterator<int*> >(); + test<input_iterator<const int*>, const int*, bidirectional_iterator<int*> >(); + test<input_iterator<const int*>, const int*, random_access_iterator<int*> >(); + test<input_iterator<const int*>, const int*, int*>(); + + test<forward_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >(); + test<forward_iterator<const int*>, input_iterator<const int*>, forward_iterator<int*> >(); + test<forward_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, input_iterator<const int*>, int*>(); + + test<forward_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*>, int*>(); + + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*>, int*>(); + + test<forward_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*>, int*>(); + + test<forward_iterator<const int*>, const int*, output_iterator<int*> >(); + test<forward_iterator<const int*>, const int*, forward_iterator<int*> >(); + test<forward_iterator<const int*>, const int*, bidirectional_iterator<int*> >(); + test<forward_iterator<const int*>, const int*, random_access_iterator<int*> >(); + test<forward_iterator<const int*>, const int*, int*>(); + + test<bidirectional_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, input_iterator<const int*>, int*>(); + + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*>, int*>(); + + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*>, int*>(); + + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*>, int*>(); + + test<bidirectional_iterator<const int*>, const int*, output_iterator<int*> >(); + test<bidirectional_iterator<const int*>, const int*, forward_iterator<int*> >(); + test<bidirectional_iterator<const int*>, const int*, bidirectional_iterator<int*> >(); + test<bidirectional_iterator<const int*>, const int*, random_access_iterator<int*> >(); + test<bidirectional_iterator<const int*>, const int*, int*>(); + + test<random_access_iterator<const int*>, input_iterator<const int*>, output_iterator<int*> >(); + test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, input_iterator<const int*>, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, input_iterator<const int*>, int*>(); + + test<random_access_iterator<const int*>, forward_iterator<const int*>, output_iterator<int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*>, forward_iterator<int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*>, int*>(); + + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*>, int*>(); + + test<random_access_iterator<const int*>, random_access_iterator<const int*>, output_iterator<int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*>, int*>(); + + test<random_access_iterator<const int*>, const int*, output_iterator<int*> >(); + test<random_access_iterator<const int*>, const int*, forward_iterator<int*> >(); + test<random_access_iterator<const int*>, const int*, bidirectional_iterator<int*> >(); + test<random_access_iterator<const int*>, const int*, random_access_iterator<int*> >(); + test<random_access_iterator<const int*>, const int*, int*>(); + + test<const int*, input_iterator<const int*>, output_iterator<int*> >(); + test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, input_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, input_iterator<const int*>, random_access_iterator<int*> >(); + test<const int*, input_iterator<const int*>, int*>(); + + test<const int*, forward_iterator<const int*>, output_iterator<int*> >(); + test<const int*, forward_iterator<const int*>, forward_iterator<int*> >(); + test<const int*, forward_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, forward_iterator<const int*>, random_access_iterator<int*> >(); + test<const int*, forward_iterator<const int*>, int*>(); + + test<const int*, bidirectional_iterator<const int*>, output_iterator<int*> >(); + test<const int*, bidirectional_iterator<const int*>, forward_iterator<int*> >(); + test<const int*, bidirectional_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, bidirectional_iterator<const int*>, random_access_iterator<int*> >(); + test<const int*, bidirectional_iterator<const int*>, int*>(); + + test<const int*, random_access_iterator<const int*>, output_iterator<int*> >(); + test<const int*, random_access_iterator<const int*>, forward_iterator<int*> >(); + test<const int*, random_access_iterator<const int*>, bidirectional_iterator<int*> >(); + test<const int*, random_access_iterator<const int*>, random_access_iterator<int*> >(); + test<const int*, random_access_iterator<const int*>, int*>(); + + test<const int*, const int*, output_iterator<int*> >(); + test<const int*, const int*, forward_iterator<int*> >(); + test<const int*, const int*, bidirectional_iterator<int*> >(); + test<const int*, const int*, random_access_iterator<int*> >(); + test<const int*, const int*, int*>(); +} |
