diff options
author | Eric Fiselier <eric@efcs.ca> | 2014-12-20 01:40:03 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2014-12-20 01:40:03 +0000 |
commit | 5a83710e371fe68a06e6e3876c6a2c8b820a8976 (patch) | |
tree | afde4c82ad6704681781c5cd49baa3fbd05c85db /libcxx/test/std/algorithms/alg.sorting | |
parent | f11e8eab527fba316c64112f6e05de1a79693a3e (diff) | |
download | bcm5719-llvm-5a83710e371fe68a06e6e3876c6a2c8b820a8976.tar.gz bcm5719-llvm-5a83710e371fe68a06e6e3876c6a2c8b820a8976.zip |
Move test into test/std subdirectory.
llvm-svn: 224658
Diffstat (limited to 'libcxx/test/std/algorithms/alg.sorting')
77 files changed, 8668 insertions, 0 deletions
diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/binary.search/binary_search.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/binary.search/binary_search.pass.cpp new file mode 100644 index 00000000000..253e0e38690 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/binary.search/binary_search.pass.cpp @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, class T> +// requires HasLess<T, Iter::value_type> +// && HasLess<Iter::value_type, T> +// bool +// binary_search(Iter first, Iter last, const T& value); + +#include <algorithm> +#include <vector> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter, class T> +void +test(Iter first, Iter last, const T& value, bool x) +{ + assert(std::binary_search(first, last, value) == x); +} + +template <class Iter> +void +test() +{ + const unsigned N = 1000; + const unsigned M = 10; + std::vector<int> v(N); + int x = 0; + for (int i = 0; i < v.size(); ++i) + { + v[i] = x; + if (++x == M) + x = 0; + } + std::sort(v.begin(), v.end()); + for (x = 0; x < M; ++x) + test(Iter(v.data()), Iter(v.data()+v.size()), x, true); + test(Iter(v.data()), Iter(v.data()+v.size()), -1, false); + test(Iter(v.data()), Iter(v.data()+v.size()), M, false); +} + +int main() +{ + int d[] = {0, 2, 4, 6}; + for (int* e = d; e <= d+4; ++e) + for (int x = -1; x <= 7; ++x) + test(d, e, x, (x % 2 == 0) && ((e-d)*2 > x)); + + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/binary.search/binary_search_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/binary.search/binary_search_comp.pass.cpp new file mode 100644 index 00000000000..1d2840921e8 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/binary.search/binary_search_comp.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, class T, CopyConstructible Compare> +// requires Predicate<Compare, T, Iter::value_type> +// && Predicate<Compare, Iter::value_type, T> +// bool +// binary_search(Iter first, Iter last, const T& value, Compare comp); + +#include <algorithm> +#include <vector> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter, class T> +void +test(Iter first, Iter last, const T& value, bool x) +{ + assert(std::binary_search(first, last, value, std::greater<int>()) == x); +} + +template <class Iter> +void +test() +{ + const unsigned N = 1000; + const unsigned M = 10; + std::vector<int> v(N); + int x = 0; + for (int i = 0; i < v.size(); ++i) + { + v[i] = x; + if (++x == M) + x = 0; + } + std::sort(v.begin(), v.end(), std::greater<int>()); + for (x = 0; x < M; ++x) + test(Iter(v.data()), Iter(v.data()+v.size()), x, true); + test(Iter(v.data()), Iter(v.data()+v.size()), -1, false); + test(Iter(v.data()), Iter(v.data()+v.size()), M, false); +} + +int main() +{ + int d[] = {6, 4, 2, 0}; + for (int* e = d; e <= d+4; ++e) + for (int x = -1; x <= 7; ++x) + test(d, e, x, (x % 2 == 0) && e != d && (-2*(e-d) + 8 <= x)); + + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/equal.range/equal_range.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/equal.range/equal_range.pass.cpp new file mode 100644 index 00000000000..ce659c1b50f --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/equal.range/equal_range.pass.cpp @@ -0,0 +1,69 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, class T> +// requires HasLess<T, Iter::value_type> +// && HasLess<Iter::value_type, T> +// pair<Iter, Iter> +// equal_range(Iter first, Iter last, const T& value); + +#include <algorithm> +#include <vector> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter, class T> +void +test(Iter first, Iter last, const T& value) +{ + std::pair<Iter, Iter> i = std::equal_range(first, last, value); + for (Iter j = first; j != i.first; ++j) + assert(*j < value); + for (Iter j = i.first; j != last; ++j) + assert(!(*j < value)); + for (Iter j = first; j != i.second; ++j) + assert(!(value < *j)); + for (Iter j = i.second; j != last; ++j) + assert(value < *j); +} + +template <class Iter> +void +test() +{ + const unsigned N = 1000; + const unsigned M = 10; + std::vector<int> v(N); + int x = 0; + for (int i = 0; i < v.size(); ++i) + { + v[i] = x; + if (++x == M) + x = 0; + } + std::sort(v.begin(), v.end()); + for (x = 0; x <= M; ++x) + test(Iter(v.data()), Iter(v.data()+v.size()), x); +} + +int main() +{ + int d[] = {0, 1, 2, 3}; + for (int* e = d; e <= d+4; ++e) + for (int x = -1; x <= 4; ++x) + test(d, e, x); + + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/equal.range/equal_range_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/equal.range/equal_range_comp.pass.cpp new file mode 100644 index 00000000000..2b29e2c8435 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/equal.range/equal_range_comp.pass.cpp @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, class T, CopyConstructible Compare> +// requires Predicate<Compare, T, Iter::value_type> +// && Predicate<Compare, Iter::value_type, T> +// pair<Iter, Iter> +// equal_range(Iter first, Iter last, const T& value, Compare comp); + +#include <algorithm> +#include <functional> +#include <vector> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter, class T> +void +test(Iter first, Iter last, const T& value) +{ + std::pair<Iter, Iter> i = std::equal_range(first, last, value, std::greater<int>()); + for (Iter j = first; j != i.first; ++j) + assert(std::greater<int>()(*j, value)); + for (Iter j = i.first; j != last; ++j) + assert(!std::greater<int>()(*j, value)); + for (Iter j = first; j != i.second; ++j) + assert(!std::greater<int>()(value, *j)); + for (Iter j = i.second; j != last; ++j) + assert(std::greater<int>()(value, *j)); +} + +template <class Iter> +void +test() +{ + const unsigned N = 1000; + const unsigned M = 10; + std::vector<int> v(N); + int x = 0; + for (int i = 0; i < v.size(); ++i) + { + v[i] = x; + if (++x == M) + x = 0; + } + std::sort(v.begin(), v.end(), std::greater<int>()); + for (x = 0; x <= M; ++x) + test(Iter(v.data()), Iter(v.data()+v.size()), x); +} + +int main() +{ + int d[] = {3, 2, 1, 0}; + for (int* e = d; e <= d+4; ++e) + for (int x = -1; x <= 4; ++x) + test(d, e, x); + + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/lower.bound/lower_bound.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/lower.bound/lower_bound.pass.cpp new file mode 100644 index 00000000000..ce4f7ced5e6 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/lower.bound/lower_bound.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, class T> +// requires HasLess<Iter::value_type, T> +// Iter +// lower_bound(Iter first, Iter last, const T& value); + +#include <algorithm> +#include <vector> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter, class T> +void +test(Iter first, Iter last, const T& value) +{ + Iter i = std::lower_bound(first, last, value); + for (Iter j = first; j != i; ++j) + assert(*j < value); + for (Iter j = i; j != last; ++j) + assert(!(*j < value)); +} + +template <class Iter> +void +test() +{ + const unsigned N = 1000; + const unsigned M = 10; + std::vector<int> v(N); + int x = 0; + for (int i = 0; i < v.size(); ++i) + { + v[i] = x; + if (++x == M) + x = 0; + } + std::sort(v.begin(), v.end()); + for (x = 0; x <= M; ++x) + test(Iter(v.data()), Iter(v.data()+v.size()), x); +} + +int main() +{ + int d[] = {0, 1, 2, 3}; + for (int* e = d; e <= d+4; ++e) + for (int x = -1; x <= 4; ++x) + test(d, e, x); + + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/lower.bound/lower_bound_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/lower.bound/lower_bound_comp.pass.cpp new file mode 100644 index 00000000000..ae65c59e315 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/lower.bound/lower_bound_comp.pass.cpp @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, class T> +// requires HasLess<Iter::value_type, T> +// Iter +// lower_bound(Iter first, Iter last, const T& value); + +#include <algorithm> +#include <functional> +#include <vector> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter, class T> +void +test(Iter first, Iter last, const T& value) +{ + Iter i = std::lower_bound(first, last, value, std::greater<int>()); + for (Iter j = first; j != i; ++j) + assert(std::greater<int>()(*j, value)); + for (Iter j = i; j != last; ++j) + assert(!std::greater<int>()(*j, value)); +} + +template <class Iter> +void +test() +{ + const unsigned N = 1000; + const unsigned M = 10; + std::vector<int> v(N); + int x = 0; + for (int i = 0; i < v.size(); ++i) + { + v[i] = x; + if (++x == M) + x = 0; + } + std::sort(v.begin(), v.end(), std::greater<int>()); + for (x = 0; x <= M; ++x) + test(Iter(v.data()), Iter(v.data()+v.size()), x); +} + +int main() +{ + int d[] = {3, 2, 1, 0}; + for (int* e = d; e <= d+4; ++e) + for (int x = -1; x <= 4; ++x) + test(d, e, x); + + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/nothing_to_do.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..b58f5c55b64 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/upper.bound/upper_bound.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/upper.bound/upper_bound.pass.cpp new file mode 100644 index 00000000000..3659e08fb28 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/upper.bound/upper_bound.pass.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, class T> +// requires HasLess<T, Iter::value_type> +// Iter +// upper_bound(Iter first, Iter last, const T& value); + +#include <algorithm> +#include <vector> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter, class T> +void +test(Iter first, Iter last, const T& value) +{ + Iter i = std::upper_bound(first, last, value); + for (Iter j = first; j != i; ++j) + assert(!(value < *j)); + for (Iter j = i; j != last; ++j) + assert(value < *j); +} + +template <class Iter> +void +test() +{ + const unsigned N = 1000; + const unsigned M = 10; + std::vector<int> v(N); + int x = 0; + for (int i = 0; i < v.size(); ++i) + { + v[i] = x; + if (++x == M) + x = 0; + } + std::sort(v.begin(), v.end()); + for (x = 0; x <= M; ++x) + test(Iter(v.data()), Iter(v.data()+v.size()), x); +} + +int main() +{ + int d[] = {0, 1, 2, 3}; + for (int* e = d; e <= d+4; ++e) + for (int x = -1; x <= 4; ++x) + test(d, e, x); + + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/upper.bound/upper_bound_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/upper.bound/upper_bound_comp.pass.cpp new file mode 100644 index 00000000000..dd5fcfc2852 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.binary.search/upper.bound/upper_bound_comp.pass.cpp @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, class T, Predicate<auto, T, Iter::value_type> Compare> +// requires CopyConstructible<Compare> +// Iter +// upper_bound(Iter first, Iter last, const T& value, Compare comp); + +#include <algorithm> +#include <functional> +#include <vector> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter, class T> +void +test(Iter first, Iter last, const T& value) +{ + Iter i = std::upper_bound(first, last, value, std::greater<int>()); + for (Iter j = first; j != i; ++j) + assert(!std::greater<int>()(value, *j)); + for (Iter j = i; j != last; ++j) + assert(std::greater<int>()(value, *j)); +} + +template <class Iter> +void +test() +{ + const unsigned N = 1000; + const unsigned M = 10; + std::vector<int> v(N); + int x = 0; + for (int i = 0; i < v.size(); ++i) + { + v[i] = x; + if (++x == M) + x = 0; + } + std::sort(v.begin(), v.end(), std::greater<int>()); + for (x = 0; x <= M; ++x) + test(Iter(v.data()), Iter(v.data()+v.size()), x); +} + +int main() +{ + int d[] = {3, 2, 1, 0}; + for (int* e = d; e <= d+4; ++e) + for (int x = -1; x <= 4; ++x) + test(d, e, x); + + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap.pass.cpp new file mode 100644 index 00000000000..f16b2c3c61a --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap.pass.cpp @@ -0,0 +1,521 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires LessThanComparable<Iter::value_type> +// bool +// is_heap(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +void test() +{ + int i1[] = {0, 0}; + assert(std::is_heap(i1, i1)); + assert(std::is_heap(i1, i1+1) == (std::is_heap_until(i1, i1+1) == i1+1)); + int i2[] = {0, 1}; + int i3[] = {1, 0}; + assert(std::is_heap(i1, i1+2) == (std::is_heap_until(i1, i1+2) == i1+2)); + assert(std::is_heap(i2, i2+2) == (std::is_heap_until(i2, i2+2) == i2+2)); + assert(std::is_heap(i3, i3+2) == (std::is_heap_until(i3, i3+2) == i3+2)); + int i4[] = {0, 0, 0}; + int i5[] = {0, 0, 1}; + int i6[] = {0, 1, 0}; + int i7[] = {0, 1, 1}; + int i8[] = {1, 0, 0}; + int i9[] = {1, 0, 1}; + int i10[] = {1, 1, 0}; + assert(std::is_heap(i4, i4+3) == (std::is_heap_until(i4, i4+3) == i4+3)); + assert(std::is_heap(i5, i5+3) == (std::is_heap_until(i5, i5+3) == i5+3)); + assert(std::is_heap(i6, i6+3) == (std::is_heap_until(i6, i6+3) == i6+3)); + assert(std::is_heap(i7, i7+3) == (std::is_heap_until(i7, i7+3) == i7+3)); + assert(std::is_heap(i8, i8+3) == (std::is_heap_until(i8, i8+3) == i8+3)); + assert(std::is_heap(i9, i9+3) == (std::is_heap_until(i9, i9+3) == i9+3)); + assert(std::is_heap(i10, i10+3) == (std::is_heap_until(i10, i10+3) == i10+3)); + int i11[] = {0, 0, 0, 0}; + int i12[] = {0, 0, 0, 1}; + int i13[] = {0, 0, 1, 0}; + int i14[] = {0, 0, 1, 1}; + int i15[] = {0, 1, 0, 0}; + int i16[] = {0, 1, 0, 1}; + int i17[] = {0, 1, 1, 0}; + int i18[] = {0, 1, 1, 1}; + int i19[] = {1, 0, 0, 0}; + int i20[] = {1, 0, 0, 1}; + int i21[] = {1, 0, 1, 0}; + int i22[] = {1, 0, 1, 1}; + int i23[] = {1, 1, 0, 0}; + int i24[] = {1, 1, 0, 1}; + int i25[] = {1, 1, 1, 0}; + assert(std::is_heap(i11, i11+4) == (std::is_heap_until(i11, i11+4) == i11+4)); + assert(std::is_heap(i12, i12+4) == (std::is_heap_until(i12, i12+4) == i12+4)); + assert(std::is_heap(i13, i13+4) == (std::is_heap_until(i13, i13+4) == i13+4)); + assert(std::is_heap(i14, i14+4) == (std::is_heap_until(i14, i14+4) == i14+4)); + assert(std::is_heap(i15, i15+4) == (std::is_heap_until(i15, i15+4) == i15+4)); + assert(std::is_heap(i16, i16+4) == (std::is_heap_until(i16, i16+4) == i16+4)); + assert(std::is_heap(i17, i17+4) == (std::is_heap_until(i17, i17+4) == i17+4)); + assert(std::is_heap(i18, i18+4) == (std::is_heap_until(i18, i18+4) == i18+4)); + assert(std::is_heap(i19, i19+4) == (std::is_heap_until(i19, i19+4) == i19+4)); + assert(std::is_heap(i20, i20+4) == (std::is_heap_until(i20, i20+4) == i20+4)); + assert(std::is_heap(i21, i21+4) == (std::is_heap_until(i21, i21+4) == i21+4)); + assert(std::is_heap(i22, i22+4) == (std::is_heap_until(i22, i22+4) == i22+4)); + assert(std::is_heap(i23, i23+4) == (std::is_heap_until(i23, i23+4) == i23+4)); + assert(std::is_heap(i24, i24+4) == (std::is_heap_until(i24, i24+4) == i24+4)); + assert(std::is_heap(i25, i25+4) == (std::is_heap_until(i25, i25+4) == i25+4)); + int i26[] = {0, 0, 0, 0, 0}; + int i27[] = {0, 0, 0, 0, 1}; + int i28[] = {0, 0, 0, 1, 0}; + int i29[] = {0, 0, 0, 1, 1}; + int i30[] = {0, 0, 1, 0, 0}; + int i31[] = {0, 0, 1, 0, 1}; + int i32[] = {0, 0, 1, 1, 0}; + int i33[] = {0, 0, 1, 1, 1}; + int i34[] = {0, 1, 0, 0, 0}; + int i35[] = {0, 1, 0, 0, 1}; + int i36[] = {0, 1, 0, 1, 0}; + int i37[] = {0, 1, 0, 1, 1}; + int i38[] = {0, 1, 1, 0, 0}; + int i39[] = {0, 1, 1, 0, 1}; + int i40[] = {0, 1, 1, 1, 0}; + int i41[] = {0, 1, 1, 1, 1}; + int i42[] = {1, 0, 0, 0, 0}; + int i43[] = {1, 0, 0, 0, 1}; + int i44[] = {1, 0, 0, 1, 0}; + int i45[] = {1, 0, 0, 1, 1}; + int i46[] = {1, 0, 1, 0, 0}; + int i47[] = {1, 0, 1, 0, 1}; + int i48[] = {1, 0, 1, 1, 0}; + int i49[] = {1, 0, 1, 1, 1}; + int i50[] = {1, 1, 0, 0, 0}; + int i51[] = {1, 1, 0, 0, 1}; + int i52[] = {1, 1, 0, 1, 0}; + int i53[] = {1, 1, 0, 1, 1}; + int i54[] = {1, 1, 1, 0, 0}; + int i55[] = {1, 1, 1, 0, 1}; + int i56[] = {1, 1, 1, 1, 0}; + assert(std::is_heap(i26, i26+5) == (std::is_heap_until(i26, i26+5) == i26+5)); + assert(std::is_heap(i27, i27+5) == (std::is_heap_until(i27, i27+5) == i27+5)); + assert(std::is_heap(i28, i28+5) == (std::is_heap_until(i28, i28+5) == i28+5)); + assert(std::is_heap(i29, i29+5) == (std::is_heap_until(i29, i29+5) == i29+5)); + assert(std::is_heap(i30, i30+5) == (std::is_heap_until(i30, i30+5) == i30+5)); + assert(std::is_heap(i31, i31+5) == (std::is_heap_until(i31, i31+5) == i31+5)); + assert(std::is_heap(i32, i32+5) == (std::is_heap_until(i32, i32+5) == i32+5)); + assert(std::is_heap(i33, i33+5) == (std::is_heap_until(i33, i33+5) == i33+5)); + assert(std::is_heap(i34, i34+5) == (std::is_heap_until(i34, i34+5) == i34+5)); + assert(std::is_heap(i35, i35+5) == (std::is_heap_until(i35, i35+5) == i35+5)); + assert(std::is_heap(i36, i36+5) == (std::is_heap_until(i36, i36+5) == i36+5)); + assert(std::is_heap(i37, i37+5) == (std::is_heap_until(i37, i37+5) == i37+5)); + assert(std::is_heap(i38, i38+5) == (std::is_heap_until(i38, i38+5) == i38+5)); + assert(std::is_heap(i39, i39+5) == (std::is_heap_until(i39, i39+5) == i39+5)); + assert(std::is_heap(i40, i40+5) == (std::is_heap_until(i40, i40+5) == i40+5)); + assert(std::is_heap(i41, i41+5) == (std::is_heap_until(i41, i41+5) == i41+5)); + assert(std::is_heap(i42, i42+5) == (std::is_heap_until(i42, i42+5) == i42+5)); + assert(std::is_heap(i43, i43+5) == (std::is_heap_until(i43, i43+5) == i43+5)); + assert(std::is_heap(i44, i44+5) == (std::is_heap_until(i44, i44+5) == i44+5)); + assert(std::is_heap(i45, i45+5) == (std::is_heap_until(i45, i45+5) == i45+5)); + assert(std::is_heap(i46, i46+5) == (std::is_heap_until(i46, i46+5) == i46+5)); + assert(std::is_heap(i47, i47+5) == (std::is_heap_until(i47, i47+5) == i47+5)); + assert(std::is_heap(i48, i48+5) == (std::is_heap_until(i48, i48+5) == i48+5)); + assert(std::is_heap(i49, i49+5) == (std::is_heap_until(i49, i49+5) == i49+5)); + assert(std::is_heap(i50, i50+5) == (std::is_heap_until(i50, i50+5) == i50+5)); + assert(std::is_heap(i51, i51+5) == (std::is_heap_until(i51, i51+5) == i51+5)); + assert(std::is_heap(i52, i52+5) == (std::is_heap_until(i52, i52+5) == i52+5)); + assert(std::is_heap(i53, i53+5) == (std::is_heap_until(i53, i53+5) == i53+5)); + assert(std::is_heap(i54, i54+5) == (std::is_heap_until(i54, i54+5) == i54+5)); + assert(std::is_heap(i55, i55+5) == (std::is_heap_until(i55, i55+5) == i55+5)); + assert(std::is_heap(i56, i56+5) == (std::is_heap_until(i56, i56+5) == i56+5)); + int i57[] = {0, 0, 0, 0, 0, 0}; + int i58[] = {0, 0, 0, 0, 0, 1}; + int i59[] = {0, 0, 0, 0, 1, 0}; + int i60[] = {0, 0, 0, 0, 1, 1}; + int i61[] = {0, 0, 0, 1, 0, 0}; + int i62[] = {0, 0, 0, 1, 0, 1}; + int i63[] = {0, 0, 0, 1, 1, 0}; + int i64[] = {0, 0, 0, 1, 1, 1}; + int i65[] = {0, 0, 1, 0, 0, 0}; + int i66[] = {0, 0, 1, 0, 0, 1}; + int i67[] = {0, 0, 1, 0, 1, 0}; + int i68[] = {0, 0, 1, 0, 1, 1}; + int i69[] = {0, 0, 1, 1, 0, 0}; + int i70[] = {0, 0, 1, 1, 0, 1}; + int i71[] = {0, 0, 1, 1, 1, 0}; + int i72[] = {0, 0, 1, 1, 1, 1}; + int i73[] = {0, 1, 0, 0, 0, 0}; + int i74[] = {0, 1, 0, 0, 0, 1}; + int i75[] = {0, 1, 0, 0, 1, 0}; + int i76[] = {0, 1, 0, 0, 1, 1}; + int i77[] = {0, 1, 0, 1, 0, 0}; + int i78[] = {0, 1, 0, 1, 0, 1}; + int i79[] = {0, 1, 0, 1, 1, 0}; + int i80[] = {0, 1, 0, 1, 1, 1}; + int i81[] = {0, 1, 1, 0, 0, 0}; + int i82[] = {0, 1, 1, 0, 0, 1}; + int i83[] = {0, 1, 1, 0, 1, 0}; + int i84[] = {0, 1, 1, 0, 1, 1}; + int i85[] = {0, 1, 1, 1, 0, 0}; + int i86[] = {0, 1, 1, 1, 0, 1}; + int i87[] = {0, 1, 1, 1, 1, 0}; + int i88[] = {0, 1, 1, 1, 1, 1}; + int i89[] = {1, 0, 0, 0, 0, 0}; + int i90[] = {1, 0, 0, 0, 0, 1}; + int i91[] = {1, 0, 0, 0, 1, 0}; + int i92[] = {1, 0, 0, 0, 1, 1}; + int i93[] = {1, 0, 0, 1, 0, 0}; + int i94[] = {1, 0, 0, 1, 0, 1}; + int i95[] = {1, 0, 0, 1, 1, 0}; + int i96[] = {1, 0, 0, 1, 1, 1}; + int i97[] = {1, 0, 1, 0, 0, 0}; + int i98[] = {1, 0, 1, 0, 0, 1}; + int i99[] = {1, 0, 1, 0, 1, 0}; + int i100[] = {1, 0, 1, 0, 1, 1}; + int i101[] = {1, 0, 1, 1, 0, 0}; + int i102[] = {1, 0, 1, 1, 0, 1}; + int i103[] = {1, 0, 1, 1, 1, 0}; + int i104[] = {1, 0, 1, 1, 1, 1}; + int i105[] = {1, 1, 0, 0, 0, 0}; + int i106[] = {1, 1, 0, 0, 0, 1}; + int i107[] = {1, 1, 0, 0, 1, 0}; + int i108[] = {1, 1, 0, 0, 1, 1}; + int i109[] = {1, 1, 0, 1, 0, 0}; + int i110[] = {1, 1, 0, 1, 0, 1}; + int i111[] = {1, 1, 0, 1, 1, 0}; + int i112[] = {1, 1, 0, 1, 1, 1}; + int i113[] = {1, 1, 1, 0, 0, 0}; + int i114[] = {1, 1, 1, 0, 0, 1}; + int i115[] = {1, 1, 1, 0, 1, 0}; + int i116[] = {1, 1, 1, 0, 1, 1}; + int i117[] = {1, 1, 1, 1, 0, 0}; + int i118[] = {1, 1, 1, 1, 0, 1}; + int i119[] = {1, 1, 1, 1, 1, 0}; + assert(std::is_heap(i57, i57+6) == (std::is_heap_until(i57, i57+6) == i57+6)); + assert(std::is_heap(i58, i58+6) == (std::is_heap_until(i58, i58+6) == i58+6)); + assert(std::is_heap(i59, i59+6) == (std::is_heap_until(i59, i59+6) == i59+6)); + assert(std::is_heap(i60, i60+6) == (std::is_heap_until(i60, i60+6) == i60+6)); + assert(std::is_heap(i61, i61+6) == (std::is_heap_until(i61, i61+6) == i61+6)); + assert(std::is_heap(i62, i62+6) == (std::is_heap_until(i62, i62+6) == i62+6)); + assert(std::is_heap(i63, i63+6) == (std::is_heap_until(i63, i63+6) == i63+6)); + assert(std::is_heap(i64, i64+6) == (std::is_heap_until(i64, i64+6) == i64+6)); + assert(std::is_heap(i65, i65+6) == (std::is_heap_until(i65, i65+6) == i65+6)); + assert(std::is_heap(i66, i66+6) == (std::is_heap_until(i66, i66+6) == i66+6)); + assert(std::is_heap(i67, i67+6) == (std::is_heap_until(i67, i67+6) == i67+6)); + assert(std::is_heap(i68, i68+6) == (std::is_heap_until(i68, i68+6) == i68+6)); + assert(std::is_heap(i69, i69+6) == (std::is_heap_until(i69, i69+6) == i69+6)); + assert(std::is_heap(i70, i70+6) == (std::is_heap_until(i70, i70+6) == i70+6)); + assert(std::is_heap(i71, i71+6) == (std::is_heap_until(i71, i71+6) == i71+6)); + assert(std::is_heap(i72, i72+6) == (std::is_heap_until(i72, i72+6) == i72+6)); + assert(std::is_heap(i73, i73+6) == (std::is_heap_until(i73, i73+6) == i73+6)); + assert(std::is_heap(i74, i74+6) == (std::is_heap_until(i74, i74+6) == i74+6)); + assert(std::is_heap(i75, i75+6) == (std::is_heap_until(i75, i75+6) == i75+6)); + assert(std::is_heap(i76, i76+6) == (std::is_heap_until(i76, i76+6) == i76+6)); + assert(std::is_heap(i77, i77+6) == (std::is_heap_until(i77, i77+6) == i77+6)); + assert(std::is_heap(i78, i78+6) == (std::is_heap_until(i78, i78+6) == i78+6)); + assert(std::is_heap(i79, i79+6) == (std::is_heap_until(i79, i79+6) == i79+6)); + assert(std::is_heap(i80, i80+6) == (std::is_heap_until(i80, i80+6) == i80+6)); + assert(std::is_heap(i81, i81+6) == (std::is_heap_until(i81, i81+6) == i81+6)); + assert(std::is_heap(i82, i82+6) == (std::is_heap_until(i82, i82+6) == i82+6)); + assert(std::is_heap(i83, i83+6) == (std::is_heap_until(i83, i83+6) == i83+6)); + assert(std::is_heap(i84, i84+6) == (std::is_heap_until(i84, i84+6) == i84+6)); + assert(std::is_heap(i85, i85+6) == (std::is_heap_until(i85, i85+6) == i85+6)); + assert(std::is_heap(i86, i86+6) == (std::is_heap_until(i86, i86+6) == i86+6)); + assert(std::is_heap(i87, i87+6) == (std::is_heap_until(i87, i87+6) == i87+6)); + assert(std::is_heap(i88, i88+6) == (std::is_heap_until(i88, i88+6) == i88+6)); + assert(std::is_heap(i89, i89+6) == (std::is_heap_until(i89, i89+6) == i89+6)); + assert(std::is_heap(i90, i90+6) == (std::is_heap_until(i90, i90+6) == i90+6)); + assert(std::is_heap(i91, i91+6) == (std::is_heap_until(i91, i91+6) == i91+6)); + assert(std::is_heap(i92, i92+6) == (std::is_heap_until(i92, i92+6) == i92+6)); + assert(std::is_heap(i93, i93+6) == (std::is_heap_until(i93, i93+6) == i93+6)); + assert(std::is_heap(i94, i94+6) == (std::is_heap_until(i94, i94+6) == i94+6)); + assert(std::is_heap(i95, i95+6) == (std::is_heap_until(i95, i95+6) == i95+6)); + assert(std::is_heap(i96, i96+6) == (std::is_heap_until(i96, i96+6) == i96+6)); + assert(std::is_heap(i97, i97+6) == (std::is_heap_until(i97, i97+6) == i97+6)); + assert(std::is_heap(i98, i98+6) == (std::is_heap_until(i98, i98+6) == i98+6)); + assert(std::is_heap(i99, i99+6) == (std::is_heap_until(i99, i99+6) == i99+6)); + assert(std::is_heap(i100, i100+6) == (std::is_heap_until(i100, i100+6) == i100+6)); + assert(std::is_heap(i101, i101+6) == (std::is_heap_until(i101, i101+6) == i101+6)); + assert(std::is_heap(i102, i102+6) == (std::is_heap_until(i102, i102+6) == i102+6)); + assert(std::is_heap(i103, i103+6) == (std::is_heap_until(i103, i103+6) == i103+6)); + assert(std::is_heap(i104, i104+6) == (std::is_heap_until(i104, i104+6) == i104+6)); + assert(std::is_heap(i105, i105+6) == (std::is_heap_until(i105, i105+6) == i105+6)); + assert(std::is_heap(i106, i106+6) == (std::is_heap_until(i106, i106+6) == i106+6)); + assert(std::is_heap(i107, i107+6) == (std::is_heap_until(i107, i107+6) == i107+6)); + assert(std::is_heap(i108, i108+6) == (std::is_heap_until(i108, i108+6) == i108+6)); + assert(std::is_heap(i109, i109+6) == (std::is_heap_until(i109, i109+6) == i109+6)); + assert(std::is_heap(i110, i110+6) == (std::is_heap_until(i110, i110+6) == i110+6)); + assert(std::is_heap(i111, i111+6) == (std::is_heap_until(i111, i111+6) == i111+6)); + assert(std::is_heap(i112, i112+6) == (std::is_heap_until(i112, i112+6) == i112+6)); + assert(std::is_heap(i113, i113+6) == (std::is_heap_until(i113, i113+6) == i113+6)); + assert(std::is_heap(i114, i114+6) == (std::is_heap_until(i114, i114+6) == i114+6)); + assert(std::is_heap(i115, i115+6) == (std::is_heap_until(i115, i115+6) == i115+6)); + assert(std::is_heap(i116, i116+6) == (std::is_heap_until(i116, i116+6) == i116+6)); + assert(std::is_heap(i117, i117+6) == (std::is_heap_until(i117, i117+6) == i117+6)); + assert(std::is_heap(i118, i118+6) == (std::is_heap_until(i118, i118+6) == i118+6)); + assert(std::is_heap(i119, i119+6) == (std::is_heap_until(i119, i119+6) == i119+6)); + int i120[] = {0, 0, 0, 0, 0, 0, 0}; + int i121[] = {0, 0, 0, 0, 0, 0, 1}; + int i122[] = {0, 0, 0, 0, 0, 1, 0}; + int i123[] = {0, 0, 0, 0, 0, 1, 1}; + int i124[] = {0, 0, 0, 0, 1, 0, 0}; + int i125[] = {0, 0, 0, 0, 1, 0, 1}; + int i126[] = {0, 0, 0, 0, 1, 1, 0}; + int i127[] = {0, 0, 0, 0, 1, 1, 1}; + int i128[] = {0, 0, 0, 1, 0, 0, 0}; + int i129[] = {0, 0, 0, 1, 0, 0, 1}; + int i130[] = {0, 0, 0, 1, 0, 1, 0}; + int i131[] = {0, 0, 0, 1, 0, 1, 1}; + int i132[] = {0, 0, 0, 1, 1, 0, 0}; + int i133[] = {0, 0, 0, 1, 1, 0, 1}; + int i134[] = {0, 0, 0, 1, 1, 1, 0}; + int i135[] = {0, 0, 0, 1, 1, 1, 1}; + int i136[] = {0, 0, 1, 0, 0, 0, 0}; + int i137[] = {0, 0, 1, 0, 0, 0, 1}; + int i138[] = {0, 0, 1, 0, 0, 1, 0}; + int i139[] = {0, 0, 1, 0, 0, 1, 1}; + int i140[] = {0, 0, 1, 0, 1, 0, 0}; + int i141[] = {0, 0, 1, 0, 1, 0, 1}; + int i142[] = {0, 0, 1, 0, 1, 1, 0}; + int i143[] = {0, 0, 1, 0, 1, 1, 1}; + int i144[] = {0, 0, 1, 1, 0, 0, 0}; + int i145[] = {0, 0, 1, 1, 0, 0, 1}; + int i146[] = {0, 0, 1, 1, 0, 1, 0}; + int i147[] = {0, 0, 1, 1, 0, 1, 1}; + int i148[] = {0, 0, 1, 1, 1, 0, 0}; + int i149[] = {0, 0, 1, 1, 1, 0, 1}; + int i150[] = {0, 0, 1, 1, 1, 1, 0}; + int i151[] = {0, 0, 1, 1, 1, 1, 1}; + int i152[] = {0, 1, 0, 0, 0, 0, 0}; + int i153[] = {0, 1, 0, 0, 0, 0, 1}; + int i154[] = {0, 1, 0, 0, 0, 1, 0}; + int i155[] = {0, 1, 0, 0, 0, 1, 1}; + int i156[] = {0, 1, 0, 0, 1, 0, 0}; + int i157[] = {0, 1, 0, 0, 1, 0, 1}; + int i158[] = {0, 1, 0, 0, 1, 1, 0}; + int i159[] = {0, 1, 0, 0, 1, 1, 1}; + int i160[] = {0, 1, 0, 1, 0, 0, 0}; + int i161[] = {0, 1, 0, 1, 0, 0, 1}; + int i162[] = {0, 1, 0, 1, 0, 1, 0}; + int i163[] = {0, 1, 0, 1, 0, 1, 1}; + int i164[] = {0, 1, 0, 1, 1, 0, 0}; + int i165[] = {0, 1, 0, 1, 1, 0, 1}; + int i166[] = {0, 1, 0, 1, 1, 1, 0}; + int i167[] = {0, 1, 0, 1, 1, 1, 1}; + int i168[] = {0, 1, 1, 0, 0, 0, 0}; + int i169[] = {0, 1, 1, 0, 0, 0, 1}; + int i170[] = {0, 1, 1, 0, 0, 1, 0}; + int i171[] = {0, 1, 1, 0, 0, 1, 1}; + int i172[] = {0, 1, 1, 0, 1, 0, 0}; + int i173[] = {0, 1, 1, 0, 1, 0, 1}; + int i174[] = {0, 1, 1, 0, 1, 1, 0}; + int i175[] = {0, 1, 1, 0, 1, 1, 1}; + int i176[] = {0, 1, 1, 1, 0, 0, 0}; + int i177[] = {0, 1, 1, 1, 0, 0, 1}; + int i178[] = {0, 1, 1, 1, 0, 1, 0}; + int i179[] = {0, 1, 1, 1, 0, 1, 1}; + int i180[] = {0, 1, 1, 1, 1, 0, 0}; + int i181[] = {0, 1, 1, 1, 1, 0, 1}; + int i182[] = {0, 1, 1, 1, 1, 1, 0}; + int i183[] = {0, 1, 1, 1, 1, 1, 1}; + int i184[] = {1, 0, 0, 0, 0, 0, 0}; + int i185[] = {1, 0, 0, 0, 0, 0, 1}; + int i186[] = {1, 0, 0, 0, 0, 1, 0}; + int i187[] = {1, 0, 0, 0, 0, 1, 1}; + int i188[] = {1, 0, 0, 0, 1, 0, 0}; + int i189[] = {1, 0, 0, 0, 1, 0, 1}; + int i190[] = {1, 0, 0, 0, 1, 1, 0}; + int i191[] = {1, 0, 0, 0, 1, 1, 1}; + int i192[] = {1, 0, 0, 1, 0, 0, 0}; + int i193[] = {1, 0, 0, 1, 0, 0, 1}; + int i194[] = {1, 0, 0, 1, 0, 1, 0}; + int i195[] = {1, 0, 0, 1, 0, 1, 1}; + int i196[] = {1, 0, 0, 1, 1, 0, 0}; + int i197[] = {1, 0, 0, 1, 1, 0, 1}; + int i198[] = {1, 0, 0, 1, 1, 1, 0}; + int i199[] = {1, 0, 0, 1, 1, 1, 1}; + int i200[] = {1, 0, 1, 0, 0, 0, 0}; + int i201[] = {1, 0, 1, 0, 0, 0, 1}; + int i202[] = {1, 0, 1, 0, 0, 1, 0}; + int i203[] = {1, 0, 1, 0, 0, 1, 1}; + int i204[] = {1, 0, 1, 0, 1, 0, 0}; + int i205[] = {1, 0, 1, 0, 1, 0, 1}; + int i206[] = {1, 0, 1, 0, 1, 1, 0}; + int i207[] = {1, 0, 1, 0, 1, 1, 1}; + int i208[] = {1, 0, 1, 1, 0, 0, 0}; + int i209[] = {1, 0, 1, 1, 0, 0, 1}; + int i210[] = {1, 0, 1, 1, 0, 1, 0}; + int i211[] = {1, 0, 1, 1, 0, 1, 1}; + int i212[] = {1, 0, 1, 1, 1, 0, 0}; + int i213[] = {1, 0, 1, 1, 1, 0, 1}; + int i214[] = {1, 0, 1, 1, 1, 1, 0}; + int i215[] = {1, 0, 1, 1, 1, 1, 1}; + int i216[] = {1, 1, 0, 0, 0, 0, 0}; + int i217[] = {1, 1, 0, 0, 0, 0, 1}; + int i218[] = {1, 1, 0, 0, 0, 1, 0}; + int i219[] = {1, 1, 0, 0, 0, 1, 1}; + int i220[] = {1, 1, 0, 0, 1, 0, 0}; + int i221[] = {1, 1, 0, 0, 1, 0, 1}; + int i222[] = {1, 1, 0, 0, 1, 1, 0}; + int i223[] = {1, 1, 0, 0, 1, 1, 1}; + int i224[] = {1, 1, 0, 1, 0, 0, 0}; + int i225[] = {1, 1, 0, 1, 0, 0, 1}; + int i226[] = {1, 1, 0, 1, 0, 1, 0}; + int i227[] = {1, 1, 0, 1, 0, 1, 1}; + int i228[] = {1, 1, 0, 1, 1, 0, 0}; + int i229[] = {1, 1, 0, 1, 1, 0, 1}; + int i230[] = {1, 1, 0, 1, 1, 1, 0}; + int i231[] = {1, 1, 0, 1, 1, 1, 1}; + int i232[] = {1, 1, 1, 0, 0, 0, 0}; + int i233[] = {1, 1, 1, 0, 0, 0, 1}; + int i234[] = {1, 1, 1, 0, 0, 1, 0}; + int i235[] = {1, 1, 1, 0, 0, 1, 1}; + int i236[] = {1, 1, 1, 0, 1, 0, 0}; + int i237[] = {1, 1, 1, 0, 1, 0, 1}; + int i238[] = {1, 1, 1, 0, 1, 1, 0}; + int i239[] = {1, 1, 1, 0, 1, 1, 1}; + int i240[] = {1, 1, 1, 1, 0, 0, 0}; + int i241[] = {1, 1, 1, 1, 0, 0, 1}; + int i242[] = {1, 1, 1, 1, 0, 1, 0}; + int i243[] = {1, 1, 1, 1, 0, 1, 1}; + int i244[] = {1, 1, 1, 1, 1, 0, 0}; + int i245[] = {1, 1, 1, 1, 1, 0, 1}; + int i246[] = {1, 1, 1, 1, 1, 1, 0}; + assert(std::is_heap(i120, i120+7) == (std::is_heap_until(i120, i120+7) == i120+7)); + assert(std::is_heap(i121, i121+7) == (std::is_heap_until(i121, i121+7) == i121+7)); + assert(std::is_heap(i122, i122+7) == (std::is_heap_until(i122, i122+7) == i122+7)); + assert(std::is_heap(i123, i123+7) == (std::is_heap_until(i123, i123+7) == i123+7)); + assert(std::is_heap(i124, i124+7) == (std::is_heap_until(i124, i124+7) == i124+7)); + assert(std::is_heap(i125, i125+7) == (std::is_heap_until(i125, i125+7) == i125+7)); + assert(std::is_heap(i126, i126+7) == (std::is_heap_until(i126, i126+7) == i126+7)); + assert(std::is_heap(i127, i127+7) == (std::is_heap_until(i127, i127+7) == i127+7)); + assert(std::is_heap(i128, i128+7) == (std::is_heap_until(i128, i128+7) == i128+7)); + assert(std::is_heap(i129, i129+7) == (std::is_heap_until(i129, i129+7) == i129+7)); + assert(std::is_heap(i130, i130+7) == (std::is_heap_until(i130, i130+7) == i130+7)); + assert(std::is_heap(i131, i131+7) == (std::is_heap_until(i131, i131+7) == i131+7)); + assert(std::is_heap(i132, i132+7) == (std::is_heap_until(i132, i132+7) == i132+7)); + assert(std::is_heap(i133, i133+7) == (std::is_heap_until(i133, i133+7) == i133+7)); + assert(std::is_heap(i134, i134+7) == (std::is_heap_until(i134, i134+7) == i134+7)); + assert(std::is_heap(i135, i135+7) == (std::is_heap_until(i135, i135+7) == i135+7)); + assert(std::is_heap(i136, i136+7) == (std::is_heap_until(i136, i136+7) == i136+7)); + assert(std::is_heap(i137, i137+7) == (std::is_heap_until(i137, i137+7) == i137+7)); + assert(std::is_heap(i138, i138+7) == (std::is_heap_until(i138, i138+7) == i138+7)); + assert(std::is_heap(i139, i139+7) == (std::is_heap_until(i139, i139+7) == i139+7)); + assert(std::is_heap(i140, i140+7) == (std::is_heap_until(i140, i140+7) == i140+7)); + assert(std::is_heap(i141, i141+7) == (std::is_heap_until(i141, i141+7) == i141+7)); + assert(std::is_heap(i142, i142+7) == (std::is_heap_until(i142, i142+7) == i142+7)); + assert(std::is_heap(i143, i143+7) == (std::is_heap_until(i143, i143+7) == i143+7)); + assert(std::is_heap(i144, i144+7) == (std::is_heap_until(i144, i144+7) == i144+7)); + assert(std::is_heap(i145, i145+7) == (std::is_heap_until(i145, i145+7) == i145+7)); + assert(std::is_heap(i146, i146+7) == (std::is_heap_until(i146, i146+7) == i146+7)); + assert(std::is_heap(i147, i147+7) == (std::is_heap_until(i147, i147+7) == i147+7)); + assert(std::is_heap(i148, i148+7) == (std::is_heap_until(i148, i148+7) == i148+7)); + assert(std::is_heap(i149, i149+7) == (std::is_heap_until(i149, i149+7) == i149+7)); + assert(std::is_heap(i150, i150+7) == (std::is_heap_until(i150, i150+7) == i150+7)); + assert(std::is_heap(i151, i151+7) == (std::is_heap_until(i151, i151+7) == i151+7)); + assert(std::is_heap(i152, i152+7) == (std::is_heap_until(i152, i152+7) == i152+7)); + assert(std::is_heap(i153, i153+7) == (std::is_heap_until(i153, i153+7) == i153+7)); + assert(std::is_heap(i154, i154+7) == (std::is_heap_until(i154, i154+7) == i154+7)); + assert(std::is_heap(i155, i155+7) == (std::is_heap_until(i155, i155+7) == i155+7)); + assert(std::is_heap(i156, i156+7) == (std::is_heap_until(i156, i156+7) == i156+7)); + assert(std::is_heap(i157, i157+7) == (std::is_heap_until(i157, i157+7) == i157+7)); + assert(std::is_heap(i158, i158+7) == (std::is_heap_until(i158, i158+7) == i158+7)); + assert(std::is_heap(i159, i159+7) == (std::is_heap_until(i159, i159+7) == i159+7)); + assert(std::is_heap(i160, i160+7) == (std::is_heap_until(i160, i160+7) == i160+7)); + assert(std::is_heap(i161, i161+7) == (std::is_heap_until(i161, i161+7) == i161+7)); + assert(std::is_heap(i162, i162+7) == (std::is_heap_until(i162, i162+7) == i162+7)); + assert(std::is_heap(i163, i163+7) == (std::is_heap_until(i163, i163+7) == i163+7)); + assert(std::is_heap(i164, i164+7) == (std::is_heap_until(i164, i164+7) == i164+7)); + assert(std::is_heap(i165, i165+7) == (std::is_heap_until(i165, i165+7) == i165+7)); + assert(std::is_heap(i166, i166+7) == (std::is_heap_until(i166, i166+7) == i166+7)); + assert(std::is_heap(i167, i167+7) == (std::is_heap_until(i167, i167+7) == i167+7)); + assert(std::is_heap(i168, i168+7) == (std::is_heap_until(i168, i168+7) == i168+7)); + assert(std::is_heap(i169, i169+7) == (std::is_heap_until(i169, i169+7) == i169+7)); + assert(std::is_heap(i170, i170+7) == (std::is_heap_until(i170, i170+7) == i170+7)); + assert(std::is_heap(i171, i171+7) == (std::is_heap_until(i171, i171+7) == i171+7)); + assert(std::is_heap(i172, i172+7) == (std::is_heap_until(i172, i172+7) == i172+7)); + assert(std::is_heap(i173, i173+7) == (std::is_heap_until(i173, i173+7) == i173+7)); + assert(std::is_heap(i174, i174+7) == (std::is_heap_until(i174, i174+7) == i174+7)); + assert(std::is_heap(i175, i175+7) == (std::is_heap_until(i175, i175+7) == i175+7)); + assert(std::is_heap(i176, i176+7) == (std::is_heap_until(i176, i176+7) == i176+7)); + assert(std::is_heap(i177, i177+7) == (std::is_heap_until(i177, i177+7) == i177+7)); + assert(std::is_heap(i178, i178+7) == (std::is_heap_until(i178, i178+7) == i178+7)); + assert(std::is_heap(i179, i179+7) == (std::is_heap_until(i179, i179+7) == i179+7)); + assert(std::is_heap(i180, i180+7) == (std::is_heap_until(i180, i180+7) == i180+7)); + assert(std::is_heap(i181, i181+7) == (std::is_heap_until(i181, i181+7) == i181+7)); + assert(std::is_heap(i182, i182+7) == (std::is_heap_until(i182, i182+7) == i182+7)); + assert(std::is_heap(i183, i183+7) == (std::is_heap_until(i183, i183+7) == i183+7)); + assert(std::is_heap(i184, i184+7) == (std::is_heap_until(i184, i184+7) == i184+7)); + assert(std::is_heap(i185, i185+7) == (std::is_heap_until(i185, i185+7) == i185+7)); + assert(std::is_heap(i186, i186+7) == (std::is_heap_until(i186, i186+7) == i186+7)); + assert(std::is_heap(i187, i187+7) == (std::is_heap_until(i187, i187+7) == i187+7)); + assert(std::is_heap(i188, i188+7) == (std::is_heap_until(i188, i188+7) == i188+7)); + assert(std::is_heap(i189, i189+7) == (std::is_heap_until(i189, i189+7) == i189+7)); + assert(std::is_heap(i190, i190+7) == (std::is_heap_until(i190, i190+7) == i190+7)); + assert(std::is_heap(i191, i191+7) == (std::is_heap_until(i191, i191+7) == i191+7)); + assert(std::is_heap(i192, i192+7) == (std::is_heap_until(i192, i192+7) == i192+7)); + assert(std::is_heap(i193, i193+7) == (std::is_heap_until(i193, i193+7) == i193+7)); + assert(std::is_heap(i194, i194+7) == (std::is_heap_until(i194, i194+7) == i194+7)); + assert(std::is_heap(i195, i195+7) == (std::is_heap_until(i195, i195+7) == i195+7)); + assert(std::is_heap(i196, i196+7) == (std::is_heap_until(i196, i196+7) == i196+7)); + assert(std::is_heap(i197, i197+7) == (std::is_heap_until(i197, i197+7) == i197+7)); + assert(std::is_heap(i198, i198+7) == (std::is_heap_until(i198, i198+7) == i198+7)); + assert(std::is_heap(i199, i199+7) == (std::is_heap_until(i199, i199+7) == i199+7)); + assert(std::is_heap(i200, i200+7) == (std::is_heap_until(i200, i200+7) == i200+7)); + assert(std::is_heap(i201, i201+7) == (std::is_heap_until(i201, i201+7) == i201+7)); + assert(std::is_heap(i202, i202+7) == (std::is_heap_until(i202, i202+7) == i202+7)); + assert(std::is_heap(i203, i203+7) == (std::is_heap_until(i203, i203+7) == i203+7)); + assert(std::is_heap(i204, i204+7) == (std::is_heap_until(i204, i204+7) == i204+7)); + assert(std::is_heap(i205, i205+7) == (std::is_heap_until(i205, i205+7) == i205+7)); + assert(std::is_heap(i206, i206+7) == (std::is_heap_until(i206, i206+7) == i206+7)); + assert(std::is_heap(i207, i207+7) == (std::is_heap_until(i207, i207+7) == i207+7)); + assert(std::is_heap(i208, i208+7) == (std::is_heap_until(i208, i208+7) == i208+7)); + assert(std::is_heap(i209, i209+7) == (std::is_heap_until(i209, i209+7) == i209+7)); + assert(std::is_heap(i210, i210+7) == (std::is_heap_until(i210, i210+7) == i210+7)); + assert(std::is_heap(i211, i211+7) == (std::is_heap_until(i211, i211+7) == i211+7)); + assert(std::is_heap(i212, i212+7) == (std::is_heap_until(i212, i212+7) == i212+7)); + assert(std::is_heap(i213, i213+7) == (std::is_heap_until(i213, i213+7) == i213+7)); + assert(std::is_heap(i214, i214+7) == (std::is_heap_until(i214, i214+7) == i214+7)); + assert(std::is_heap(i215, i215+7) == (std::is_heap_until(i215, i215+7) == i215+7)); + assert(std::is_heap(i216, i216+7) == (std::is_heap_until(i216, i216+7) == i216+7)); + assert(std::is_heap(i217, i217+7) == (std::is_heap_until(i217, i217+7) == i217+7)); + assert(std::is_heap(i218, i218+7) == (std::is_heap_until(i218, i218+7) == i218+7)); + assert(std::is_heap(i219, i219+7) == (std::is_heap_until(i219, i219+7) == i219+7)); + assert(std::is_heap(i220, i220+7) == (std::is_heap_until(i220, i220+7) == i220+7)); + assert(std::is_heap(i221, i221+7) == (std::is_heap_until(i221, i221+7) == i221+7)); + assert(std::is_heap(i222, i222+7) == (std::is_heap_until(i222, i222+7) == i222+7)); + assert(std::is_heap(i223, i223+7) == (std::is_heap_until(i223, i223+7) == i223+7)); + assert(std::is_heap(i224, i224+7) == (std::is_heap_until(i224, i224+7) == i224+7)); + assert(std::is_heap(i225, i225+7) == (std::is_heap_until(i225, i225+7) == i225+7)); + assert(std::is_heap(i226, i226+7) == (std::is_heap_until(i226, i226+7) == i226+7)); + assert(std::is_heap(i227, i227+7) == (std::is_heap_until(i227, i227+7) == i227+7)); + assert(std::is_heap(i228, i228+7) == (std::is_heap_until(i228, i228+7) == i228+7)); + assert(std::is_heap(i229, i229+7) == (std::is_heap_until(i229, i229+7) == i229+7)); + assert(std::is_heap(i230, i230+7) == (std::is_heap_until(i230, i230+7) == i230+7)); + assert(std::is_heap(i231, i231+7) == (std::is_heap_until(i231, i231+7) == i231+7)); + assert(std::is_heap(i232, i232+7) == (std::is_heap_until(i232, i232+7) == i232+7)); + assert(std::is_heap(i233, i233+7) == (std::is_heap_until(i233, i233+7) == i233+7)); + assert(std::is_heap(i234, i234+7) == (std::is_heap_until(i234, i234+7) == i234+7)); + assert(std::is_heap(i235, i235+7) == (std::is_heap_until(i235, i235+7) == i235+7)); + assert(std::is_heap(i236, i236+7) == (std::is_heap_until(i236, i236+7) == i236+7)); + assert(std::is_heap(i237, i237+7) == (std::is_heap_until(i237, i237+7) == i237+7)); + assert(std::is_heap(i238, i238+7) == (std::is_heap_until(i238, i238+7) == i238+7)); + assert(std::is_heap(i239, i239+7) == (std::is_heap_until(i239, i239+7) == i239+7)); + assert(std::is_heap(i240, i240+7) == (std::is_heap_until(i240, i240+7) == i240+7)); + assert(std::is_heap(i241, i241+7) == (std::is_heap_until(i241, i241+7) == i241+7)); + assert(std::is_heap(i242, i242+7) == (std::is_heap_until(i242, i242+7) == i242+7)); + assert(std::is_heap(i243, i243+7) == (std::is_heap_until(i243, i243+7) == i243+7)); + assert(std::is_heap(i244, i244+7) == (std::is_heap_until(i244, i244+7) == i244+7)); + assert(std::is_heap(i245, i245+7) == (std::is_heap_until(i245, i245+7) == i245+7)); + assert(std::is_heap(i246, i246+7) == (std::is_heap_until(i246, i246+7) == i246+7)); +} + +int main() +{ + test(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_comp.pass.cpp new file mode 100644 index 00000000000..af55cc499ed --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_comp.pass.cpp @@ -0,0 +1,522 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires LessThanComparable<Iter::value_type> +// bool +// is_heap(Iter first, Iter last); + +#include <algorithm> +#include <functional> +#include <cassert> + +void test() +{ + int i1[] = {0, 0}; + assert(std::is_heap(i1, i1, std::greater<int>())); + assert(std::is_heap(i1, i1+1, std::greater<int>()) == (std::is_heap_until(i1, i1+1, std::greater<int>()) == i1+1)); + int i2[] = {0, 1}; + int i3[] = {1, 0}; + assert(std::is_heap(i1, i1+2, std::greater<int>()) == (std::is_heap_until(i1, i1+2, std::greater<int>()) == i1+2)); + assert(std::is_heap(i2, i2+2, std::greater<int>()) == (std::is_heap_until(i2, i2+2, std::greater<int>()) == i2+2)); + assert(std::is_heap(i3, i3+2, std::greater<int>()) == (std::is_heap_until(i3, i3+2, std::greater<int>()) == i3+2)); + int i4[] = {0, 0, 0}; + int i5[] = {0, 0, 1}; + int i6[] = {0, 1, 0}; + int i7[] = {0, 1, 1}; + int i8[] = {1, 0, 0}; + int i9[] = {1, 0, 1}; + int i10[] = {1, 1, 0}; + assert(std::is_heap(i4, i4+3, std::greater<int>()) == (std::is_heap_until(i4, i4+3, std::greater<int>()) == i4+3)); + assert(std::is_heap(i5, i5+3, std::greater<int>()) == (std::is_heap_until(i5, i5+3, std::greater<int>()) == i5+3)); + assert(std::is_heap(i6, i6+3, std::greater<int>()) == (std::is_heap_until(i6, i6+3, std::greater<int>()) == i6+3)); + assert(std::is_heap(i7, i7+3, std::greater<int>()) == (std::is_heap_until(i7, i7+3, std::greater<int>()) == i7+3)); + assert(std::is_heap(i8, i8+3, std::greater<int>()) == (std::is_heap_until(i8, i8+3, std::greater<int>()) == i8+3)); + assert(std::is_heap(i9, i9+3, std::greater<int>()) == (std::is_heap_until(i9, i9+3, std::greater<int>()) == i9+3)); + assert(std::is_heap(i10, i10+3, std::greater<int>()) == (std::is_heap_until(i10, i10+3, std::greater<int>()) == i10+3)); + int i11[] = {0, 0, 0, 0}; + int i12[] = {0, 0, 0, 1}; + int i13[] = {0, 0, 1, 0}; + int i14[] = {0, 0, 1, 1}; + int i15[] = {0, 1, 0, 0}; + int i16[] = {0, 1, 0, 1}; + int i17[] = {0, 1, 1, 0}; + int i18[] = {0, 1, 1, 1}; + int i19[] = {1, 0, 0, 0}; + int i20[] = {1, 0, 0, 1}; + int i21[] = {1, 0, 1, 0}; + int i22[] = {1, 0, 1, 1}; + int i23[] = {1, 1, 0, 0}; + int i24[] = {1, 1, 0, 1}; + int i25[] = {1, 1, 1, 0}; + assert(std::is_heap(i11, i11+4, std::greater<int>()) == (std::is_heap_until(i11, i11+4, std::greater<int>()) == i11+4)); + assert(std::is_heap(i12, i12+4, std::greater<int>()) == (std::is_heap_until(i12, i12+4, std::greater<int>()) == i12+4)); + assert(std::is_heap(i13, i13+4, std::greater<int>()) == (std::is_heap_until(i13, i13+4, std::greater<int>()) == i13+4)); + assert(std::is_heap(i14, i14+4, std::greater<int>()) == (std::is_heap_until(i14, i14+4, std::greater<int>()) == i14+4)); + assert(std::is_heap(i15, i15+4, std::greater<int>()) == (std::is_heap_until(i15, i15+4, std::greater<int>()) == i15+4)); + assert(std::is_heap(i16, i16+4, std::greater<int>()) == (std::is_heap_until(i16, i16+4, std::greater<int>()) == i16+4)); + assert(std::is_heap(i17, i17+4, std::greater<int>()) == (std::is_heap_until(i17, i17+4, std::greater<int>()) == i17+4)); + assert(std::is_heap(i18, i18+4, std::greater<int>()) == (std::is_heap_until(i18, i18+4, std::greater<int>()) == i18+4)); + assert(std::is_heap(i19, i19+4, std::greater<int>()) == (std::is_heap_until(i19, i19+4, std::greater<int>()) == i19+4)); + assert(std::is_heap(i20, i20+4, std::greater<int>()) == (std::is_heap_until(i20, i20+4, std::greater<int>()) == i20+4)); + assert(std::is_heap(i21, i21+4, std::greater<int>()) == (std::is_heap_until(i21, i21+4, std::greater<int>()) == i21+4)); + assert(std::is_heap(i22, i22+4, std::greater<int>()) == (std::is_heap_until(i22, i22+4, std::greater<int>()) == i22+4)); + assert(std::is_heap(i23, i23+4, std::greater<int>()) == (std::is_heap_until(i23, i23+4, std::greater<int>()) == i23+4)); + assert(std::is_heap(i24, i24+4, std::greater<int>()) == (std::is_heap_until(i24, i24+4, std::greater<int>()) == i24+4)); + assert(std::is_heap(i25, i25+4, std::greater<int>()) == (std::is_heap_until(i25, i25+4, std::greater<int>()) == i25+4)); + int i26[] = {0, 0, 0, 0, 0}; + int i27[] = {0, 0, 0, 0, 1}; + int i28[] = {0, 0, 0, 1, 0}; + int i29[] = {0, 0, 0, 1, 1}; + int i30[] = {0, 0, 1, 0, 0}; + int i31[] = {0, 0, 1, 0, 1}; + int i32[] = {0, 0, 1, 1, 0}; + int i33[] = {0, 0, 1, 1, 1}; + int i34[] = {0, 1, 0, 0, 0}; + int i35[] = {0, 1, 0, 0, 1}; + int i36[] = {0, 1, 0, 1, 0}; + int i37[] = {0, 1, 0, 1, 1}; + int i38[] = {0, 1, 1, 0, 0}; + int i39[] = {0, 1, 1, 0, 1}; + int i40[] = {0, 1, 1, 1, 0}; + int i41[] = {0, 1, 1, 1, 1}; + int i42[] = {1, 0, 0, 0, 0}; + int i43[] = {1, 0, 0, 0, 1}; + int i44[] = {1, 0, 0, 1, 0}; + int i45[] = {1, 0, 0, 1, 1}; + int i46[] = {1, 0, 1, 0, 0}; + int i47[] = {1, 0, 1, 0, 1}; + int i48[] = {1, 0, 1, 1, 0}; + int i49[] = {1, 0, 1, 1, 1}; + int i50[] = {1, 1, 0, 0, 0}; + int i51[] = {1, 1, 0, 0, 1}; + int i52[] = {1, 1, 0, 1, 0}; + int i53[] = {1, 1, 0, 1, 1}; + int i54[] = {1, 1, 1, 0, 0}; + int i55[] = {1, 1, 1, 0, 1}; + int i56[] = {1, 1, 1, 1, 0}; + assert(std::is_heap(i26, i26+5, std::greater<int>()) == (std::is_heap_until(i26, i26+5, std::greater<int>()) == i26+5)); + assert(std::is_heap(i27, i27+5, std::greater<int>()) == (std::is_heap_until(i27, i27+5, std::greater<int>()) == i27+5)); + assert(std::is_heap(i28, i28+5, std::greater<int>()) == (std::is_heap_until(i28, i28+5, std::greater<int>()) == i28+5)); + assert(std::is_heap(i29, i29+5, std::greater<int>()) == (std::is_heap_until(i29, i29+5, std::greater<int>()) == i29+5)); + assert(std::is_heap(i30, i30+5, std::greater<int>()) == (std::is_heap_until(i30, i30+5, std::greater<int>()) == i30+5)); + assert(std::is_heap(i31, i31+5, std::greater<int>()) == (std::is_heap_until(i31, i31+5, std::greater<int>()) == i31+5)); + assert(std::is_heap(i32, i32+5, std::greater<int>()) == (std::is_heap_until(i32, i32+5, std::greater<int>()) == i32+5)); + assert(std::is_heap(i33, i33+5, std::greater<int>()) == (std::is_heap_until(i33, i33+5, std::greater<int>()) == i33+5)); + assert(std::is_heap(i34, i34+5, std::greater<int>()) == (std::is_heap_until(i34, i34+5, std::greater<int>()) == i34+5)); + assert(std::is_heap(i35, i35+5, std::greater<int>()) == (std::is_heap_until(i35, i35+5, std::greater<int>()) == i35+5)); + assert(std::is_heap(i36, i36+5, std::greater<int>()) == (std::is_heap_until(i36, i36+5, std::greater<int>()) == i36+5)); + assert(std::is_heap(i37, i37+5, std::greater<int>()) == (std::is_heap_until(i37, i37+5, std::greater<int>()) == i37+5)); + assert(std::is_heap(i38, i38+5, std::greater<int>()) == (std::is_heap_until(i38, i38+5, std::greater<int>()) == i38+5)); + assert(std::is_heap(i39, i39+5, std::greater<int>()) == (std::is_heap_until(i39, i39+5, std::greater<int>()) == i39+5)); + assert(std::is_heap(i40, i40+5, std::greater<int>()) == (std::is_heap_until(i40, i40+5, std::greater<int>()) == i40+5)); + assert(std::is_heap(i41, i41+5, std::greater<int>()) == (std::is_heap_until(i41, i41+5, std::greater<int>()) == i41+5)); + assert(std::is_heap(i42, i42+5, std::greater<int>()) == (std::is_heap_until(i42, i42+5, std::greater<int>()) == i42+5)); + assert(std::is_heap(i43, i43+5, std::greater<int>()) == (std::is_heap_until(i43, i43+5, std::greater<int>()) == i43+5)); + assert(std::is_heap(i44, i44+5, std::greater<int>()) == (std::is_heap_until(i44, i44+5, std::greater<int>()) == i44+5)); + assert(std::is_heap(i45, i45+5, std::greater<int>()) == (std::is_heap_until(i45, i45+5, std::greater<int>()) == i45+5)); + assert(std::is_heap(i46, i46+5, std::greater<int>()) == (std::is_heap_until(i46, i46+5, std::greater<int>()) == i46+5)); + assert(std::is_heap(i47, i47+5, std::greater<int>()) == (std::is_heap_until(i47, i47+5, std::greater<int>()) == i47+5)); + assert(std::is_heap(i48, i48+5, std::greater<int>()) == (std::is_heap_until(i48, i48+5, std::greater<int>()) == i48+5)); + assert(std::is_heap(i49, i49+5, std::greater<int>()) == (std::is_heap_until(i49, i49+5, std::greater<int>()) == i49+5)); + assert(std::is_heap(i50, i50+5, std::greater<int>()) == (std::is_heap_until(i50, i50+5, std::greater<int>()) == i50+5)); + assert(std::is_heap(i51, i51+5, std::greater<int>()) == (std::is_heap_until(i51, i51+5, std::greater<int>()) == i51+5)); + assert(std::is_heap(i52, i52+5, std::greater<int>()) == (std::is_heap_until(i52, i52+5, std::greater<int>()) == i52+5)); + assert(std::is_heap(i53, i53+5, std::greater<int>()) == (std::is_heap_until(i53, i53+5, std::greater<int>()) == i53+5)); + assert(std::is_heap(i54, i54+5, std::greater<int>()) == (std::is_heap_until(i54, i54+5, std::greater<int>()) == i54+5)); + assert(std::is_heap(i55, i55+5, std::greater<int>()) == (std::is_heap_until(i55, i55+5, std::greater<int>()) == i55+5)); + assert(std::is_heap(i56, i56+5, std::greater<int>()) == (std::is_heap_until(i56, i56+5, std::greater<int>()) == i56+5)); + int i57[] = {0, 0, 0, 0, 0, 0}; + int i58[] = {0, 0, 0, 0, 0, 1}; + int i59[] = {0, 0, 0, 0, 1, 0}; + int i60[] = {0, 0, 0, 0, 1, 1}; + int i61[] = {0, 0, 0, 1, 0, 0}; + int i62[] = {0, 0, 0, 1, 0, 1}; + int i63[] = {0, 0, 0, 1, 1, 0}; + int i64[] = {0, 0, 0, 1, 1, 1}; + int i65[] = {0, 0, 1, 0, 0, 0}; + int i66[] = {0, 0, 1, 0, 0, 1}; + int i67[] = {0, 0, 1, 0, 1, 0}; + int i68[] = {0, 0, 1, 0, 1, 1}; + int i69[] = {0, 0, 1, 1, 0, 0}; + int i70[] = {0, 0, 1, 1, 0, 1}; + int i71[] = {0, 0, 1, 1, 1, 0}; + int i72[] = {0, 0, 1, 1, 1, 1}; + int i73[] = {0, 1, 0, 0, 0, 0}; + int i74[] = {0, 1, 0, 0, 0, 1}; + int i75[] = {0, 1, 0, 0, 1, 0}; + int i76[] = {0, 1, 0, 0, 1, 1}; + int i77[] = {0, 1, 0, 1, 0, 0}; + int i78[] = {0, 1, 0, 1, 0, 1}; + int i79[] = {0, 1, 0, 1, 1, 0}; + int i80[] = {0, 1, 0, 1, 1, 1}; + int i81[] = {0, 1, 1, 0, 0, 0}; + int i82[] = {0, 1, 1, 0, 0, 1}; + int i83[] = {0, 1, 1, 0, 1, 0}; + int i84[] = {0, 1, 1, 0, 1, 1}; + int i85[] = {0, 1, 1, 1, 0, 0}; + int i86[] = {0, 1, 1, 1, 0, 1}; + int i87[] = {0, 1, 1, 1, 1, 0}; + int i88[] = {0, 1, 1, 1, 1, 1}; + int i89[] = {1, 0, 0, 0, 0, 0}; + int i90[] = {1, 0, 0, 0, 0, 1}; + int i91[] = {1, 0, 0, 0, 1, 0}; + int i92[] = {1, 0, 0, 0, 1, 1}; + int i93[] = {1, 0, 0, 1, 0, 0}; + int i94[] = {1, 0, 0, 1, 0, 1}; + int i95[] = {1, 0, 0, 1, 1, 0}; + int i96[] = {1, 0, 0, 1, 1, 1}; + int i97[] = {1, 0, 1, 0, 0, 0}; + int i98[] = {1, 0, 1, 0, 0, 1}; + int i99[] = {1, 0, 1, 0, 1, 0}; + int i100[] = {1, 0, 1, 0, 1, 1}; + int i101[] = {1, 0, 1, 1, 0, 0}; + int i102[] = {1, 0, 1, 1, 0, 1}; + int i103[] = {1, 0, 1, 1, 1, 0}; + int i104[] = {1, 0, 1, 1, 1, 1}; + int i105[] = {1, 1, 0, 0, 0, 0}; + int i106[] = {1, 1, 0, 0, 0, 1}; + int i107[] = {1, 1, 0, 0, 1, 0}; + int i108[] = {1, 1, 0, 0, 1, 1}; + int i109[] = {1, 1, 0, 1, 0, 0}; + int i110[] = {1, 1, 0, 1, 0, 1}; + int i111[] = {1, 1, 0, 1, 1, 0}; + int i112[] = {1, 1, 0, 1, 1, 1}; + int i113[] = {1, 1, 1, 0, 0, 0}; + int i114[] = {1, 1, 1, 0, 0, 1}; + int i115[] = {1, 1, 1, 0, 1, 0}; + int i116[] = {1, 1, 1, 0, 1, 1}; + int i117[] = {1, 1, 1, 1, 0, 0}; + int i118[] = {1, 1, 1, 1, 0, 1}; + int i119[] = {1, 1, 1, 1, 1, 0}; + assert(std::is_heap(i57, i57+6, std::greater<int>()) == (std::is_heap_until(i57, i57+6, std::greater<int>()) == i57+6)); + assert(std::is_heap(i58, i58+6, std::greater<int>()) == (std::is_heap_until(i58, i58+6, std::greater<int>()) == i58+6)); + assert(std::is_heap(i59, i59+6, std::greater<int>()) == (std::is_heap_until(i59, i59+6, std::greater<int>()) == i59+6)); + assert(std::is_heap(i60, i60+6, std::greater<int>()) == (std::is_heap_until(i60, i60+6, std::greater<int>()) == i60+6)); + assert(std::is_heap(i61, i61+6, std::greater<int>()) == (std::is_heap_until(i61, i61+6, std::greater<int>()) == i61+6)); + assert(std::is_heap(i62, i62+6, std::greater<int>()) == (std::is_heap_until(i62, i62+6, std::greater<int>()) == i62+6)); + assert(std::is_heap(i63, i63+6, std::greater<int>()) == (std::is_heap_until(i63, i63+6, std::greater<int>()) == i63+6)); + assert(std::is_heap(i64, i64+6, std::greater<int>()) == (std::is_heap_until(i64, i64+6, std::greater<int>()) == i64+6)); + assert(std::is_heap(i65, i65+6, std::greater<int>()) == (std::is_heap_until(i65, i65+6, std::greater<int>()) == i65+6)); + assert(std::is_heap(i66, i66+6, std::greater<int>()) == (std::is_heap_until(i66, i66+6, std::greater<int>()) == i66+6)); + assert(std::is_heap(i67, i67+6, std::greater<int>()) == (std::is_heap_until(i67, i67+6, std::greater<int>()) == i67+6)); + assert(std::is_heap(i68, i68+6, std::greater<int>()) == (std::is_heap_until(i68, i68+6, std::greater<int>()) == i68+6)); + assert(std::is_heap(i69, i69+6, std::greater<int>()) == (std::is_heap_until(i69, i69+6, std::greater<int>()) == i69+6)); + assert(std::is_heap(i70, i70+6, std::greater<int>()) == (std::is_heap_until(i70, i70+6, std::greater<int>()) == i70+6)); + assert(std::is_heap(i71, i71+6, std::greater<int>()) == (std::is_heap_until(i71, i71+6, std::greater<int>()) == i71+6)); + assert(std::is_heap(i72, i72+6, std::greater<int>()) == (std::is_heap_until(i72, i72+6, std::greater<int>()) == i72+6)); + assert(std::is_heap(i73, i73+6, std::greater<int>()) == (std::is_heap_until(i73, i73+6, std::greater<int>()) == i73+6)); + assert(std::is_heap(i74, i74+6, std::greater<int>()) == (std::is_heap_until(i74, i74+6, std::greater<int>()) == i74+6)); + assert(std::is_heap(i75, i75+6, std::greater<int>()) == (std::is_heap_until(i75, i75+6, std::greater<int>()) == i75+6)); + assert(std::is_heap(i76, i76+6, std::greater<int>()) == (std::is_heap_until(i76, i76+6, std::greater<int>()) == i76+6)); + assert(std::is_heap(i77, i77+6, std::greater<int>()) == (std::is_heap_until(i77, i77+6, std::greater<int>()) == i77+6)); + assert(std::is_heap(i78, i78+6, std::greater<int>()) == (std::is_heap_until(i78, i78+6, std::greater<int>()) == i78+6)); + assert(std::is_heap(i79, i79+6, std::greater<int>()) == (std::is_heap_until(i79, i79+6, std::greater<int>()) == i79+6)); + assert(std::is_heap(i80, i80+6, std::greater<int>()) == (std::is_heap_until(i80, i80+6, std::greater<int>()) == i80+6)); + assert(std::is_heap(i81, i81+6, std::greater<int>()) == (std::is_heap_until(i81, i81+6, std::greater<int>()) == i81+6)); + assert(std::is_heap(i82, i82+6, std::greater<int>()) == (std::is_heap_until(i82, i82+6, std::greater<int>()) == i82+6)); + assert(std::is_heap(i83, i83+6, std::greater<int>()) == (std::is_heap_until(i83, i83+6, std::greater<int>()) == i83+6)); + assert(std::is_heap(i84, i84+6, std::greater<int>()) == (std::is_heap_until(i84, i84+6, std::greater<int>()) == i84+6)); + assert(std::is_heap(i85, i85+6, std::greater<int>()) == (std::is_heap_until(i85, i85+6, std::greater<int>()) == i85+6)); + assert(std::is_heap(i86, i86+6, std::greater<int>()) == (std::is_heap_until(i86, i86+6, std::greater<int>()) == i86+6)); + assert(std::is_heap(i87, i87+6, std::greater<int>()) == (std::is_heap_until(i87, i87+6, std::greater<int>()) == i87+6)); + assert(std::is_heap(i88, i88+6, std::greater<int>()) == (std::is_heap_until(i88, i88+6, std::greater<int>()) == i88+6)); + assert(std::is_heap(i89, i89+6, std::greater<int>()) == (std::is_heap_until(i89, i89+6, std::greater<int>()) == i89+6)); + assert(std::is_heap(i90, i90+6, std::greater<int>()) == (std::is_heap_until(i90, i90+6, std::greater<int>()) == i90+6)); + assert(std::is_heap(i91, i91+6, std::greater<int>()) == (std::is_heap_until(i91, i91+6, std::greater<int>()) == i91+6)); + assert(std::is_heap(i92, i92+6, std::greater<int>()) == (std::is_heap_until(i92, i92+6, std::greater<int>()) == i92+6)); + assert(std::is_heap(i93, i93+6, std::greater<int>()) == (std::is_heap_until(i93, i93+6, std::greater<int>()) == i93+6)); + assert(std::is_heap(i94, i94+6, std::greater<int>()) == (std::is_heap_until(i94, i94+6, std::greater<int>()) == i94+6)); + assert(std::is_heap(i95, i95+6, std::greater<int>()) == (std::is_heap_until(i95, i95+6, std::greater<int>()) == i95+6)); + assert(std::is_heap(i96, i96+6, std::greater<int>()) == (std::is_heap_until(i96, i96+6, std::greater<int>()) == i96+6)); + assert(std::is_heap(i97, i97+6, std::greater<int>()) == (std::is_heap_until(i97, i97+6, std::greater<int>()) == i97+6)); + assert(std::is_heap(i98, i98+6, std::greater<int>()) == (std::is_heap_until(i98, i98+6, std::greater<int>()) == i98+6)); + assert(std::is_heap(i99, i99+6, std::greater<int>()) == (std::is_heap_until(i99, i99+6, std::greater<int>()) == i99+6)); + assert(std::is_heap(i100, i100+6, std::greater<int>()) == (std::is_heap_until(i100, i100+6, std::greater<int>()) == i100+6)); + assert(std::is_heap(i101, i101+6, std::greater<int>()) == (std::is_heap_until(i101, i101+6, std::greater<int>()) == i101+6)); + assert(std::is_heap(i102, i102+6, std::greater<int>()) == (std::is_heap_until(i102, i102+6, std::greater<int>()) == i102+6)); + assert(std::is_heap(i103, i103+6, std::greater<int>()) == (std::is_heap_until(i103, i103+6, std::greater<int>()) == i103+6)); + assert(std::is_heap(i104, i104+6, std::greater<int>()) == (std::is_heap_until(i104, i104+6, std::greater<int>()) == i104+6)); + assert(std::is_heap(i105, i105+6, std::greater<int>()) == (std::is_heap_until(i105, i105+6, std::greater<int>()) == i105+6)); + assert(std::is_heap(i106, i106+6, std::greater<int>()) == (std::is_heap_until(i106, i106+6, std::greater<int>()) == i106+6)); + assert(std::is_heap(i107, i107+6, std::greater<int>()) == (std::is_heap_until(i107, i107+6, std::greater<int>()) == i107+6)); + assert(std::is_heap(i108, i108+6, std::greater<int>()) == (std::is_heap_until(i108, i108+6, std::greater<int>()) == i108+6)); + assert(std::is_heap(i109, i109+6, std::greater<int>()) == (std::is_heap_until(i109, i109+6, std::greater<int>()) == i109+6)); + assert(std::is_heap(i110, i110+6, std::greater<int>()) == (std::is_heap_until(i110, i110+6, std::greater<int>()) == i110+6)); + assert(std::is_heap(i111, i111+6, std::greater<int>()) == (std::is_heap_until(i111, i111+6, std::greater<int>()) == i111+6)); + assert(std::is_heap(i112, i112+6, std::greater<int>()) == (std::is_heap_until(i112, i112+6, std::greater<int>()) == i112+6)); + assert(std::is_heap(i113, i113+6, std::greater<int>()) == (std::is_heap_until(i113, i113+6, std::greater<int>()) == i113+6)); + assert(std::is_heap(i114, i114+6, std::greater<int>()) == (std::is_heap_until(i114, i114+6, std::greater<int>()) == i114+6)); + assert(std::is_heap(i115, i115+6, std::greater<int>()) == (std::is_heap_until(i115, i115+6, std::greater<int>()) == i115+6)); + assert(std::is_heap(i116, i116+6, std::greater<int>()) == (std::is_heap_until(i116, i116+6, std::greater<int>()) == i116+6)); + assert(std::is_heap(i117, i117+6, std::greater<int>()) == (std::is_heap_until(i117, i117+6, std::greater<int>()) == i117+6)); + assert(std::is_heap(i118, i118+6, std::greater<int>()) == (std::is_heap_until(i118, i118+6, std::greater<int>()) == i118+6)); + assert(std::is_heap(i119, i119+6, std::greater<int>()) == (std::is_heap_until(i119, i119+6, std::greater<int>()) == i119+6)); + int i120[] = {0, 0, 0, 0, 0, 0, 0}; + int i121[] = {0, 0, 0, 0, 0, 0, 1}; + int i122[] = {0, 0, 0, 0, 0, 1, 0}; + int i123[] = {0, 0, 0, 0, 0, 1, 1}; + int i124[] = {0, 0, 0, 0, 1, 0, 0}; + int i125[] = {0, 0, 0, 0, 1, 0, 1}; + int i126[] = {0, 0, 0, 0, 1, 1, 0}; + int i127[] = {0, 0, 0, 0, 1, 1, 1}; + int i128[] = {0, 0, 0, 1, 0, 0, 0}; + int i129[] = {0, 0, 0, 1, 0, 0, 1}; + int i130[] = {0, 0, 0, 1, 0, 1, 0}; + int i131[] = {0, 0, 0, 1, 0, 1, 1}; + int i132[] = {0, 0, 0, 1, 1, 0, 0}; + int i133[] = {0, 0, 0, 1, 1, 0, 1}; + int i134[] = {0, 0, 0, 1, 1, 1, 0}; + int i135[] = {0, 0, 0, 1, 1, 1, 1}; + int i136[] = {0, 0, 1, 0, 0, 0, 0}; + int i137[] = {0, 0, 1, 0, 0, 0, 1}; + int i138[] = {0, 0, 1, 0, 0, 1, 0}; + int i139[] = {0, 0, 1, 0, 0, 1, 1}; + int i140[] = {0, 0, 1, 0, 1, 0, 0}; + int i141[] = {0, 0, 1, 0, 1, 0, 1}; + int i142[] = {0, 0, 1, 0, 1, 1, 0}; + int i143[] = {0, 0, 1, 0, 1, 1, 1}; + int i144[] = {0, 0, 1, 1, 0, 0, 0}; + int i145[] = {0, 0, 1, 1, 0, 0, 1}; + int i146[] = {0, 0, 1, 1, 0, 1, 0}; + int i147[] = {0, 0, 1, 1, 0, 1, 1}; + int i148[] = {0, 0, 1, 1, 1, 0, 0}; + int i149[] = {0, 0, 1, 1, 1, 0, 1}; + int i150[] = {0, 0, 1, 1, 1, 1, 0}; + int i151[] = {0, 0, 1, 1, 1, 1, 1}; + int i152[] = {0, 1, 0, 0, 0, 0, 0}; + int i153[] = {0, 1, 0, 0, 0, 0, 1}; + int i154[] = {0, 1, 0, 0, 0, 1, 0}; + int i155[] = {0, 1, 0, 0, 0, 1, 1}; + int i156[] = {0, 1, 0, 0, 1, 0, 0}; + int i157[] = {0, 1, 0, 0, 1, 0, 1}; + int i158[] = {0, 1, 0, 0, 1, 1, 0}; + int i159[] = {0, 1, 0, 0, 1, 1, 1}; + int i160[] = {0, 1, 0, 1, 0, 0, 0}; + int i161[] = {0, 1, 0, 1, 0, 0, 1}; + int i162[] = {0, 1, 0, 1, 0, 1, 0}; + int i163[] = {0, 1, 0, 1, 0, 1, 1}; + int i164[] = {0, 1, 0, 1, 1, 0, 0}; + int i165[] = {0, 1, 0, 1, 1, 0, 1}; + int i166[] = {0, 1, 0, 1, 1, 1, 0}; + int i167[] = {0, 1, 0, 1, 1, 1, 1}; + int i168[] = {0, 1, 1, 0, 0, 0, 0}; + int i169[] = {0, 1, 1, 0, 0, 0, 1}; + int i170[] = {0, 1, 1, 0, 0, 1, 0}; + int i171[] = {0, 1, 1, 0, 0, 1, 1}; + int i172[] = {0, 1, 1, 0, 1, 0, 0}; + int i173[] = {0, 1, 1, 0, 1, 0, 1}; + int i174[] = {0, 1, 1, 0, 1, 1, 0}; + int i175[] = {0, 1, 1, 0, 1, 1, 1}; + int i176[] = {0, 1, 1, 1, 0, 0, 0}; + int i177[] = {0, 1, 1, 1, 0, 0, 1}; + int i178[] = {0, 1, 1, 1, 0, 1, 0}; + int i179[] = {0, 1, 1, 1, 0, 1, 1}; + int i180[] = {0, 1, 1, 1, 1, 0, 0}; + int i181[] = {0, 1, 1, 1, 1, 0, 1}; + int i182[] = {0, 1, 1, 1, 1, 1, 0}; + int i183[] = {0, 1, 1, 1, 1, 1, 1}; + int i184[] = {1, 0, 0, 0, 0, 0, 0}; + int i185[] = {1, 0, 0, 0, 0, 0, 1}; + int i186[] = {1, 0, 0, 0, 0, 1, 0}; + int i187[] = {1, 0, 0, 0, 0, 1, 1}; + int i188[] = {1, 0, 0, 0, 1, 0, 0}; + int i189[] = {1, 0, 0, 0, 1, 0, 1}; + int i190[] = {1, 0, 0, 0, 1, 1, 0}; + int i191[] = {1, 0, 0, 0, 1, 1, 1}; + int i192[] = {1, 0, 0, 1, 0, 0, 0}; + int i193[] = {1, 0, 0, 1, 0, 0, 1}; + int i194[] = {1, 0, 0, 1, 0, 1, 0}; + int i195[] = {1, 0, 0, 1, 0, 1, 1}; + int i196[] = {1, 0, 0, 1, 1, 0, 0}; + int i197[] = {1, 0, 0, 1, 1, 0, 1}; + int i198[] = {1, 0, 0, 1, 1, 1, 0}; + int i199[] = {1, 0, 0, 1, 1, 1, 1}; + int i200[] = {1, 0, 1, 0, 0, 0, 0}; + int i201[] = {1, 0, 1, 0, 0, 0, 1}; + int i202[] = {1, 0, 1, 0, 0, 1, 0}; + int i203[] = {1, 0, 1, 0, 0, 1, 1}; + int i204[] = {1, 0, 1, 0, 1, 0, 0}; + int i205[] = {1, 0, 1, 0, 1, 0, 1}; + int i206[] = {1, 0, 1, 0, 1, 1, 0}; + int i207[] = {1, 0, 1, 0, 1, 1, 1}; + int i208[] = {1, 0, 1, 1, 0, 0, 0}; + int i209[] = {1, 0, 1, 1, 0, 0, 1}; + int i210[] = {1, 0, 1, 1, 0, 1, 0}; + int i211[] = {1, 0, 1, 1, 0, 1, 1}; + int i212[] = {1, 0, 1, 1, 1, 0, 0}; + int i213[] = {1, 0, 1, 1, 1, 0, 1}; + int i214[] = {1, 0, 1, 1, 1, 1, 0}; + int i215[] = {1, 0, 1, 1, 1, 1, 1}; + int i216[] = {1, 1, 0, 0, 0, 0, 0}; + int i217[] = {1, 1, 0, 0, 0, 0, 1}; + int i218[] = {1, 1, 0, 0, 0, 1, 0}; + int i219[] = {1, 1, 0, 0, 0, 1, 1}; + int i220[] = {1, 1, 0, 0, 1, 0, 0}; + int i221[] = {1, 1, 0, 0, 1, 0, 1}; + int i222[] = {1, 1, 0, 0, 1, 1, 0}; + int i223[] = {1, 1, 0, 0, 1, 1, 1}; + int i224[] = {1, 1, 0, 1, 0, 0, 0}; + int i225[] = {1, 1, 0, 1, 0, 0, 1}; + int i226[] = {1, 1, 0, 1, 0, 1, 0}; + int i227[] = {1, 1, 0, 1, 0, 1, 1}; + int i228[] = {1, 1, 0, 1, 1, 0, 0}; + int i229[] = {1, 1, 0, 1, 1, 0, 1}; + int i230[] = {1, 1, 0, 1, 1, 1, 0}; + int i231[] = {1, 1, 0, 1, 1, 1, 1}; + int i232[] = {1, 1, 1, 0, 0, 0, 0}; + int i233[] = {1, 1, 1, 0, 0, 0, 1}; + int i234[] = {1, 1, 1, 0, 0, 1, 0}; + int i235[] = {1, 1, 1, 0, 0, 1, 1}; + int i236[] = {1, 1, 1, 0, 1, 0, 0}; + int i237[] = {1, 1, 1, 0, 1, 0, 1}; + int i238[] = {1, 1, 1, 0, 1, 1, 0}; + int i239[] = {1, 1, 1, 0, 1, 1, 1}; + int i240[] = {1, 1, 1, 1, 0, 0, 0}; + int i241[] = {1, 1, 1, 1, 0, 0, 1}; + int i242[] = {1, 1, 1, 1, 0, 1, 0}; + int i243[] = {1, 1, 1, 1, 0, 1, 1}; + int i244[] = {1, 1, 1, 1, 1, 0, 0}; + int i245[] = {1, 1, 1, 1, 1, 0, 1}; + int i246[] = {1, 1, 1, 1, 1, 1, 0}; + assert(std::is_heap(i120, i120+7, std::greater<int>()) == (std::is_heap_until(i120, i120+7, std::greater<int>()) == i120+7)); + assert(std::is_heap(i121, i121+7, std::greater<int>()) == (std::is_heap_until(i121, i121+7, std::greater<int>()) == i121+7)); + assert(std::is_heap(i122, i122+7, std::greater<int>()) == (std::is_heap_until(i122, i122+7, std::greater<int>()) == i122+7)); + assert(std::is_heap(i123, i123+7, std::greater<int>()) == (std::is_heap_until(i123, i123+7, std::greater<int>()) == i123+7)); + assert(std::is_heap(i124, i124+7, std::greater<int>()) == (std::is_heap_until(i124, i124+7, std::greater<int>()) == i124+7)); + assert(std::is_heap(i125, i125+7, std::greater<int>()) == (std::is_heap_until(i125, i125+7, std::greater<int>()) == i125+7)); + assert(std::is_heap(i126, i126+7, std::greater<int>()) == (std::is_heap_until(i126, i126+7, std::greater<int>()) == i126+7)); + assert(std::is_heap(i127, i127+7, std::greater<int>()) == (std::is_heap_until(i127, i127+7, std::greater<int>()) == i127+7)); + assert(std::is_heap(i128, i128+7, std::greater<int>()) == (std::is_heap_until(i128, i128+7, std::greater<int>()) == i128+7)); + assert(std::is_heap(i129, i129+7, std::greater<int>()) == (std::is_heap_until(i129, i129+7, std::greater<int>()) == i129+7)); + assert(std::is_heap(i130, i130+7, std::greater<int>()) == (std::is_heap_until(i130, i130+7, std::greater<int>()) == i130+7)); + assert(std::is_heap(i131, i131+7, std::greater<int>()) == (std::is_heap_until(i131, i131+7, std::greater<int>()) == i131+7)); + assert(std::is_heap(i132, i132+7, std::greater<int>()) == (std::is_heap_until(i132, i132+7, std::greater<int>()) == i132+7)); + assert(std::is_heap(i133, i133+7, std::greater<int>()) == (std::is_heap_until(i133, i133+7, std::greater<int>()) == i133+7)); + assert(std::is_heap(i134, i134+7, std::greater<int>()) == (std::is_heap_until(i134, i134+7, std::greater<int>()) == i134+7)); + assert(std::is_heap(i135, i135+7, std::greater<int>()) == (std::is_heap_until(i135, i135+7, std::greater<int>()) == i135+7)); + assert(std::is_heap(i136, i136+7, std::greater<int>()) == (std::is_heap_until(i136, i136+7, std::greater<int>()) == i136+7)); + assert(std::is_heap(i137, i137+7, std::greater<int>()) == (std::is_heap_until(i137, i137+7, std::greater<int>()) == i137+7)); + assert(std::is_heap(i138, i138+7, std::greater<int>()) == (std::is_heap_until(i138, i138+7, std::greater<int>()) == i138+7)); + assert(std::is_heap(i139, i139+7, std::greater<int>()) == (std::is_heap_until(i139, i139+7, std::greater<int>()) == i139+7)); + assert(std::is_heap(i140, i140+7, std::greater<int>()) == (std::is_heap_until(i140, i140+7, std::greater<int>()) == i140+7)); + assert(std::is_heap(i141, i141+7, std::greater<int>()) == (std::is_heap_until(i141, i141+7, std::greater<int>()) == i141+7)); + assert(std::is_heap(i142, i142+7, std::greater<int>()) == (std::is_heap_until(i142, i142+7, std::greater<int>()) == i142+7)); + assert(std::is_heap(i143, i143+7, std::greater<int>()) == (std::is_heap_until(i143, i143+7, std::greater<int>()) == i143+7)); + assert(std::is_heap(i144, i144+7, std::greater<int>()) == (std::is_heap_until(i144, i144+7, std::greater<int>()) == i144+7)); + assert(std::is_heap(i145, i145+7, std::greater<int>()) == (std::is_heap_until(i145, i145+7, std::greater<int>()) == i145+7)); + assert(std::is_heap(i146, i146+7, std::greater<int>()) == (std::is_heap_until(i146, i146+7, std::greater<int>()) == i146+7)); + assert(std::is_heap(i147, i147+7, std::greater<int>()) == (std::is_heap_until(i147, i147+7, std::greater<int>()) == i147+7)); + assert(std::is_heap(i148, i148+7, std::greater<int>()) == (std::is_heap_until(i148, i148+7, std::greater<int>()) == i148+7)); + assert(std::is_heap(i149, i149+7, std::greater<int>()) == (std::is_heap_until(i149, i149+7, std::greater<int>()) == i149+7)); + assert(std::is_heap(i150, i150+7, std::greater<int>()) == (std::is_heap_until(i150, i150+7, std::greater<int>()) == i150+7)); + assert(std::is_heap(i151, i151+7, std::greater<int>()) == (std::is_heap_until(i151, i151+7, std::greater<int>()) == i151+7)); + assert(std::is_heap(i152, i152+7, std::greater<int>()) == (std::is_heap_until(i152, i152+7, std::greater<int>()) == i152+7)); + assert(std::is_heap(i153, i153+7, std::greater<int>()) == (std::is_heap_until(i153, i153+7, std::greater<int>()) == i153+7)); + assert(std::is_heap(i154, i154+7, std::greater<int>()) == (std::is_heap_until(i154, i154+7, std::greater<int>()) == i154+7)); + assert(std::is_heap(i155, i155+7, std::greater<int>()) == (std::is_heap_until(i155, i155+7, std::greater<int>()) == i155+7)); + assert(std::is_heap(i156, i156+7, std::greater<int>()) == (std::is_heap_until(i156, i156+7, std::greater<int>()) == i156+7)); + assert(std::is_heap(i157, i157+7, std::greater<int>()) == (std::is_heap_until(i157, i157+7, std::greater<int>()) == i157+7)); + assert(std::is_heap(i158, i158+7, std::greater<int>()) == (std::is_heap_until(i158, i158+7, std::greater<int>()) == i158+7)); + assert(std::is_heap(i159, i159+7, std::greater<int>()) == (std::is_heap_until(i159, i159+7, std::greater<int>()) == i159+7)); + assert(std::is_heap(i160, i160+7, std::greater<int>()) == (std::is_heap_until(i160, i160+7, std::greater<int>()) == i160+7)); + assert(std::is_heap(i161, i161+7, std::greater<int>()) == (std::is_heap_until(i161, i161+7, std::greater<int>()) == i161+7)); + assert(std::is_heap(i162, i162+7, std::greater<int>()) == (std::is_heap_until(i162, i162+7, std::greater<int>()) == i162+7)); + assert(std::is_heap(i163, i163+7, std::greater<int>()) == (std::is_heap_until(i163, i163+7, std::greater<int>()) == i163+7)); + assert(std::is_heap(i164, i164+7, std::greater<int>()) == (std::is_heap_until(i164, i164+7, std::greater<int>()) == i164+7)); + assert(std::is_heap(i165, i165+7, std::greater<int>()) == (std::is_heap_until(i165, i165+7, std::greater<int>()) == i165+7)); + assert(std::is_heap(i166, i166+7, std::greater<int>()) == (std::is_heap_until(i166, i166+7, std::greater<int>()) == i166+7)); + assert(std::is_heap(i167, i167+7, std::greater<int>()) == (std::is_heap_until(i167, i167+7, std::greater<int>()) == i167+7)); + assert(std::is_heap(i168, i168+7, std::greater<int>()) == (std::is_heap_until(i168, i168+7, std::greater<int>()) == i168+7)); + assert(std::is_heap(i169, i169+7, std::greater<int>()) == (std::is_heap_until(i169, i169+7, std::greater<int>()) == i169+7)); + assert(std::is_heap(i170, i170+7, std::greater<int>()) == (std::is_heap_until(i170, i170+7, std::greater<int>()) == i170+7)); + assert(std::is_heap(i171, i171+7, std::greater<int>()) == (std::is_heap_until(i171, i171+7, std::greater<int>()) == i171+7)); + assert(std::is_heap(i172, i172+7, std::greater<int>()) == (std::is_heap_until(i172, i172+7, std::greater<int>()) == i172+7)); + assert(std::is_heap(i173, i173+7, std::greater<int>()) == (std::is_heap_until(i173, i173+7, std::greater<int>()) == i173+7)); + assert(std::is_heap(i174, i174+7, std::greater<int>()) == (std::is_heap_until(i174, i174+7, std::greater<int>()) == i174+7)); + assert(std::is_heap(i175, i175+7, std::greater<int>()) == (std::is_heap_until(i175, i175+7, std::greater<int>()) == i175+7)); + assert(std::is_heap(i176, i176+7, std::greater<int>()) == (std::is_heap_until(i176, i176+7, std::greater<int>()) == i176+7)); + assert(std::is_heap(i177, i177+7, std::greater<int>()) == (std::is_heap_until(i177, i177+7, std::greater<int>()) == i177+7)); + assert(std::is_heap(i178, i178+7, std::greater<int>()) == (std::is_heap_until(i178, i178+7, std::greater<int>()) == i178+7)); + assert(std::is_heap(i179, i179+7, std::greater<int>()) == (std::is_heap_until(i179, i179+7, std::greater<int>()) == i179+7)); + assert(std::is_heap(i180, i180+7, std::greater<int>()) == (std::is_heap_until(i180, i180+7, std::greater<int>()) == i180+7)); + assert(std::is_heap(i181, i181+7, std::greater<int>()) == (std::is_heap_until(i181, i181+7, std::greater<int>()) == i181+7)); + assert(std::is_heap(i182, i182+7, std::greater<int>()) == (std::is_heap_until(i182, i182+7, std::greater<int>()) == i182+7)); + assert(std::is_heap(i183, i183+7, std::greater<int>()) == (std::is_heap_until(i183, i183+7, std::greater<int>()) == i183+7)); + assert(std::is_heap(i184, i184+7, std::greater<int>()) == (std::is_heap_until(i184, i184+7, std::greater<int>()) == i184+7)); + assert(std::is_heap(i185, i185+7, std::greater<int>()) == (std::is_heap_until(i185, i185+7, std::greater<int>()) == i185+7)); + assert(std::is_heap(i186, i186+7, std::greater<int>()) == (std::is_heap_until(i186, i186+7, std::greater<int>()) == i186+7)); + assert(std::is_heap(i187, i187+7, std::greater<int>()) == (std::is_heap_until(i187, i187+7, std::greater<int>()) == i187+7)); + assert(std::is_heap(i188, i188+7, std::greater<int>()) == (std::is_heap_until(i188, i188+7, std::greater<int>()) == i188+7)); + assert(std::is_heap(i189, i189+7, std::greater<int>()) == (std::is_heap_until(i189, i189+7, std::greater<int>()) == i189+7)); + assert(std::is_heap(i190, i190+7, std::greater<int>()) == (std::is_heap_until(i190, i190+7, std::greater<int>()) == i190+7)); + assert(std::is_heap(i191, i191+7, std::greater<int>()) == (std::is_heap_until(i191, i191+7, std::greater<int>()) == i191+7)); + assert(std::is_heap(i192, i192+7, std::greater<int>()) == (std::is_heap_until(i192, i192+7, std::greater<int>()) == i192+7)); + assert(std::is_heap(i193, i193+7, std::greater<int>()) == (std::is_heap_until(i193, i193+7, std::greater<int>()) == i193+7)); + assert(std::is_heap(i194, i194+7, std::greater<int>()) == (std::is_heap_until(i194, i194+7, std::greater<int>()) == i194+7)); + assert(std::is_heap(i195, i195+7, std::greater<int>()) == (std::is_heap_until(i195, i195+7, std::greater<int>()) == i195+7)); + assert(std::is_heap(i196, i196+7, std::greater<int>()) == (std::is_heap_until(i196, i196+7, std::greater<int>()) == i196+7)); + assert(std::is_heap(i197, i197+7, std::greater<int>()) == (std::is_heap_until(i197, i197+7, std::greater<int>()) == i197+7)); + assert(std::is_heap(i198, i198+7, std::greater<int>()) == (std::is_heap_until(i198, i198+7, std::greater<int>()) == i198+7)); + assert(std::is_heap(i199, i199+7, std::greater<int>()) == (std::is_heap_until(i199, i199+7, std::greater<int>()) == i199+7)); + assert(std::is_heap(i200, i200+7, std::greater<int>()) == (std::is_heap_until(i200, i200+7, std::greater<int>()) == i200+7)); + assert(std::is_heap(i201, i201+7, std::greater<int>()) == (std::is_heap_until(i201, i201+7, std::greater<int>()) == i201+7)); + assert(std::is_heap(i202, i202+7, std::greater<int>()) == (std::is_heap_until(i202, i202+7, std::greater<int>()) == i202+7)); + assert(std::is_heap(i203, i203+7, std::greater<int>()) == (std::is_heap_until(i203, i203+7, std::greater<int>()) == i203+7)); + assert(std::is_heap(i204, i204+7, std::greater<int>()) == (std::is_heap_until(i204, i204+7, std::greater<int>()) == i204+7)); + assert(std::is_heap(i205, i205+7, std::greater<int>()) == (std::is_heap_until(i205, i205+7, std::greater<int>()) == i205+7)); + assert(std::is_heap(i206, i206+7, std::greater<int>()) == (std::is_heap_until(i206, i206+7, std::greater<int>()) == i206+7)); + assert(std::is_heap(i207, i207+7, std::greater<int>()) == (std::is_heap_until(i207, i207+7, std::greater<int>()) == i207+7)); + assert(std::is_heap(i208, i208+7, std::greater<int>()) == (std::is_heap_until(i208, i208+7, std::greater<int>()) == i208+7)); + assert(std::is_heap(i209, i209+7, std::greater<int>()) == (std::is_heap_until(i209, i209+7, std::greater<int>()) == i209+7)); + assert(std::is_heap(i210, i210+7, std::greater<int>()) == (std::is_heap_until(i210, i210+7, std::greater<int>()) == i210+7)); + assert(std::is_heap(i211, i211+7, std::greater<int>()) == (std::is_heap_until(i211, i211+7, std::greater<int>()) == i211+7)); + assert(std::is_heap(i212, i212+7, std::greater<int>()) == (std::is_heap_until(i212, i212+7, std::greater<int>()) == i212+7)); + assert(std::is_heap(i213, i213+7, std::greater<int>()) == (std::is_heap_until(i213, i213+7, std::greater<int>()) == i213+7)); + assert(std::is_heap(i214, i214+7, std::greater<int>()) == (std::is_heap_until(i214, i214+7, std::greater<int>()) == i214+7)); + assert(std::is_heap(i215, i215+7, std::greater<int>()) == (std::is_heap_until(i215, i215+7, std::greater<int>()) == i215+7)); + assert(std::is_heap(i216, i216+7, std::greater<int>()) == (std::is_heap_until(i216, i216+7, std::greater<int>()) == i216+7)); + assert(std::is_heap(i217, i217+7, std::greater<int>()) == (std::is_heap_until(i217, i217+7, std::greater<int>()) == i217+7)); + assert(std::is_heap(i218, i218+7, std::greater<int>()) == (std::is_heap_until(i218, i218+7, std::greater<int>()) == i218+7)); + assert(std::is_heap(i219, i219+7, std::greater<int>()) == (std::is_heap_until(i219, i219+7, std::greater<int>()) == i219+7)); + assert(std::is_heap(i220, i220+7, std::greater<int>()) == (std::is_heap_until(i220, i220+7, std::greater<int>()) == i220+7)); + assert(std::is_heap(i221, i221+7, std::greater<int>()) == (std::is_heap_until(i221, i221+7, std::greater<int>()) == i221+7)); + assert(std::is_heap(i222, i222+7, std::greater<int>()) == (std::is_heap_until(i222, i222+7, std::greater<int>()) == i222+7)); + assert(std::is_heap(i223, i223+7, std::greater<int>()) == (std::is_heap_until(i223, i223+7, std::greater<int>()) == i223+7)); + assert(std::is_heap(i224, i224+7, std::greater<int>()) == (std::is_heap_until(i224, i224+7, std::greater<int>()) == i224+7)); + assert(std::is_heap(i225, i225+7, std::greater<int>()) == (std::is_heap_until(i225, i225+7, std::greater<int>()) == i225+7)); + assert(std::is_heap(i226, i226+7, std::greater<int>()) == (std::is_heap_until(i226, i226+7, std::greater<int>()) == i226+7)); + assert(std::is_heap(i227, i227+7, std::greater<int>()) == (std::is_heap_until(i227, i227+7, std::greater<int>()) == i227+7)); + assert(std::is_heap(i228, i228+7, std::greater<int>()) == (std::is_heap_until(i228, i228+7, std::greater<int>()) == i228+7)); + assert(std::is_heap(i229, i229+7, std::greater<int>()) == (std::is_heap_until(i229, i229+7, std::greater<int>()) == i229+7)); + assert(std::is_heap(i230, i230+7, std::greater<int>()) == (std::is_heap_until(i230, i230+7, std::greater<int>()) == i230+7)); + assert(std::is_heap(i231, i231+7, std::greater<int>()) == (std::is_heap_until(i231, i231+7, std::greater<int>()) == i231+7)); + assert(std::is_heap(i232, i232+7, std::greater<int>()) == (std::is_heap_until(i232, i232+7, std::greater<int>()) == i232+7)); + assert(std::is_heap(i233, i233+7, std::greater<int>()) == (std::is_heap_until(i233, i233+7, std::greater<int>()) == i233+7)); + assert(std::is_heap(i234, i234+7, std::greater<int>()) == (std::is_heap_until(i234, i234+7, std::greater<int>()) == i234+7)); + assert(std::is_heap(i235, i235+7, std::greater<int>()) == (std::is_heap_until(i235, i235+7, std::greater<int>()) == i235+7)); + assert(std::is_heap(i236, i236+7, std::greater<int>()) == (std::is_heap_until(i236, i236+7, std::greater<int>()) == i236+7)); + assert(std::is_heap(i237, i237+7, std::greater<int>()) == (std::is_heap_until(i237, i237+7, std::greater<int>()) == i237+7)); + assert(std::is_heap(i238, i238+7, std::greater<int>()) == (std::is_heap_until(i238, i238+7, std::greater<int>()) == i238+7)); + assert(std::is_heap(i239, i239+7, std::greater<int>()) == (std::is_heap_until(i239, i239+7, std::greater<int>()) == i239+7)); + assert(std::is_heap(i240, i240+7, std::greater<int>()) == (std::is_heap_until(i240, i240+7, std::greater<int>()) == i240+7)); + assert(std::is_heap(i241, i241+7, std::greater<int>()) == (std::is_heap_until(i241, i241+7, std::greater<int>()) == i241+7)); + assert(std::is_heap(i242, i242+7, std::greater<int>()) == (std::is_heap_until(i242, i242+7, std::greater<int>()) == i242+7)); + assert(std::is_heap(i243, i243+7, std::greater<int>()) == (std::is_heap_until(i243, i243+7, std::greater<int>()) == i243+7)); + assert(std::is_heap(i244, i244+7, std::greater<int>()) == (std::is_heap_until(i244, i244+7, std::greater<int>()) == i244+7)); + assert(std::is_heap(i245, i245+7, std::greater<int>()) == (std::is_heap_until(i245, i245+7, std::greater<int>()) == i245+7)); + assert(std::is_heap(i246, i246+7, std::greater<int>()) == (std::is_heap_until(i246, i246+7, std::greater<int>()) == i246+7)); +} + +int main() +{ + test(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_until.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_until.pass.cpp new file mode 100644 index 00000000000..082c0445182 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_until.pass.cpp @@ -0,0 +1,521 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires LessThanComparable<Iter::value_type> +// Iter +// is_heap_until(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +void test() +{ + int i1[] = {0, 0}; + assert(std::is_heap_until(i1, i1) == i1); + assert(std::is_heap_until(i1, i1+1) == i1+1); + int i2[] = {0, 1}; + int i3[] = {1, 0}; + assert(std::is_heap_until(i1, i1+2) == i1+2); + assert(std::is_heap_until(i2, i2+2) == i2+1); + assert(std::is_heap_until(i3, i3+2) == i3+2); + int i4[] = {0, 0, 0}; + int i5[] = {0, 0, 1}; + int i6[] = {0, 1, 0}; + int i7[] = {0, 1, 1}; + int i8[] = {1, 0, 0}; + int i9[] = {1, 0, 1}; + int i10[] = {1, 1, 0}; + assert(std::is_heap_until(i4, i4+3) == i4+3); + assert(std::is_heap_until(i5, i5+3) == i5+2); + assert(std::is_heap_until(i6, i6+3) == i6+1); + assert(std::is_heap_until(i7, i7+3) == i7+1); + assert(std::is_heap_until(i8, i8+3) == i8+3); + assert(std::is_heap_until(i9, i9+3) == i9+3); + assert(std::is_heap_until(i10, i10+3) == i10+3); + int i11[] = {0, 0, 0, 0}; + int i12[] = {0, 0, 0, 1}; + int i13[] = {0, 0, 1, 0}; + int i14[] = {0, 0, 1, 1}; + int i15[] = {0, 1, 0, 0}; + int i16[] = {0, 1, 0, 1}; + int i17[] = {0, 1, 1, 0}; + int i18[] = {0, 1, 1, 1}; + int i19[] = {1, 0, 0, 0}; + int i20[] = {1, 0, 0, 1}; + int i21[] = {1, 0, 1, 0}; + int i22[] = {1, 0, 1, 1}; + int i23[] = {1, 1, 0, 0}; + int i24[] = {1, 1, 0, 1}; + int i25[] = {1, 1, 1, 0}; + assert(std::is_heap_until(i11, i11+4) == i11+4); + assert(std::is_heap_until(i12, i12+4) == i12+3); + assert(std::is_heap_until(i13, i13+4) == i13+2); + assert(std::is_heap_until(i14, i14+4) == i14+2); + assert(std::is_heap_until(i15, i15+4) == i15+1); + assert(std::is_heap_until(i16, i16+4) == i16+1); + assert(std::is_heap_until(i17, i17+4) == i17+1); + assert(std::is_heap_until(i18, i18+4) == i18+1); + assert(std::is_heap_until(i19, i19+4) == i19+4); + assert(std::is_heap_until(i20, i20+4) == i20+3); + assert(std::is_heap_until(i21, i21+4) == i21+4); + assert(std::is_heap_until(i22, i22+4) == i22+3); + assert(std::is_heap_until(i23, i23+4) == i23+4); + assert(std::is_heap_until(i24, i24+4) == i24+4); + assert(std::is_heap_until(i25, i25+4) == i25+4); + int i26[] = {0, 0, 0, 0, 0}; + int i27[] = {0, 0, 0, 0, 1}; + int i28[] = {0, 0, 0, 1, 0}; + int i29[] = {0, 0, 0, 1, 1}; + int i30[] = {0, 0, 1, 0, 0}; + int i31[] = {0, 0, 1, 0, 1}; + int i32[] = {0, 0, 1, 1, 0}; + int i33[] = {0, 0, 1, 1, 1}; + int i34[] = {0, 1, 0, 0, 0}; + int i35[] = {0, 1, 0, 0, 1}; + int i36[] = {0, 1, 0, 1, 0}; + int i37[] = {0, 1, 0, 1, 1}; + int i38[] = {0, 1, 1, 0, 0}; + int i39[] = {0, 1, 1, 0, 1}; + int i40[] = {0, 1, 1, 1, 0}; + int i41[] = {0, 1, 1, 1, 1}; + int i42[] = {1, 0, 0, 0, 0}; + int i43[] = {1, 0, 0, 0, 1}; + int i44[] = {1, 0, 0, 1, 0}; + int i45[] = {1, 0, 0, 1, 1}; + int i46[] = {1, 0, 1, 0, 0}; + int i47[] = {1, 0, 1, 0, 1}; + int i48[] = {1, 0, 1, 1, 0}; + int i49[] = {1, 0, 1, 1, 1}; + int i50[] = {1, 1, 0, 0, 0}; + int i51[] = {1, 1, 0, 0, 1}; + int i52[] = {1, 1, 0, 1, 0}; + int i53[] = {1, 1, 0, 1, 1}; + int i54[] = {1, 1, 1, 0, 0}; + int i55[] = {1, 1, 1, 0, 1}; + int i56[] = {1, 1, 1, 1, 0}; + assert(std::is_heap_until(i26, i26+5) == i26+5); + assert(std::is_heap_until(i27, i27+5) == i27+4); + assert(std::is_heap_until(i28, i28+5) == i28+3); + assert(std::is_heap_until(i29, i29+5) == i29+3); + assert(std::is_heap_until(i30, i30+5) == i30+2); + assert(std::is_heap_until(i31, i31+5) == i31+2); + assert(std::is_heap_until(i32, i32+5) == i32+2); + assert(std::is_heap_until(i33, i33+5) == i33+2); + assert(std::is_heap_until(i34, i34+5) == i34+1); + assert(std::is_heap_until(i35, i35+5) == i35+1); + assert(std::is_heap_until(i36, i36+5) == i36+1); + assert(std::is_heap_until(i37, i37+5) == i37+1); + assert(std::is_heap_until(i38, i38+5) == i38+1); + assert(std::is_heap_until(i39, i39+5) == i39+1); + assert(std::is_heap_until(i40, i40+5) == i40+1); + assert(std::is_heap_until(i41, i41+5) == i41+1); + assert(std::is_heap_until(i42, i42+5) == i42+5); + assert(std::is_heap_until(i43, i43+5) == i43+4); + assert(std::is_heap_until(i44, i44+5) == i44+3); + assert(std::is_heap_until(i45, i45+5) == i45+3); + assert(std::is_heap_until(i46, i46+5) == i46+5); + assert(std::is_heap_until(i47, i47+5) == i47+4); + assert(std::is_heap_until(i48, i48+5) == i48+3); + assert(std::is_heap_until(i49, i49+5) == i49+3); + assert(std::is_heap_until(i50, i50+5) == i50+5); + assert(std::is_heap_until(i51, i51+5) == i51+5); + assert(std::is_heap_until(i52, i52+5) == i52+5); + assert(std::is_heap_until(i53, i53+5) == i53+5); + assert(std::is_heap_until(i54, i54+5) == i54+5); + assert(std::is_heap_until(i55, i55+5) == i55+5); + assert(std::is_heap_until(i56, i56+5) == i56+5); + int i57[] = {0, 0, 0, 0, 0, 0}; + int i58[] = {0, 0, 0, 0, 0, 1}; + int i59[] = {0, 0, 0, 0, 1, 0}; + int i60[] = {0, 0, 0, 0, 1, 1}; + int i61[] = {0, 0, 0, 1, 0, 0}; + int i62[] = {0, 0, 0, 1, 0, 1}; + int i63[] = {0, 0, 0, 1, 1, 0}; + int i64[] = {0, 0, 0, 1, 1, 1}; + int i65[] = {0, 0, 1, 0, 0, 0}; + int i66[] = {0, 0, 1, 0, 0, 1}; + int i67[] = {0, 0, 1, 0, 1, 0}; + int i68[] = {0, 0, 1, 0, 1, 1}; + int i69[] = {0, 0, 1, 1, 0, 0}; + int i70[] = {0, 0, 1, 1, 0, 1}; + int i71[] = {0, 0, 1, 1, 1, 0}; + int i72[] = {0, 0, 1, 1, 1, 1}; + int i73[] = {0, 1, 0, 0, 0, 0}; + int i74[] = {0, 1, 0, 0, 0, 1}; + int i75[] = {0, 1, 0, 0, 1, 0}; + int i76[] = {0, 1, 0, 0, 1, 1}; + int i77[] = {0, 1, 0, 1, 0, 0}; + int i78[] = {0, 1, 0, 1, 0, 1}; + int i79[] = {0, 1, 0, 1, 1, 0}; + int i80[] = {0, 1, 0, 1, 1, 1}; + int i81[] = {0, 1, 1, 0, 0, 0}; + int i82[] = {0, 1, 1, 0, 0, 1}; + int i83[] = {0, 1, 1, 0, 1, 0}; + int i84[] = {0, 1, 1, 0, 1, 1}; + int i85[] = {0, 1, 1, 1, 0, 0}; + int i86[] = {0, 1, 1, 1, 0, 1}; + int i87[] = {0, 1, 1, 1, 1, 0}; + int i88[] = {0, 1, 1, 1, 1, 1}; + int i89[] = {1, 0, 0, 0, 0, 0}; + int i90[] = {1, 0, 0, 0, 0, 1}; + int i91[] = {1, 0, 0, 0, 1, 0}; + int i92[] = {1, 0, 0, 0, 1, 1}; + int i93[] = {1, 0, 0, 1, 0, 0}; + int i94[] = {1, 0, 0, 1, 0, 1}; + int i95[] = {1, 0, 0, 1, 1, 0}; + int i96[] = {1, 0, 0, 1, 1, 1}; + int i97[] = {1, 0, 1, 0, 0, 0}; + int i98[] = {1, 0, 1, 0, 0, 1}; + int i99[] = {1, 0, 1, 0, 1, 0}; + int i100[] = {1, 0, 1, 0, 1, 1}; + int i101[] = {1, 0, 1, 1, 0, 0}; + int i102[] = {1, 0, 1, 1, 0, 1}; + int i103[] = {1, 0, 1, 1, 1, 0}; + int i104[] = {1, 0, 1, 1, 1, 1}; + int i105[] = {1, 1, 0, 0, 0, 0}; + int i106[] = {1, 1, 0, 0, 0, 1}; + int i107[] = {1, 1, 0, 0, 1, 0}; + int i108[] = {1, 1, 0, 0, 1, 1}; + int i109[] = {1, 1, 0, 1, 0, 0}; + int i110[] = {1, 1, 0, 1, 0, 1}; + int i111[] = {1, 1, 0, 1, 1, 0}; + int i112[] = {1, 1, 0, 1, 1, 1}; + int i113[] = {1, 1, 1, 0, 0, 0}; + int i114[] = {1, 1, 1, 0, 0, 1}; + int i115[] = {1, 1, 1, 0, 1, 0}; + int i116[] = {1, 1, 1, 0, 1, 1}; + int i117[] = {1, 1, 1, 1, 0, 0}; + int i118[] = {1, 1, 1, 1, 0, 1}; + int i119[] = {1, 1, 1, 1, 1, 0}; + assert(std::is_heap_until(i57, i57+6) == i57+6); + assert(std::is_heap_until(i58, i58+6) == i58+5); + assert(std::is_heap_until(i59, i59+6) == i59+4); + assert(std::is_heap_until(i60, i60+6) == i60+4); + assert(std::is_heap_until(i61, i61+6) == i61+3); + assert(std::is_heap_until(i62, i62+6) == i62+3); + assert(std::is_heap_until(i63, i63+6) == i63+3); + assert(std::is_heap_until(i64, i64+6) == i64+3); + assert(std::is_heap_until(i65, i65+6) == i65+2); + assert(std::is_heap_until(i66, i66+6) == i66+2); + assert(std::is_heap_until(i67, i67+6) == i67+2); + assert(std::is_heap_until(i68, i68+6) == i68+2); + assert(std::is_heap_until(i69, i69+6) == i69+2); + assert(std::is_heap_until(i70, i70+6) == i70+2); + assert(std::is_heap_until(i71, i71+6) == i71+2); + assert(std::is_heap_until(i72, i72+6) == i72+2); + assert(std::is_heap_until(i73, i73+6) == i73+1); + assert(std::is_heap_until(i74, i74+6) == i74+1); + assert(std::is_heap_until(i75, i75+6) == i75+1); + assert(std::is_heap_until(i76, i76+6) == i76+1); + assert(std::is_heap_until(i77, i77+6) == i77+1); + assert(std::is_heap_until(i78, i78+6) == i78+1); + assert(std::is_heap_until(i79, i79+6) == i79+1); + assert(std::is_heap_until(i80, i80+6) == i80+1); + assert(std::is_heap_until(i81, i81+6) == i81+1); + assert(std::is_heap_until(i82, i82+6) == i82+1); + assert(std::is_heap_until(i83, i83+6) == i83+1); + assert(std::is_heap_until(i84, i84+6) == i84+1); + assert(std::is_heap_until(i85, i85+6) == i85+1); + assert(std::is_heap_until(i86, i86+6) == i86+1); + assert(std::is_heap_until(i87, i87+6) == i87+1); + assert(std::is_heap_until(i88, i88+6) == i88+1); + assert(std::is_heap_until(i89, i89+6) == i89+6); + assert(std::is_heap_until(i90, i90+6) == i90+5); + assert(std::is_heap_until(i91, i91+6) == i91+4); + assert(std::is_heap_until(i92, i92+6) == i92+4); + assert(std::is_heap_until(i93, i93+6) == i93+3); + assert(std::is_heap_until(i94, i94+6) == i94+3); + assert(std::is_heap_until(i95, i95+6) == i95+3); + assert(std::is_heap_until(i96, i96+6) == i96+3); + assert(std::is_heap_until(i97, i97+6) == i97+6); + assert(std::is_heap_until(i98, i98+6) == i98+6); + assert(std::is_heap_until(i99, i99+6) == i99+4); + assert(std::is_heap_until(i100, i100+6) == i100+4); + assert(std::is_heap_until(i101, i101+6) == i101+3); + assert(std::is_heap_until(i102, i102+6) == i102+3); + assert(std::is_heap_until(i103, i103+6) == i103+3); + assert(std::is_heap_until(i104, i104+6) == i104+3); + assert(std::is_heap_until(i105, i105+6) == i105+6); + assert(std::is_heap_until(i106, i106+6) == i106+5); + assert(std::is_heap_until(i107, i107+6) == i107+6); + assert(std::is_heap_until(i108, i108+6) == i108+5); + assert(std::is_heap_until(i109, i109+6) == i109+6); + assert(std::is_heap_until(i110, i110+6) == i110+5); + assert(std::is_heap_until(i111, i111+6) == i111+6); + assert(std::is_heap_until(i112, i112+6) == i112+5); + assert(std::is_heap_until(i113, i113+6) == i113+6); + assert(std::is_heap_until(i114, i114+6) == i114+6); + assert(std::is_heap_until(i115, i115+6) == i115+6); + assert(std::is_heap_until(i116, i116+6) == i116+6); + assert(std::is_heap_until(i117, i117+6) == i117+6); + assert(std::is_heap_until(i118, i118+6) == i118+6); + assert(std::is_heap_until(i119, i119+6) == i119+6); + int i120[] = {0, 0, 0, 0, 0, 0, 0}; + int i121[] = {0, 0, 0, 0, 0, 0, 1}; + int i122[] = {0, 0, 0, 0, 0, 1, 0}; + int i123[] = {0, 0, 0, 0, 0, 1, 1}; + int i124[] = {0, 0, 0, 0, 1, 0, 0}; + int i125[] = {0, 0, 0, 0, 1, 0, 1}; + int i126[] = {0, 0, 0, 0, 1, 1, 0}; + int i127[] = {0, 0, 0, 0, 1, 1, 1}; + int i128[] = {0, 0, 0, 1, 0, 0, 0}; + int i129[] = {0, 0, 0, 1, 0, 0, 1}; + int i130[] = {0, 0, 0, 1, 0, 1, 0}; + int i131[] = {0, 0, 0, 1, 0, 1, 1}; + int i132[] = {0, 0, 0, 1, 1, 0, 0}; + int i133[] = {0, 0, 0, 1, 1, 0, 1}; + int i134[] = {0, 0, 0, 1, 1, 1, 0}; + int i135[] = {0, 0, 0, 1, 1, 1, 1}; + int i136[] = {0, 0, 1, 0, 0, 0, 0}; + int i137[] = {0, 0, 1, 0, 0, 0, 1}; + int i138[] = {0, 0, 1, 0, 0, 1, 0}; + int i139[] = {0, 0, 1, 0, 0, 1, 1}; + int i140[] = {0, 0, 1, 0, 1, 0, 0}; + int i141[] = {0, 0, 1, 0, 1, 0, 1}; + int i142[] = {0, 0, 1, 0, 1, 1, 0}; + int i143[] = {0, 0, 1, 0, 1, 1, 1}; + int i144[] = {0, 0, 1, 1, 0, 0, 0}; + int i145[] = {0, 0, 1, 1, 0, 0, 1}; + int i146[] = {0, 0, 1, 1, 0, 1, 0}; + int i147[] = {0, 0, 1, 1, 0, 1, 1}; + int i148[] = {0, 0, 1, 1, 1, 0, 0}; + int i149[] = {0, 0, 1, 1, 1, 0, 1}; + int i150[] = {0, 0, 1, 1, 1, 1, 0}; + int i151[] = {0, 0, 1, 1, 1, 1, 1}; + int i152[] = {0, 1, 0, 0, 0, 0, 0}; + int i153[] = {0, 1, 0, 0, 0, 0, 1}; + int i154[] = {0, 1, 0, 0, 0, 1, 0}; + int i155[] = {0, 1, 0, 0, 0, 1, 1}; + int i156[] = {0, 1, 0, 0, 1, 0, 0}; + int i157[] = {0, 1, 0, 0, 1, 0, 1}; + int i158[] = {0, 1, 0, 0, 1, 1, 0}; + int i159[] = {0, 1, 0, 0, 1, 1, 1}; + int i160[] = {0, 1, 0, 1, 0, 0, 0}; + int i161[] = {0, 1, 0, 1, 0, 0, 1}; + int i162[] = {0, 1, 0, 1, 0, 1, 0}; + int i163[] = {0, 1, 0, 1, 0, 1, 1}; + int i164[] = {0, 1, 0, 1, 1, 0, 0}; + int i165[] = {0, 1, 0, 1, 1, 0, 1}; + int i166[] = {0, 1, 0, 1, 1, 1, 0}; + int i167[] = {0, 1, 0, 1, 1, 1, 1}; + int i168[] = {0, 1, 1, 0, 0, 0, 0}; + int i169[] = {0, 1, 1, 0, 0, 0, 1}; + int i170[] = {0, 1, 1, 0, 0, 1, 0}; + int i171[] = {0, 1, 1, 0, 0, 1, 1}; + int i172[] = {0, 1, 1, 0, 1, 0, 0}; + int i173[] = {0, 1, 1, 0, 1, 0, 1}; + int i174[] = {0, 1, 1, 0, 1, 1, 0}; + int i175[] = {0, 1, 1, 0, 1, 1, 1}; + int i176[] = {0, 1, 1, 1, 0, 0, 0}; + int i177[] = {0, 1, 1, 1, 0, 0, 1}; + int i178[] = {0, 1, 1, 1, 0, 1, 0}; + int i179[] = {0, 1, 1, 1, 0, 1, 1}; + int i180[] = {0, 1, 1, 1, 1, 0, 0}; + int i181[] = {0, 1, 1, 1, 1, 0, 1}; + int i182[] = {0, 1, 1, 1, 1, 1, 0}; + int i183[] = {0, 1, 1, 1, 1, 1, 1}; + int i184[] = {1, 0, 0, 0, 0, 0, 0}; + int i185[] = {1, 0, 0, 0, 0, 0, 1}; + int i186[] = {1, 0, 0, 0, 0, 1, 0}; + int i187[] = {1, 0, 0, 0, 0, 1, 1}; + int i188[] = {1, 0, 0, 0, 1, 0, 0}; + int i189[] = {1, 0, 0, 0, 1, 0, 1}; + int i190[] = {1, 0, 0, 0, 1, 1, 0}; + int i191[] = {1, 0, 0, 0, 1, 1, 1}; + int i192[] = {1, 0, 0, 1, 0, 0, 0}; + int i193[] = {1, 0, 0, 1, 0, 0, 1}; + int i194[] = {1, 0, 0, 1, 0, 1, 0}; + int i195[] = {1, 0, 0, 1, 0, 1, 1}; + int i196[] = {1, 0, 0, 1, 1, 0, 0}; + int i197[] = {1, 0, 0, 1, 1, 0, 1}; + int i198[] = {1, 0, 0, 1, 1, 1, 0}; + int i199[] = {1, 0, 0, 1, 1, 1, 1}; + int i200[] = {1, 0, 1, 0, 0, 0, 0}; + int i201[] = {1, 0, 1, 0, 0, 0, 1}; + int i202[] = {1, 0, 1, 0, 0, 1, 0}; + int i203[] = {1, 0, 1, 0, 0, 1, 1}; + int i204[] = {1, 0, 1, 0, 1, 0, 0}; + int i205[] = {1, 0, 1, 0, 1, 0, 1}; + int i206[] = {1, 0, 1, 0, 1, 1, 0}; + int i207[] = {1, 0, 1, 0, 1, 1, 1}; + int i208[] = {1, 0, 1, 1, 0, 0, 0}; + int i209[] = {1, 0, 1, 1, 0, 0, 1}; + int i210[] = {1, 0, 1, 1, 0, 1, 0}; + int i211[] = {1, 0, 1, 1, 0, 1, 1}; + int i212[] = {1, 0, 1, 1, 1, 0, 0}; + int i213[] = {1, 0, 1, 1, 1, 0, 1}; + int i214[] = {1, 0, 1, 1, 1, 1, 0}; + int i215[] = {1, 0, 1, 1, 1, 1, 1}; + int i216[] = {1, 1, 0, 0, 0, 0, 0}; + int i217[] = {1, 1, 0, 0, 0, 0, 1}; + int i218[] = {1, 1, 0, 0, 0, 1, 0}; + int i219[] = {1, 1, 0, 0, 0, 1, 1}; + int i220[] = {1, 1, 0, 0, 1, 0, 0}; + int i221[] = {1, 1, 0, 0, 1, 0, 1}; + int i222[] = {1, 1, 0, 0, 1, 1, 0}; + int i223[] = {1, 1, 0, 0, 1, 1, 1}; + int i224[] = {1, 1, 0, 1, 0, 0, 0}; + int i225[] = {1, 1, 0, 1, 0, 0, 1}; + int i226[] = {1, 1, 0, 1, 0, 1, 0}; + int i227[] = {1, 1, 0, 1, 0, 1, 1}; + int i228[] = {1, 1, 0, 1, 1, 0, 0}; + int i229[] = {1, 1, 0, 1, 1, 0, 1}; + int i230[] = {1, 1, 0, 1, 1, 1, 0}; + int i231[] = {1, 1, 0, 1, 1, 1, 1}; + int i232[] = {1, 1, 1, 0, 0, 0, 0}; + int i233[] = {1, 1, 1, 0, 0, 0, 1}; + int i234[] = {1, 1, 1, 0, 0, 1, 0}; + int i235[] = {1, 1, 1, 0, 0, 1, 1}; + int i236[] = {1, 1, 1, 0, 1, 0, 0}; + int i237[] = {1, 1, 1, 0, 1, 0, 1}; + int i238[] = {1, 1, 1, 0, 1, 1, 0}; + int i239[] = {1, 1, 1, 0, 1, 1, 1}; + int i240[] = {1, 1, 1, 1, 0, 0, 0}; + int i241[] = {1, 1, 1, 1, 0, 0, 1}; + int i242[] = {1, 1, 1, 1, 0, 1, 0}; + int i243[] = {1, 1, 1, 1, 0, 1, 1}; + int i244[] = {1, 1, 1, 1, 1, 0, 0}; + int i245[] = {1, 1, 1, 1, 1, 0, 1}; + int i246[] = {1, 1, 1, 1, 1, 1, 0}; + assert(std::is_heap_until(i120, i120+7) == i120+7); + assert(std::is_heap_until(i121, i121+7) == i121+6); + assert(std::is_heap_until(i122, i122+7) == i122+5); + assert(std::is_heap_until(i123, i123+7) == i123+5); + assert(std::is_heap_until(i124, i124+7) == i124+4); + assert(std::is_heap_until(i125, i125+7) == i125+4); + assert(std::is_heap_until(i126, i126+7) == i126+4); + assert(std::is_heap_until(i127, i127+7) == i127+4); + assert(std::is_heap_until(i128, i128+7) == i128+3); + assert(std::is_heap_until(i129, i129+7) == i129+3); + assert(std::is_heap_until(i130, i130+7) == i130+3); + assert(std::is_heap_until(i131, i131+7) == i131+3); + assert(std::is_heap_until(i132, i132+7) == i132+3); + assert(std::is_heap_until(i133, i133+7) == i133+3); + assert(std::is_heap_until(i134, i134+7) == i134+3); + assert(std::is_heap_until(i135, i135+7) == i135+3); + assert(std::is_heap_until(i136, i136+7) == i136+2); + assert(std::is_heap_until(i137, i137+7) == i137+2); + assert(std::is_heap_until(i138, i138+7) == i138+2); + assert(std::is_heap_until(i139, i139+7) == i139+2); + assert(std::is_heap_until(i140, i140+7) == i140+2); + assert(std::is_heap_until(i141, i141+7) == i141+2); + assert(std::is_heap_until(i142, i142+7) == i142+2); + assert(std::is_heap_until(i143, i143+7) == i143+2); + assert(std::is_heap_until(i144, i144+7) == i144+2); + assert(std::is_heap_until(i145, i145+7) == i145+2); + assert(std::is_heap_until(i146, i146+7) == i146+2); + assert(std::is_heap_until(i147, i147+7) == i147+2); + assert(std::is_heap_until(i148, i148+7) == i148+2); + assert(std::is_heap_until(i149, i149+7) == i149+2); + assert(std::is_heap_until(i150, i150+7) == i150+2); + assert(std::is_heap_until(i151, i151+7) == i151+2); + assert(std::is_heap_until(i152, i152+7) == i152+1); + assert(std::is_heap_until(i153, i153+7) == i153+1); + assert(std::is_heap_until(i154, i154+7) == i154+1); + assert(std::is_heap_until(i155, i155+7) == i155+1); + assert(std::is_heap_until(i156, i156+7) == i156+1); + assert(std::is_heap_until(i157, i157+7) == i157+1); + assert(std::is_heap_until(i158, i158+7) == i158+1); + assert(std::is_heap_until(i159, i159+7) == i159+1); + assert(std::is_heap_until(i160, i160+7) == i160+1); + assert(std::is_heap_until(i161, i161+7) == i161+1); + assert(std::is_heap_until(i162, i162+7) == i162+1); + assert(std::is_heap_until(i163, i163+7) == i163+1); + assert(std::is_heap_until(i164, i164+7) == i164+1); + assert(std::is_heap_until(i165, i165+7) == i165+1); + assert(std::is_heap_until(i166, i166+7) == i166+1); + assert(std::is_heap_until(i167, i167+7) == i167+1); + assert(std::is_heap_until(i168, i168+7) == i168+1); + assert(std::is_heap_until(i169, i169+7) == i169+1); + assert(std::is_heap_until(i170, i170+7) == i170+1); + assert(std::is_heap_until(i171, i171+7) == i171+1); + assert(std::is_heap_until(i172, i172+7) == i172+1); + assert(std::is_heap_until(i173, i173+7) == i173+1); + assert(std::is_heap_until(i174, i174+7) == i174+1); + assert(std::is_heap_until(i175, i175+7) == i175+1); + assert(std::is_heap_until(i176, i176+7) == i176+1); + assert(std::is_heap_until(i177, i177+7) == i177+1); + assert(std::is_heap_until(i178, i178+7) == i178+1); + assert(std::is_heap_until(i179, i179+7) == i179+1); + assert(std::is_heap_until(i180, i180+7) == i180+1); + assert(std::is_heap_until(i181, i181+7) == i181+1); + assert(std::is_heap_until(i182, i182+7) == i182+1); + assert(std::is_heap_until(i183, i183+7) == i183+1); + assert(std::is_heap_until(i184, i184+7) == i184+7); + assert(std::is_heap_until(i185, i185+7) == i185+6); + assert(std::is_heap_until(i186, i186+7) == i186+5); + assert(std::is_heap_until(i187, i187+7) == i187+5); + assert(std::is_heap_until(i188, i188+7) == i188+4); + assert(std::is_heap_until(i189, i189+7) == i189+4); + assert(std::is_heap_until(i190, i190+7) == i190+4); + assert(std::is_heap_until(i191, i191+7) == i191+4); + assert(std::is_heap_until(i192, i192+7) == i192+3); + assert(std::is_heap_until(i193, i193+7) == i193+3); + assert(std::is_heap_until(i194, i194+7) == i194+3); + assert(std::is_heap_until(i195, i195+7) == i195+3); + assert(std::is_heap_until(i196, i196+7) == i196+3); + assert(std::is_heap_until(i197, i197+7) == i197+3); + assert(std::is_heap_until(i198, i198+7) == i198+3); + assert(std::is_heap_until(i199, i199+7) == i199+3); + assert(std::is_heap_until(i200, i200+7) == i200+7); + assert(std::is_heap_until(i201, i201+7) == i201+7); + assert(std::is_heap_until(i202, i202+7) == i202+7); + assert(std::is_heap_until(i203, i203+7) == i203+7); + assert(std::is_heap_until(i204, i204+7) == i204+4); + assert(std::is_heap_until(i205, i205+7) == i205+4); + assert(std::is_heap_until(i206, i206+7) == i206+4); + assert(std::is_heap_until(i207, i207+7) == i207+4); + assert(std::is_heap_until(i208, i208+7) == i208+3); + assert(std::is_heap_until(i209, i209+7) == i209+3); + assert(std::is_heap_until(i210, i210+7) == i210+3); + assert(std::is_heap_until(i211, i211+7) == i211+3); + assert(std::is_heap_until(i212, i212+7) == i212+3); + assert(std::is_heap_until(i213, i213+7) == i213+3); + assert(std::is_heap_until(i214, i214+7) == i214+3); + assert(std::is_heap_until(i215, i215+7) == i215+3); + assert(std::is_heap_until(i216, i216+7) == i216+7); + assert(std::is_heap_until(i217, i217+7) == i217+6); + assert(std::is_heap_until(i218, i218+7) == i218+5); + assert(std::is_heap_until(i219, i219+7) == i219+5); + assert(std::is_heap_until(i220, i220+7) == i220+7); + assert(std::is_heap_until(i221, i221+7) == i221+6); + assert(std::is_heap_until(i222, i222+7) == i222+5); + assert(std::is_heap_until(i223, i223+7) == i223+5); + assert(std::is_heap_until(i224, i224+7) == i224+7); + assert(std::is_heap_until(i225, i225+7) == i225+6); + assert(std::is_heap_until(i226, i226+7) == i226+5); + assert(std::is_heap_until(i227, i227+7) == i227+5); + assert(std::is_heap_until(i228, i228+7) == i228+7); + assert(std::is_heap_until(i229, i229+7) == i229+6); + assert(std::is_heap_until(i230, i230+7) == i230+5); + assert(std::is_heap_until(i231, i231+7) == i231+5); + assert(std::is_heap_until(i232, i232+7) == i232+7); + assert(std::is_heap_until(i233, i233+7) == i233+7); + assert(std::is_heap_until(i234, i234+7) == i234+7); + assert(std::is_heap_until(i235, i235+7) == i235+7); + assert(std::is_heap_until(i236, i236+7) == i236+7); + assert(std::is_heap_until(i237, i237+7) == i237+7); + assert(std::is_heap_until(i238, i238+7) == i238+7); + assert(std::is_heap_until(i239, i239+7) == i239+7); + assert(std::is_heap_until(i240, i240+7) == i240+7); + assert(std::is_heap_until(i241, i241+7) == i241+7); + assert(std::is_heap_until(i242, i242+7) == i242+7); + assert(std::is_heap_until(i243, i243+7) == i243+7); + assert(std::is_heap_until(i244, i244+7) == i244+7); + assert(std::is_heap_until(i245, i245+7) == i245+7); + assert(std::is_heap_until(i246, i246+7) == i246+7); +} + +int main() +{ + test(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_until_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_until_comp.pass.cpp new file mode 100644 index 00000000000..657c177fee5 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/is.heap/is_heap_until_comp.pass.cpp @@ -0,0 +1,522 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires CopyConstructible<Compare> +// Iter +// is_heap_until(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +void test() +{ + int i1[] = {0, 0}; + assert(std::is_heap_until(i1, i1, std::greater<int>()) == i1); + assert(std::is_heap_until(i1, i1+1, std::greater<int>()) == i1+1); + int i2[] = {0, 1}; + int i3[] = {1, 0}; + assert(std::is_heap_until(i1, i1+2, std::greater<int>()) == i1+2); + assert(std::is_heap_until(i2, i2+2, std::greater<int>()) == i2+2); + assert(std::is_heap_until(i3, i3+2, std::greater<int>()) == i3+1); + int i4[] = {0, 0, 0}; + int i5[] = {0, 0, 1}; + int i6[] = {0, 1, 0}; + int i7[] = {0, 1, 1}; + int i8[] = {1, 0, 0}; + int i9[] = {1, 0, 1}; + int i10[] = {1, 1, 0}; + assert(std::is_heap_until(i4, i4+3, std::greater<int>()) == i4+3); + assert(std::is_heap_until(i5, i5+3, std::greater<int>()) == i5+3); + assert(std::is_heap_until(i6, i6+3, std::greater<int>()) == i6+3); + assert(std::is_heap_until(i7, i7+3, std::greater<int>()) == i7+3); + assert(std::is_heap_until(i8, i8+3, std::greater<int>()) == i8+1); + assert(std::is_heap_until(i9, i9+3, std::greater<int>()) == i9+1); + assert(std::is_heap_until(i10, i10+3, std::greater<int>()) == i10+2); + int i11[] = {0, 0, 0, 0}; + int i12[] = {0, 0, 0, 1}; + int i13[] = {0, 0, 1, 0}; + int i14[] = {0, 0, 1, 1}; + int i15[] = {0, 1, 0, 0}; + int i16[] = {0, 1, 0, 1}; + int i17[] = {0, 1, 1, 0}; + int i18[] = {0, 1, 1, 1}; + int i19[] = {1, 0, 0, 0}; + int i20[] = {1, 0, 0, 1}; + int i21[] = {1, 0, 1, 0}; + int i22[] = {1, 0, 1, 1}; + int i23[] = {1, 1, 0, 0}; + int i24[] = {1, 1, 0, 1}; + int i25[] = {1, 1, 1, 0}; + assert(std::is_heap_until(i11, i11+4, std::greater<int>()) == i11+4); + assert(std::is_heap_until(i12, i12+4, std::greater<int>()) == i12+4); + assert(std::is_heap_until(i13, i13+4, std::greater<int>()) == i13+4); + assert(std::is_heap_until(i14, i14+4, std::greater<int>()) == i14+4); + assert(std::is_heap_until(i15, i15+4, std::greater<int>()) == i15+3); + assert(std::is_heap_until(i16, i16+4, std::greater<int>()) == i16+4); + assert(std::is_heap_until(i17, i17+4, std::greater<int>()) == i17+3); + assert(std::is_heap_until(i18, i18+4, std::greater<int>()) == i18+4); + assert(std::is_heap_until(i19, i19+4, std::greater<int>()) == i19+1); + assert(std::is_heap_until(i20, i20+4, std::greater<int>()) == i20+1); + assert(std::is_heap_until(i21, i21+4, std::greater<int>()) == i21+1); + assert(std::is_heap_until(i22, i22+4, std::greater<int>()) == i22+1); + assert(std::is_heap_until(i23, i23+4, std::greater<int>()) == i23+2); + assert(std::is_heap_until(i24, i24+4, std::greater<int>()) == i24+2); + assert(std::is_heap_until(i25, i25+4, std::greater<int>()) == i25+3); + int i26[] = {0, 0, 0, 0, 0}; + int i27[] = {0, 0, 0, 0, 1}; + int i28[] = {0, 0, 0, 1, 0}; + int i29[] = {0, 0, 0, 1, 1}; + int i30[] = {0, 0, 1, 0, 0}; + int i31[] = {0, 0, 1, 0, 1}; + int i32[] = {0, 0, 1, 1, 0}; + int i33[] = {0, 0, 1, 1, 1}; + int i34[] = {0, 1, 0, 0, 0}; + int i35[] = {0, 1, 0, 0, 1}; + int i36[] = {0, 1, 0, 1, 0}; + int i37[] = {0, 1, 0, 1, 1}; + int i38[] = {0, 1, 1, 0, 0}; + int i39[] = {0, 1, 1, 0, 1}; + int i40[] = {0, 1, 1, 1, 0}; + int i41[] = {0, 1, 1, 1, 1}; + int i42[] = {1, 0, 0, 0, 0}; + int i43[] = {1, 0, 0, 0, 1}; + int i44[] = {1, 0, 0, 1, 0}; + int i45[] = {1, 0, 0, 1, 1}; + int i46[] = {1, 0, 1, 0, 0}; + int i47[] = {1, 0, 1, 0, 1}; + int i48[] = {1, 0, 1, 1, 0}; + int i49[] = {1, 0, 1, 1, 1}; + int i50[] = {1, 1, 0, 0, 0}; + int i51[] = {1, 1, 0, 0, 1}; + int i52[] = {1, 1, 0, 1, 0}; + int i53[] = {1, 1, 0, 1, 1}; + int i54[] = {1, 1, 1, 0, 0}; + int i55[] = {1, 1, 1, 0, 1}; + int i56[] = {1, 1, 1, 1, 0}; + assert(std::is_heap_until(i26, i26+5, std::greater<int>()) == i26+5); + assert(std::is_heap_until(i27, i27+5, std::greater<int>()) == i27+5); + assert(std::is_heap_until(i28, i28+5, std::greater<int>()) == i28+5); + assert(std::is_heap_until(i29, i29+5, std::greater<int>()) == i29+5); + assert(std::is_heap_until(i30, i30+5, std::greater<int>()) == i30+5); + assert(std::is_heap_until(i31, i31+5, std::greater<int>()) == i31+5); + assert(std::is_heap_until(i32, i32+5, std::greater<int>()) == i32+5); + assert(std::is_heap_until(i33, i33+5, std::greater<int>()) == i33+5); + assert(std::is_heap_until(i34, i34+5, std::greater<int>()) == i34+3); + assert(std::is_heap_until(i35, i35+5, std::greater<int>()) == i35+3); + assert(std::is_heap_until(i36, i36+5, std::greater<int>()) == i36+4); + assert(std::is_heap_until(i37, i37+5, std::greater<int>()) == i37+5); + assert(std::is_heap_until(i38, i38+5, std::greater<int>()) == i38+3); + assert(std::is_heap_until(i39, i39+5, std::greater<int>()) == i39+3); + assert(std::is_heap_until(i40, i40+5, std::greater<int>()) == i40+4); + assert(std::is_heap_until(i41, i41+5, std::greater<int>()) == i41+5); + assert(std::is_heap_until(i42, i42+5, std::greater<int>()) == i42+1); + assert(std::is_heap_until(i43, i43+5, std::greater<int>()) == i43+1); + assert(std::is_heap_until(i44, i44+5, std::greater<int>()) == i44+1); + assert(std::is_heap_until(i45, i45+5, std::greater<int>()) == i45+1); + assert(std::is_heap_until(i46, i46+5, std::greater<int>()) == i46+1); + assert(std::is_heap_until(i47, i47+5, std::greater<int>()) == i47+1); + assert(std::is_heap_until(i48, i48+5, std::greater<int>()) == i48+1); + assert(std::is_heap_until(i49, i49+5, std::greater<int>()) == i49+1); + assert(std::is_heap_until(i50, i50+5, std::greater<int>()) == i50+2); + assert(std::is_heap_until(i51, i51+5, std::greater<int>()) == i51+2); + assert(std::is_heap_until(i52, i52+5, std::greater<int>()) == i52+2); + assert(std::is_heap_until(i53, i53+5, std::greater<int>()) == i53+2); + assert(std::is_heap_until(i54, i54+5, std::greater<int>()) == i54+3); + assert(std::is_heap_until(i55, i55+5, std::greater<int>()) == i55+3); + assert(std::is_heap_until(i56, i56+5, std::greater<int>()) == i56+4); + int i57[] = {0, 0, 0, 0, 0, 0}; + int i58[] = {0, 0, 0, 0, 0, 1}; + int i59[] = {0, 0, 0, 0, 1, 0}; + int i60[] = {0, 0, 0, 0, 1, 1}; + int i61[] = {0, 0, 0, 1, 0, 0}; + int i62[] = {0, 0, 0, 1, 0, 1}; + int i63[] = {0, 0, 0, 1, 1, 0}; + int i64[] = {0, 0, 0, 1, 1, 1}; + int i65[] = {0, 0, 1, 0, 0, 0}; + int i66[] = {0, 0, 1, 0, 0, 1}; + int i67[] = {0, 0, 1, 0, 1, 0}; + int i68[] = {0, 0, 1, 0, 1, 1}; + int i69[] = {0, 0, 1, 1, 0, 0}; + int i70[] = {0, 0, 1, 1, 0, 1}; + int i71[] = {0, 0, 1, 1, 1, 0}; + int i72[] = {0, 0, 1, 1, 1, 1}; + int i73[] = {0, 1, 0, 0, 0, 0}; + int i74[] = {0, 1, 0, 0, 0, 1}; + int i75[] = {0, 1, 0, 0, 1, 0}; + int i76[] = {0, 1, 0, 0, 1, 1}; + int i77[] = {0, 1, 0, 1, 0, 0}; + int i78[] = {0, 1, 0, 1, 0, 1}; + int i79[] = {0, 1, 0, 1, 1, 0}; + int i80[] = {0, 1, 0, 1, 1, 1}; + int i81[] = {0, 1, 1, 0, 0, 0}; + int i82[] = {0, 1, 1, 0, 0, 1}; + int i83[] = {0, 1, 1, 0, 1, 0}; + int i84[] = {0, 1, 1, 0, 1, 1}; + int i85[] = {0, 1, 1, 1, 0, 0}; + int i86[] = {0, 1, 1, 1, 0, 1}; + int i87[] = {0, 1, 1, 1, 1, 0}; + int i88[] = {0, 1, 1, 1, 1, 1}; + int i89[] = {1, 0, 0, 0, 0, 0}; + int i90[] = {1, 0, 0, 0, 0, 1}; + int i91[] = {1, 0, 0, 0, 1, 0}; + int i92[] = {1, 0, 0, 0, 1, 1}; + int i93[] = {1, 0, 0, 1, 0, 0}; + int i94[] = {1, 0, 0, 1, 0, 1}; + int i95[] = {1, 0, 0, 1, 1, 0}; + int i96[] = {1, 0, 0, 1, 1, 1}; + int i97[] = {1, 0, 1, 0, 0, 0}; + int i98[] = {1, 0, 1, 0, 0, 1}; + int i99[] = {1, 0, 1, 0, 1, 0}; + int i100[] = {1, 0, 1, 0, 1, 1}; + int i101[] = {1, 0, 1, 1, 0, 0}; + int i102[] = {1, 0, 1, 1, 0, 1}; + int i103[] = {1, 0, 1, 1, 1, 0}; + int i104[] = {1, 0, 1, 1, 1, 1}; + int i105[] = {1, 1, 0, 0, 0, 0}; + int i106[] = {1, 1, 0, 0, 0, 1}; + int i107[] = {1, 1, 0, 0, 1, 0}; + int i108[] = {1, 1, 0, 0, 1, 1}; + int i109[] = {1, 1, 0, 1, 0, 0}; + int i110[] = {1, 1, 0, 1, 0, 1}; + int i111[] = {1, 1, 0, 1, 1, 0}; + int i112[] = {1, 1, 0, 1, 1, 1}; + int i113[] = {1, 1, 1, 0, 0, 0}; + int i114[] = {1, 1, 1, 0, 0, 1}; + int i115[] = {1, 1, 1, 0, 1, 0}; + int i116[] = {1, 1, 1, 0, 1, 1}; + int i117[] = {1, 1, 1, 1, 0, 0}; + int i118[] = {1, 1, 1, 1, 0, 1}; + int i119[] = {1, 1, 1, 1, 1, 0}; + assert(std::is_heap_until(i57, i57+6, std::greater<int>()) == i57+6); + assert(std::is_heap_until(i58, i58+6, std::greater<int>()) == i58+6); + assert(std::is_heap_until(i59, i59+6, std::greater<int>()) == i59+6); + assert(std::is_heap_until(i60, i60+6, std::greater<int>()) == i60+6); + assert(std::is_heap_until(i61, i61+6, std::greater<int>()) == i61+6); + assert(std::is_heap_until(i62, i62+6, std::greater<int>()) == i62+6); + assert(std::is_heap_until(i63, i63+6, std::greater<int>()) == i63+6); + assert(std::is_heap_until(i64, i64+6, std::greater<int>()) == i64+6); + assert(std::is_heap_until(i65, i65+6, std::greater<int>()) == i65+5); + assert(std::is_heap_until(i66, i66+6, std::greater<int>()) == i66+6); + assert(std::is_heap_until(i67, i67+6, std::greater<int>()) == i67+5); + assert(std::is_heap_until(i68, i68+6, std::greater<int>()) == i68+6); + assert(std::is_heap_until(i69, i69+6, std::greater<int>()) == i69+5); + assert(std::is_heap_until(i70, i70+6, std::greater<int>()) == i70+6); + assert(std::is_heap_until(i71, i71+6, std::greater<int>()) == i71+5); + assert(std::is_heap_until(i72, i72+6, std::greater<int>()) == i72+6); + assert(std::is_heap_until(i73, i73+6, std::greater<int>()) == i73+3); + assert(std::is_heap_until(i74, i74+6, std::greater<int>()) == i74+3); + assert(std::is_heap_until(i75, i75+6, std::greater<int>()) == i75+3); + assert(std::is_heap_until(i76, i76+6, std::greater<int>()) == i76+3); + assert(std::is_heap_until(i77, i77+6, std::greater<int>()) == i77+4); + assert(std::is_heap_until(i78, i78+6, std::greater<int>()) == i78+4); + assert(std::is_heap_until(i79, i79+6, std::greater<int>()) == i79+6); + assert(std::is_heap_until(i80, i80+6, std::greater<int>()) == i80+6); + assert(std::is_heap_until(i81, i81+6, std::greater<int>()) == i81+3); + assert(std::is_heap_until(i82, i82+6, std::greater<int>()) == i82+3); + assert(std::is_heap_until(i83, i83+6, std::greater<int>()) == i83+3); + assert(std::is_heap_until(i84, i84+6, std::greater<int>()) == i84+3); + assert(std::is_heap_until(i85, i85+6, std::greater<int>()) == i85+4); + assert(std::is_heap_until(i86, i86+6, std::greater<int>()) == i86+4); + assert(std::is_heap_until(i87, i87+6, std::greater<int>()) == i87+5); + assert(std::is_heap_until(i88, i88+6, std::greater<int>()) == i88+6); + assert(std::is_heap_until(i89, i89+6, std::greater<int>()) == i89+1); + assert(std::is_heap_until(i90, i90+6, std::greater<int>()) == i90+1); + assert(std::is_heap_until(i91, i91+6, std::greater<int>()) == i91+1); + assert(std::is_heap_until(i92, i92+6, std::greater<int>()) == i92+1); + assert(std::is_heap_until(i93, i93+6, std::greater<int>()) == i93+1); + assert(std::is_heap_until(i94, i94+6, std::greater<int>()) == i94+1); + assert(std::is_heap_until(i95, i95+6, std::greater<int>()) == i95+1); + assert(std::is_heap_until(i96, i96+6, std::greater<int>()) == i96+1); + assert(std::is_heap_until(i97, i97+6, std::greater<int>()) == i97+1); + assert(std::is_heap_until(i98, i98+6, std::greater<int>()) == i98+1); + assert(std::is_heap_until(i99, i99+6, std::greater<int>()) == i99+1); + assert(std::is_heap_until(i100, i100+6, std::greater<int>()) == i100+1); + assert(std::is_heap_until(i101, i101+6, std::greater<int>()) == i101+1); + assert(std::is_heap_until(i102, i102+6, std::greater<int>()) == i102+1); + assert(std::is_heap_until(i103, i103+6, std::greater<int>()) == i103+1); + assert(std::is_heap_until(i104, i104+6, std::greater<int>()) == i104+1); + assert(std::is_heap_until(i105, i105+6, std::greater<int>()) == i105+2); + assert(std::is_heap_until(i106, i106+6, std::greater<int>()) == i106+2); + assert(std::is_heap_until(i107, i107+6, std::greater<int>()) == i107+2); + assert(std::is_heap_until(i108, i108+6, std::greater<int>()) == i108+2); + assert(std::is_heap_until(i109, i109+6, std::greater<int>()) == i109+2); + assert(std::is_heap_until(i110, i110+6, std::greater<int>()) == i110+2); + assert(std::is_heap_until(i111, i111+6, std::greater<int>()) == i111+2); + assert(std::is_heap_until(i112, i112+6, std::greater<int>()) == i112+2); + assert(std::is_heap_until(i113, i113+6, std::greater<int>()) == i113+3); + assert(std::is_heap_until(i114, i114+6, std::greater<int>()) == i114+3); + assert(std::is_heap_until(i115, i115+6, std::greater<int>()) == i115+3); + assert(std::is_heap_until(i116, i116+6, std::greater<int>()) == i116+3); + assert(std::is_heap_until(i117, i117+6, std::greater<int>()) == i117+4); + assert(std::is_heap_until(i118, i118+6, std::greater<int>()) == i118+4); + assert(std::is_heap_until(i119, i119+6, std::greater<int>()) == i119+5); + int i120[] = {0, 0, 0, 0, 0, 0, 0}; + int i121[] = {0, 0, 0, 0, 0, 0, 1}; + int i122[] = {0, 0, 0, 0, 0, 1, 0}; + int i123[] = {0, 0, 0, 0, 0, 1, 1}; + int i124[] = {0, 0, 0, 0, 1, 0, 0}; + int i125[] = {0, 0, 0, 0, 1, 0, 1}; + int i126[] = {0, 0, 0, 0, 1, 1, 0}; + int i127[] = {0, 0, 0, 0, 1, 1, 1}; + int i128[] = {0, 0, 0, 1, 0, 0, 0}; + int i129[] = {0, 0, 0, 1, 0, 0, 1}; + int i130[] = {0, 0, 0, 1, 0, 1, 0}; + int i131[] = {0, 0, 0, 1, 0, 1, 1}; + int i132[] = {0, 0, 0, 1, 1, 0, 0}; + int i133[] = {0, 0, 0, 1, 1, 0, 1}; + int i134[] = {0, 0, 0, 1, 1, 1, 0}; + int i135[] = {0, 0, 0, 1, 1, 1, 1}; + int i136[] = {0, 0, 1, 0, 0, 0, 0}; + int i137[] = {0, 0, 1, 0, 0, 0, 1}; + int i138[] = {0, 0, 1, 0, 0, 1, 0}; + int i139[] = {0, 0, 1, 0, 0, 1, 1}; + int i140[] = {0, 0, 1, 0, 1, 0, 0}; + int i141[] = {0, 0, 1, 0, 1, 0, 1}; + int i142[] = {0, 0, 1, 0, 1, 1, 0}; + int i143[] = {0, 0, 1, 0, 1, 1, 1}; + int i144[] = {0, 0, 1, 1, 0, 0, 0}; + int i145[] = {0, 0, 1, 1, 0, 0, 1}; + int i146[] = {0, 0, 1, 1, 0, 1, 0}; + int i147[] = {0, 0, 1, 1, 0, 1, 1}; + int i148[] = {0, 0, 1, 1, 1, 0, 0}; + int i149[] = {0, 0, 1, 1, 1, 0, 1}; + int i150[] = {0, 0, 1, 1, 1, 1, 0}; + int i151[] = {0, 0, 1, 1, 1, 1, 1}; + int i152[] = {0, 1, 0, 0, 0, 0, 0}; + int i153[] = {0, 1, 0, 0, 0, 0, 1}; + int i154[] = {0, 1, 0, 0, 0, 1, 0}; + int i155[] = {0, 1, 0, 0, 0, 1, 1}; + int i156[] = {0, 1, 0, 0, 1, 0, 0}; + int i157[] = {0, 1, 0, 0, 1, 0, 1}; + int i158[] = {0, 1, 0, 0, 1, 1, 0}; + int i159[] = {0, 1, 0, 0, 1, 1, 1}; + int i160[] = {0, 1, 0, 1, 0, 0, 0}; + int i161[] = {0, 1, 0, 1, 0, 0, 1}; + int i162[] = {0, 1, 0, 1, 0, 1, 0}; + int i163[] = {0, 1, 0, 1, 0, 1, 1}; + int i164[] = {0, 1, 0, 1, 1, 0, 0}; + int i165[] = {0, 1, 0, 1, 1, 0, 1}; + int i166[] = {0, 1, 0, 1, 1, 1, 0}; + int i167[] = {0, 1, 0, 1, 1, 1, 1}; + int i168[] = {0, 1, 1, 0, 0, 0, 0}; + int i169[] = {0, 1, 1, 0, 0, 0, 1}; + int i170[] = {0, 1, 1, 0, 0, 1, 0}; + int i171[] = {0, 1, 1, 0, 0, 1, 1}; + int i172[] = {0, 1, 1, 0, 1, 0, 0}; + int i173[] = {0, 1, 1, 0, 1, 0, 1}; + int i174[] = {0, 1, 1, 0, 1, 1, 0}; + int i175[] = {0, 1, 1, 0, 1, 1, 1}; + int i176[] = {0, 1, 1, 1, 0, 0, 0}; + int i177[] = {0, 1, 1, 1, 0, 0, 1}; + int i178[] = {0, 1, 1, 1, 0, 1, 0}; + int i179[] = {0, 1, 1, 1, 0, 1, 1}; + int i180[] = {0, 1, 1, 1, 1, 0, 0}; + int i181[] = {0, 1, 1, 1, 1, 0, 1}; + int i182[] = {0, 1, 1, 1, 1, 1, 0}; + int i183[] = {0, 1, 1, 1, 1, 1, 1}; + int i184[] = {1, 0, 0, 0, 0, 0, 0}; + int i185[] = {1, 0, 0, 0, 0, 0, 1}; + int i186[] = {1, 0, 0, 0, 0, 1, 0}; + int i187[] = {1, 0, 0, 0, 0, 1, 1}; + int i188[] = {1, 0, 0, 0, 1, 0, 0}; + int i189[] = {1, 0, 0, 0, 1, 0, 1}; + int i190[] = {1, 0, 0, 0, 1, 1, 0}; + int i191[] = {1, 0, 0, 0, 1, 1, 1}; + int i192[] = {1, 0, 0, 1, 0, 0, 0}; + int i193[] = {1, 0, 0, 1, 0, 0, 1}; + int i194[] = {1, 0, 0, 1, 0, 1, 0}; + int i195[] = {1, 0, 0, 1, 0, 1, 1}; + int i196[] = {1, 0, 0, 1, 1, 0, 0}; + int i197[] = {1, 0, 0, 1, 1, 0, 1}; + int i198[] = {1, 0, 0, 1, 1, 1, 0}; + int i199[] = {1, 0, 0, 1, 1, 1, 1}; + int i200[] = {1, 0, 1, 0, 0, 0, 0}; + int i201[] = {1, 0, 1, 0, 0, 0, 1}; + int i202[] = {1, 0, 1, 0, 0, 1, 0}; + int i203[] = {1, 0, 1, 0, 0, 1, 1}; + int i204[] = {1, 0, 1, 0, 1, 0, 0}; + int i205[] = {1, 0, 1, 0, 1, 0, 1}; + int i206[] = {1, 0, 1, 0, 1, 1, 0}; + int i207[] = {1, 0, 1, 0, 1, 1, 1}; + int i208[] = {1, 0, 1, 1, 0, 0, 0}; + int i209[] = {1, 0, 1, 1, 0, 0, 1}; + int i210[] = {1, 0, 1, 1, 0, 1, 0}; + int i211[] = {1, 0, 1, 1, 0, 1, 1}; + int i212[] = {1, 0, 1, 1, 1, 0, 0}; + int i213[] = {1, 0, 1, 1, 1, 0, 1}; + int i214[] = {1, 0, 1, 1, 1, 1, 0}; + int i215[] = {1, 0, 1, 1, 1, 1, 1}; + int i216[] = {1, 1, 0, 0, 0, 0, 0}; + int i217[] = {1, 1, 0, 0, 0, 0, 1}; + int i218[] = {1, 1, 0, 0, 0, 1, 0}; + int i219[] = {1, 1, 0, 0, 0, 1, 1}; + int i220[] = {1, 1, 0, 0, 1, 0, 0}; + int i221[] = {1, 1, 0, 0, 1, 0, 1}; + int i222[] = {1, 1, 0, 0, 1, 1, 0}; + int i223[] = {1, 1, 0, 0, 1, 1, 1}; + int i224[] = {1, 1, 0, 1, 0, 0, 0}; + int i225[] = {1, 1, 0, 1, 0, 0, 1}; + int i226[] = {1, 1, 0, 1, 0, 1, 0}; + int i227[] = {1, 1, 0, 1, 0, 1, 1}; + int i228[] = {1, 1, 0, 1, 1, 0, 0}; + int i229[] = {1, 1, 0, 1, 1, 0, 1}; + int i230[] = {1, 1, 0, 1, 1, 1, 0}; + int i231[] = {1, 1, 0, 1, 1, 1, 1}; + int i232[] = {1, 1, 1, 0, 0, 0, 0}; + int i233[] = {1, 1, 1, 0, 0, 0, 1}; + int i234[] = {1, 1, 1, 0, 0, 1, 0}; + int i235[] = {1, 1, 1, 0, 0, 1, 1}; + int i236[] = {1, 1, 1, 0, 1, 0, 0}; + int i237[] = {1, 1, 1, 0, 1, 0, 1}; + int i238[] = {1, 1, 1, 0, 1, 1, 0}; + int i239[] = {1, 1, 1, 0, 1, 1, 1}; + int i240[] = {1, 1, 1, 1, 0, 0, 0}; + int i241[] = {1, 1, 1, 1, 0, 0, 1}; + int i242[] = {1, 1, 1, 1, 0, 1, 0}; + int i243[] = {1, 1, 1, 1, 0, 1, 1}; + int i244[] = {1, 1, 1, 1, 1, 0, 0}; + int i245[] = {1, 1, 1, 1, 1, 0, 1}; + int i246[] = {1, 1, 1, 1, 1, 1, 0}; + assert(std::is_heap_until(i120, i120+7, std::greater<int>()) == i120+7); + assert(std::is_heap_until(i121, i121+7, std::greater<int>()) == i121+7); + assert(std::is_heap_until(i122, i122+7, std::greater<int>()) == i122+7); + assert(std::is_heap_until(i123, i123+7, std::greater<int>()) == i123+7); + assert(std::is_heap_until(i124, i124+7, std::greater<int>()) == i124+7); + assert(std::is_heap_until(i125, i125+7, std::greater<int>()) == i125+7); + assert(std::is_heap_until(i126, i126+7, std::greater<int>()) == i126+7); + assert(std::is_heap_until(i127, i127+7, std::greater<int>()) == i127+7); + assert(std::is_heap_until(i128, i128+7, std::greater<int>()) == i128+7); + assert(std::is_heap_until(i129, i129+7, std::greater<int>()) == i129+7); + assert(std::is_heap_until(i130, i130+7, std::greater<int>()) == i130+7); + assert(std::is_heap_until(i131, i131+7, std::greater<int>()) == i131+7); + assert(std::is_heap_until(i132, i132+7, std::greater<int>()) == i132+7); + assert(std::is_heap_until(i133, i133+7, std::greater<int>()) == i133+7); + assert(std::is_heap_until(i134, i134+7, std::greater<int>()) == i134+7); + assert(std::is_heap_until(i135, i135+7, std::greater<int>()) == i135+7); + assert(std::is_heap_until(i136, i136+7, std::greater<int>()) == i136+5); + assert(std::is_heap_until(i137, i137+7, std::greater<int>()) == i137+5); + assert(std::is_heap_until(i138, i138+7, std::greater<int>()) == i138+6); + assert(std::is_heap_until(i139, i139+7, std::greater<int>()) == i139+7); + assert(std::is_heap_until(i140, i140+7, std::greater<int>()) == i140+5); + assert(std::is_heap_until(i141, i141+7, std::greater<int>()) == i141+5); + assert(std::is_heap_until(i142, i142+7, std::greater<int>()) == i142+6); + assert(std::is_heap_until(i143, i143+7, std::greater<int>()) == i143+7); + assert(std::is_heap_until(i144, i144+7, std::greater<int>()) == i144+5); + assert(std::is_heap_until(i145, i145+7, std::greater<int>()) == i145+5); + assert(std::is_heap_until(i146, i146+7, std::greater<int>()) == i146+6); + assert(std::is_heap_until(i147, i147+7, std::greater<int>()) == i147+7); + assert(std::is_heap_until(i148, i148+7, std::greater<int>()) == i148+5); + assert(std::is_heap_until(i149, i149+7, std::greater<int>()) == i149+5); + assert(std::is_heap_until(i150, i150+7, std::greater<int>()) == i150+6); + assert(std::is_heap_until(i151, i151+7, std::greater<int>()) == i151+7); + assert(std::is_heap_until(i152, i152+7, std::greater<int>()) == i152+3); + assert(std::is_heap_until(i153, i153+7, std::greater<int>()) == i153+3); + assert(std::is_heap_until(i154, i154+7, std::greater<int>()) == i154+3); + assert(std::is_heap_until(i155, i155+7, std::greater<int>()) == i155+3); + assert(std::is_heap_until(i156, i156+7, std::greater<int>()) == i156+3); + assert(std::is_heap_until(i157, i157+7, std::greater<int>()) == i157+3); + assert(std::is_heap_until(i158, i158+7, std::greater<int>()) == i158+3); + assert(std::is_heap_until(i159, i159+7, std::greater<int>()) == i159+3); + assert(std::is_heap_until(i160, i160+7, std::greater<int>()) == i160+4); + assert(std::is_heap_until(i161, i161+7, std::greater<int>()) == i161+4); + assert(std::is_heap_until(i162, i162+7, std::greater<int>()) == i162+4); + assert(std::is_heap_until(i163, i163+7, std::greater<int>()) == i163+4); + assert(std::is_heap_until(i164, i164+7, std::greater<int>()) == i164+7); + assert(std::is_heap_until(i165, i165+7, std::greater<int>()) == i165+7); + assert(std::is_heap_until(i166, i166+7, std::greater<int>()) == i166+7); + assert(std::is_heap_until(i167, i167+7, std::greater<int>()) == i167+7); + assert(std::is_heap_until(i168, i168+7, std::greater<int>()) == i168+3); + assert(std::is_heap_until(i169, i169+7, std::greater<int>()) == i169+3); + assert(std::is_heap_until(i170, i170+7, std::greater<int>()) == i170+3); + assert(std::is_heap_until(i171, i171+7, std::greater<int>()) == i171+3); + assert(std::is_heap_until(i172, i172+7, std::greater<int>()) == i172+3); + assert(std::is_heap_until(i173, i173+7, std::greater<int>()) == i173+3); + assert(std::is_heap_until(i174, i174+7, std::greater<int>()) == i174+3); + assert(std::is_heap_until(i175, i175+7, std::greater<int>()) == i175+3); + assert(std::is_heap_until(i176, i176+7, std::greater<int>()) == i176+4); + assert(std::is_heap_until(i177, i177+7, std::greater<int>()) == i177+4); + assert(std::is_heap_until(i178, i178+7, std::greater<int>()) == i178+4); + assert(std::is_heap_until(i179, i179+7, std::greater<int>()) == i179+4); + assert(std::is_heap_until(i180, i180+7, std::greater<int>()) == i180+5); + assert(std::is_heap_until(i181, i181+7, std::greater<int>()) == i181+5); + assert(std::is_heap_until(i182, i182+7, std::greater<int>()) == i182+6); + assert(std::is_heap_until(i183, i183+7, std::greater<int>()) == i183+7); + assert(std::is_heap_until(i184, i184+7, std::greater<int>()) == i184+1); + assert(std::is_heap_until(i185, i185+7, std::greater<int>()) == i185+1); + assert(std::is_heap_until(i186, i186+7, std::greater<int>()) == i186+1); + assert(std::is_heap_until(i187, i187+7, std::greater<int>()) == i187+1); + assert(std::is_heap_until(i188, i188+7, std::greater<int>()) == i188+1); + assert(std::is_heap_until(i189, i189+7, std::greater<int>()) == i189+1); + assert(std::is_heap_until(i190, i190+7, std::greater<int>()) == i190+1); + assert(std::is_heap_until(i191, i191+7, std::greater<int>()) == i191+1); + assert(std::is_heap_until(i192, i192+7, std::greater<int>()) == i192+1); + assert(std::is_heap_until(i193, i193+7, std::greater<int>()) == i193+1); + assert(std::is_heap_until(i194, i194+7, std::greater<int>()) == i194+1); + assert(std::is_heap_until(i195, i195+7, std::greater<int>()) == i195+1); + assert(std::is_heap_until(i196, i196+7, std::greater<int>()) == i196+1); + assert(std::is_heap_until(i197, i197+7, std::greater<int>()) == i197+1); + assert(std::is_heap_until(i198, i198+7, std::greater<int>()) == i198+1); + assert(std::is_heap_until(i199, i199+7, std::greater<int>()) == i199+1); + assert(std::is_heap_until(i200, i200+7, std::greater<int>()) == i200+1); + assert(std::is_heap_until(i201, i201+7, std::greater<int>()) == i201+1); + assert(std::is_heap_until(i202, i202+7, std::greater<int>()) == i202+1); + assert(std::is_heap_until(i203, i203+7, std::greater<int>()) == i203+1); + assert(std::is_heap_until(i204, i204+7, std::greater<int>()) == i204+1); + assert(std::is_heap_until(i205, i205+7, std::greater<int>()) == i205+1); + assert(std::is_heap_until(i206, i206+7, std::greater<int>()) == i206+1); + assert(std::is_heap_until(i207, i207+7, std::greater<int>()) == i207+1); + assert(std::is_heap_until(i208, i208+7, std::greater<int>()) == i208+1); + assert(std::is_heap_until(i209, i209+7, std::greater<int>()) == i209+1); + assert(std::is_heap_until(i210, i210+7, std::greater<int>()) == i210+1); + assert(std::is_heap_until(i211, i211+7, std::greater<int>()) == i211+1); + assert(std::is_heap_until(i212, i212+7, std::greater<int>()) == i212+1); + assert(std::is_heap_until(i213, i213+7, std::greater<int>()) == i213+1); + assert(std::is_heap_until(i214, i214+7, std::greater<int>()) == i214+1); + assert(std::is_heap_until(i215, i215+7, std::greater<int>()) == i215+1); + assert(std::is_heap_until(i216, i216+7, std::greater<int>()) == i216+2); + assert(std::is_heap_until(i217, i217+7, std::greater<int>()) == i217+2); + assert(std::is_heap_until(i218, i218+7, std::greater<int>()) == i218+2); + assert(std::is_heap_until(i219, i219+7, std::greater<int>()) == i219+2); + assert(std::is_heap_until(i220, i220+7, std::greater<int>()) == i220+2); + assert(std::is_heap_until(i221, i221+7, std::greater<int>()) == i221+2); + assert(std::is_heap_until(i222, i222+7, std::greater<int>()) == i222+2); + assert(std::is_heap_until(i223, i223+7, std::greater<int>()) == i223+2); + assert(std::is_heap_until(i224, i224+7, std::greater<int>()) == i224+2); + assert(std::is_heap_until(i225, i225+7, std::greater<int>()) == i225+2); + assert(std::is_heap_until(i226, i226+7, std::greater<int>()) == i226+2); + assert(std::is_heap_until(i227, i227+7, std::greater<int>()) == i227+2); + assert(std::is_heap_until(i228, i228+7, std::greater<int>()) == i228+2); + assert(std::is_heap_until(i229, i229+7, std::greater<int>()) == i229+2); + assert(std::is_heap_until(i230, i230+7, std::greater<int>()) == i230+2); + assert(std::is_heap_until(i231, i231+7, std::greater<int>()) == i231+2); + assert(std::is_heap_until(i232, i232+7, std::greater<int>()) == i232+3); + assert(std::is_heap_until(i233, i233+7, std::greater<int>()) == i233+3); + assert(std::is_heap_until(i234, i234+7, std::greater<int>()) == i234+3); + assert(std::is_heap_until(i235, i235+7, std::greater<int>()) == i235+3); + assert(std::is_heap_until(i236, i236+7, std::greater<int>()) == i236+3); + assert(std::is_heap_until(i237, i237+7, std::greater<int>()) == i237+3); + assert(std::is_heap_until(i238, i238+7, std::greater<int>()) == i238+3); + assert(std::is_heap_until(i239, i239+7, std::greater<int>()) == i239+3); + assert(std::is_heap_until(i240, i240+7, std::greater<int>()) == i240+4); + assert(std::is_heap_until(i241, i241+7, std::greater<int>()) == i241+4); + assert(std::is_heap_until(i242, i242+7, std::greater<int>()) == i242+4); + assert(std::is_heap_until(i243, i243+7, std::greater<int>()) == i243+4); + assert(std::is_heap_until(i244, i244+7, std::greater<int>()) == i244+5); + assert(std::is_heap_until(i245, i245+7, std::greater<int>()) == i245+5); + assert(std::is_heap_until(i246, i246+7, std::greater<int>()) == i246+6); +} + +int main() +{ + test(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/make.heap/make_heap.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/make.heap/make_heap.pass.cpp new file mode 100644 index 00000000000..51b912768f3 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/make.heap/make_heap.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> && LessThanComparable<Iter::value_type> +// void +// make_heap(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +void test(unsigned N) +{ + int* ia = new int [N]; + for (int i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N); + assert(std::is_heap(ia, ia+N)); + delete [] ia; +} + +int main() +{ + test(0); + test(1); + test(2); + test(3); + test(10); + test(1000); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/make.heap/make_heap_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/make.heap/make_heap_comp.pass.cpp new file mode 100644 index 00000000000..4cde1a7d32e --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/make.heap/make_heap_comp.pass.cpp @@ -0,0 +1,101 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires ShuffleIterator<Iter> && CopyConstructible<Compare> +// void +// make_heap(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "counting_predicates.hpp" + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +void test(unsigned N) +{ + int* ia = new int [N]; + { + for (int i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N, std::greater<int>()); + assert(std::is_heap(ia, ia+N, std::greater<int>())); + } + +// Ascending + { + binary_counting_predicate<std::greater<int>, int, int> pred ((std::greater<int>())); + for (int i = 0; i < N; ++i) + ia[i] = i; + std::make_heap(ia, ia+N, std::ref(pred)); + assert(pred.count() <= 3*N); + assert(std::is_heap(ia, ia+N, pred)); + } + +// Descending + { + binary_counting_predicate<std::greater<int>, int, int> pred ((std::greater<int>())); + for (int i = 0; i < N; ++i) + ia[N-1-i] = i; + std::make_heap(ia, ia+N, std::ref(pred)); + assert(pred.count() <= 3*N); + assert(std::is_heap(ia, ia+N, pred)); + } + +// Random + { + binary_counting_predicate<std::greater<int>, int, int> pred ((std::greater<int>())); + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N, std::ref(pred)); + assert(pred.count() <= 3*N); + assert(std::is_heap(ia, ia+N, pred)); + } + + delete [] ia; +} + +int main() +{ + test(0); + test(1); + test(2); + test(3); + test(10); + test(1000); + test(10000); + test(100000); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + const int N = 1000; + std::unique_ptr<int>* ia = new std::unique_ptr<int> [N]; + for (int i = 0; i < N; ++i) + ia[i].reset(new int(i)); + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N, indirect_less()); + assert(std::is_heap(ia, ia+N, indirect_less())); + delete [] ia; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/nothing_to_do.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..b58f5c55b64 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/pop.heap/pop_heap.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/pop.heap/pop_heap.pass.cpp new file mode 100644 index 00000000000..823985df6ca --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/pop.heap/pop_heap.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> && LessThanComparable<Iter::value_type> +// void +// pop_heap(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +void test(unsigned N) +{ + int* ia = new int [N]; + for (int i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N); + for (int i = N; i > 0; --i) + { + std::pop_heap(ia, ia+i); + assert(std::is_heap(ia, ia+i-1)); + } + std::pop_heap(ia, ia); + delete [] ia; +} + +int main() +{ + test(1000); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/pop.heap/pop_heap_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/pop.heap/pop_heap_comp.pass.cpp new file mode 100644 index 00000000000..1db4428a1c1 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/pop.heap/pop_heap_comp.pass.cpp @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires ShuffleIterator<Iter> && CopyConstructible<Compare> +// void +// pop_heap(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +void test(unsigned N) +{ + int* ia = new int [N]; + for (int i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N, std::greater<int>()); + for (int i = N; i > 0; --i) + { + std::pop_heap(ia, ia+i, std::greater<int>()); + assert(std::is_heap(ia, ia+i-1, std::greater<int>())); + } + std::pop_heap(ia, ia, std::greater<int>()); + delete [] ia; +} + +int main() +{ + test(1000); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + const int N = 1000; + std::unique_ptr<int>* ia = new std::unique_ptr<int> [N]; + for (int i = 0; i < N; ++i) + ia[i].reset(new int(i)); + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N, indirect_less()); + for (int i = N; i > 0; --i) + { + std::pop_heap(ia, ia+i, indirect_less()); + assert(std::is_heap(ia, ia+i-1, indirect_less())); + } + delete [] ia; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/push.heap/push_heap.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/push.heap/push_heap.pass.cpp new file mode 100644 index 00000000000..0fc50a81207 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/push.heap/push_heap.pass.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> +// && LessThanComparable<Iter::value_type> +// void +// push_heap(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +void test(unsigned N) +{ + int* ia = new int [N]; + for (int i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + for (int i = 0; i <= N; ++i) + { + std::push_heap(ia, ia+i); + assert(std::is_heap(ia, ia+i)); + } + delete [] ia; +} + +int main() +{ + test(1000); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/push.heap/push_heap_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/push.heap/push_heap_comp.pass.cpp new file mode 100644 index 00000000000..217217b38ee --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/push.heap/push_heap_comp.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> +// && LessThanComparable<Iter::value_type> +// void +// push_heap(Iter first, Iter last); + +#include <algorithm> +#include <functional> +#include <cassert> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +void test(unsigned N) +{ + int* ia = new int [N]; + for (int i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + for (int i = 0; i <= N; ++i) + { + std::push_heap(ia, ia+i, std::greater<int>()); + assert(std::is_heap(ia, ia+i, std::greater<int>())); + } + delete [] ia; +} + +int main() +{ + test(1000); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + const int N = 1000; + std::unique_ptr<int>* ia = new std::unique_ptr<int> [N]; + for (int i = 0; i < N; ++i) + ia[i].reset(new int(i)); + std::random_shuffle(ia, ia+N); + for (int i = 0; i <= N; ++i) + { + std::push_heap(ia, ia+i, indirect_less()); + assert(std::is_heap(ia, ia+i, indirect_less())); + } + delete [] ia; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/sort.heap/sort_heap.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/sort.heap/sort_heap.pass.cpp new file mode 100644 index 00000000000..4a08f111e6d --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/sort.heap/sort_heap.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> && LessThanComparable<Iter::value_type> +// void +// sort_heap(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +void test(unsigned N) +{ + int* ia = new int [N]; + for (int i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N); + std::sort_heap(ia, ia+N); + assert(std::is_sorted(ia, ia+N)); + delete [] ia; +} + +int main() +{ + test(0); + test(1); + test(2); + test(3); + test(10); + test(1000); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/sort.heap/sort_heap_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/sort.heap/sort_heap_comp.pass.cpp new file mode 100644 index 00000000000..7d3e2d57015 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/sort.heap/sort_heap_comp.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires ShuffleIterator<Iter> && CopyConstructible<Compare> +// void +// sort_heap(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +void test(unsigned N) +{ + int* ia = new int [N]; + for (int i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N, std::greater<int>()); + std::sort_heap(ia, ia+N, std::greater<int>()); + assert(std::is_sorted(ia, ia+N, std::greater<int>())); + delete [] ia; +} + +int main() +{ + test(0); + test(1); + test(2); + test(3); + test(10); + test(1000); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + const int N = 1000; + std::unique_ptr<int>* ia = new std::unique_ptr<int> [N]; + for (int i = 0; i < N; ++i) + ia[i].reset(new int(i)); + std::random_shuffle(ia, ia+N); + std::make_heap(ia, ia+N, indirect_less()); + std::sort_heap(ia, ia+N, indirect_less()); + assert(std::is_sorted(ia, ia+N, indirect_less())); + delete [] ia; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.lex.comparison/lexicographical_compare.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.lex.comparison/lexicographical_compare.pass.cpp new file mode 100644 index 00000000000..71dfeefe7e4 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.lex.comparison/lexicographical_compare.pass.cpp @@ -0,0 +1,69 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator Iter1, InputIterator Iter2> +// requires HasLess<Iter1::value_type, Iter2::value_type> +// && HasLess<Iter2::value_type, Iter1::value_type> +// bool +// lexicographical_compare(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2> +void +test() +{ + int ia[] = {1, 2, 3, 4}; + const unsigned sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {1, 2, 3}; + assert(!std::lexicographical_compare(Iter1(ia), Iter1(ia+sa), Iter2(ib), Iter2(ib+2))); + assert( std::lexicographical_compare(Iter1(ib), Iter1(ib+2), Iter2(ia), Iter2(ia+sa))); + assert(!std::lexicographical_compare(Iter1(ia), Iter1(ia+sa), Iter2(ib), Iter2(ib+3))); + assert( std::lexicographical_compare(Iter1(ib), Iter1(ib+3), Iter2(ia), Iter2(ia+sa))); + assert( std::lexicographical_compare(Iter1(ia), Iter1(ia+sa), Iter2(ib+1), Iter2(ib+3))); + assert(!std::lexicographical_compare(Iter1(ib+1), Iter1(ib+3), Iter2(ia), Iter2(ia+sa))); +} + +int main() +{ + test<input_iterator<const int*>, input_iterator<const int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*> >(); + test<input_iterator<const int*>, const int*>(); + + test<forward_iterator<const int*>, input_iterator<const int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*> >(); + test<forward_iterator<const int*>, const int*>(); + + test<bidirectional_iterator<const int*>, input_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, const int*>(); + + test<random_access_iterator<const int*>, input_iterator<const int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*> >(); + test<random_access_iterator<const int*>, const int*>(); + + test<const int*, input_iterator<const int*> >(); + test<const int*, forward_iterator<const int*> >(); + test<const int*, bidirectional_iterator<const int*> >(); + test<const int*, random_access_iterator<const int*> >(); + test<const int*, const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.lex.comparison/lexicographical_compare_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.lex.comparison/lexicographical_compare_comp.pass.cpp new file mode 100644 index 00000000000..c1851560ef2 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.lex.comparison/lexicographical_compare_comp.pass.cpp @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator Iter1, InputIterator Iter2, CopyConstructible Compare> +// requires Predicate<Compare, Iter1::value_type, Iter2::value_type> +// && Predicate<Compare, Iter2::value_type, Iter1::value_type> +// bool +// lexicographical_compare(Iter1 first1, Iter1 last1, +// Iter2 first2, Iter2 last2, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2> +void +test() +{ + int ia[] = {1, 2, 3, 4}; + const unsigned sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {1, 2, 3}; + typedef std::greater<int> C; + C c; + assert(!std::lexicographical_compare(Iter1(ia), Iter1(ia+sa), Iter2(ib), Iter2(ib+2), c)); + assert( std::lexicographical_compare(Iter1(ib), Iter1(ib+2), Iter2(ia), Iter2(ia+sa), c)); + assert(!std::lexicographical_compare(Iter1(ia), Iter1(ia+sa), Iter2(ib), Iter2(ib+3), c)); + assert( std::lexicographical_compare(Iter1(ib), Iter1(ib+3), Iter2(ia), Iter2(ia+sa), c)); + assert(!std::lexicographical_compare(Iter1(ia), Iter1(ia+sa), Iter2(ib+1), Iter2(ib+3), c)); + assert( std::lexicographical_compare(Iter1(ib+1), Iter1(ib+3), Iter2(ia), Iter2(ia+sa), c)); +} + +int main() +{ + test<input_iterator<const int*>, input_iterator<const int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*> >(); + test<input_iterator<const int*>, const int*>(); + + test<forward_iterator<const int*>, input_iterator<const int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*> >(); + test<forward_iterator<const int*>, const int*>(); + + test<bidirectional_iterator<const int*>, input_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, const int*>(); + + test<random_access_iterator<const int*>, input_iterator<const int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*> >(); + test<random_access_iterator<const int*>, const int*>(); + + test<const int*, input_iterator<const int*> >(); + test<const int*, forward_iterator<const int*> >(); + test<const int*, bidirectional_iterator<const int*> >(); + test<const int*, random_access_iterator<const int*> >(); + test<const int*, const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge.pass.cpp new file mode 100644 index 00000000000..01db088aa43 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge.pass.cpp @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// 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" + +template <class Iter> +void +test_one(unsigned N, unsigned M) +{ + assert(M <= N); + int* ia = new int[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*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp new file mode 100644 index 00000000000..8da8dfee719 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.merge/inplace_merge_comp.pass.cpp @@ -0,0 +1,112 @@ +//===----------------------------------------------------------------------===// +// +// 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> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#include "test_iterators.h" + +template <class Iter> +void +test_one(unsigned N, unsigned M) +{ + assert(M <= N); + int* ia = new int[N]; + for (unsigned i = 0; i < N; ++i) + ia[i] = i; + std::random_shuffle(ia, ia+N); + std::sort(ia, ia+M, std::greater<int>()); + std::sort(ia+M, ia+N, std::greater<int>()); + std::inplace_merge(Iter(ia), Iter(ia+M), Iter(ia+N), std::greater<int>()); + if(N > 0) + { + assert(ia[0] == N-1); + assert(ia[N-1] == 0); + assert(std::is_sorted(ia, ia+N, std::greater<int>())); + } + 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*>(); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + 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 // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge.pass.cpp new file mode 100644 index 00000000000..de96c419c4e --- /dev/null +++ b/libcxx/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/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp new file mode 100644 index 00000000000..69bcaf1198b --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.merge/merge_comp.pass.cpp @@ -0,0 +1,229 @@ +//===----------------------------------------------------------------------===// +// +// 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" + +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); + OutIter r = std::merge(InIter1(ia), InIter1(ia+N), + InIter2(ib), InIter2(ib+N), OutIter(ic), std::greater<int>()); + 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>())); + 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>()); + OutIter r = std::merge(InIter1(ia), InIter1(ia+N), + InIter2(ib), InIter2(ib+N), OutIter(ic), std::greater<int>()); + 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>())); + 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/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max.pass.cpp new file mode 100644 index 00000000000..c560c22f2d7 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max.pass.cpp @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// 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<LessThanComparable T> +// const T& +// max(const T& a, const T& b); + +#include <algorithm> +#include <cassert> + +template <class T> +void +test(const T& a, const T& b, const T& x) +{ + assert(&std::max(a, b) == &x); +} + +int main() +{ + { + int x = 0; + int y = 0; + test(x, y, x); + test(y, x, y); + } + { + int x = 0; + int y = 1; + test(x, y, y); + test(y, x, y); + } + { + int x = 1; + int y = 0; + test(x, y, x); + test(y, x, x); + } +#if _LIBCPP_STD_VER > 11 + { + constexpr int x = 1; + constexpr int y = 0; + static_assert(std::max(x, y) == x, "" ); + static_assert(std::max(y, x) == x, "" ); + } +#endif +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_comp.pass.cpp new file mode 100644 index 00000000000..95241af5006 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_comp.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// 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<class T, StrictWeakOrder<auto, T> Compare> +// requires !SameType<T, Compare> && CopyConstructible<Compare> +// const T& +// max(const T& a, const T& b, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +template <class T, class C> +void +test(const T& a, const T& b, C c, const T& x) +{ + assert(&std::max(a, b, c) == &x); +} + +int main() +{ + { + int x = 0; + int y = 0; + test(x, y, std::greater<int>(), x); + test(y, x, std::greater<int>(), y); + } + { + int x = 0; + int y = 1; + test(x, y, std::greater<int>(), x); + test(y, x, std::greater<int>(), x); + } + { + int x = 1; + int y = 0; + test(x, y, std::greater<int>(), y); + test(y, x, std::greater<int>(), y); + } +#if _LIBCPP_STD_VER > 11 + { + constexpr int x = 1; + constexpr int y = 0; + static_assert(std::max(x, y, std::greater<int>()) == y, "" ); + static_assert(std::max(y, x, std::greater<int>()) == y, "" ); + } +#endif +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_element.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_element.pass.cpp new file mode 100644 index 00000000000..2788b193200 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_element.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter> +// requires LessThanComparable<Iter::value_type> +// Iter +// max_element(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test(Iter first, Iter last) +{ + Iter i = std::max_element(first, last); + if (first != last) + { + for (Iter j = first; j != last; ++j) + assert(!(*i < *j)); + } + else + assert(i == last); +} + +template <class Iter> +void +test(unsigned N) +{ + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = i; + std::random_shuffle(a, a+N); + test(Iter(a), Iter(a+N)); + delete [] a; +} + +template <class Iter> +void +test() +{ + test<Iter>(0); + test<Iter>(1); + test<Iter>(2); + test<Iter>(3); + test<Iter>(10); + test<Iter>(1000); +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_element_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_element_comp.pass.cpp new file mode 100644 index 00000000000..74e9fe6027f --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_element_comp.pass.cpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires CopyConstructible<Compare> +// Iter +// max_element(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test(Iter first, Iter last) +{ + Iter i = std::max_element(first, last, std::greater<int>()); + if (first != last) + { + for (Iter j = first; j != last; ++j) + assert(!std::greater<int>()(*i, *j)); + } + else + assert(i == last); +} + +template <class Iter> +void +test(unsigned N) +{ + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = i; + std::random_shuffle(a, a+N); + test(Iter(a), Iter(a+N)); + delete [] a; +} + +template <class Iter> +void +test() +{ + test<Iter>(0); + test<Iter>(1); + test<Iter>(2); + test<Iter>(3); + test<Iter>(10); + test<Iter>(1000); +} + +template <class Iter, class Pred> +void test_eq0(Iter first, Iter last, Pred p) +{ + assert(first == std::max_element(first, last, p)); +} + +void test_eq() +{ + const size_t N = 10; + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = 10; // all the same + test_eq0(a, a+N, std::less<int>()); + test_eq0(a, a+N, std::greater<int>()); + delete [] a; +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); + test_eq(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_init_list.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_init_list.pass.cpp new file mode 100644 index 00000000000..0438412d236 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_init_list.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// 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 <class T> +// T +// max(initializer_list<T> t); + +#include <algorithm> +#include <cassert> + +int main() +{ +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + int i = std::max({2, 3, 1}); + assert(i == 3); + i = std::max({2, 1, 3}); + assert(i == 3); + i = std::max({3, 1, 2}); + assert(i == 3); + i = std::max({3, 2, 1}); + assert(i == 3); + i = std::max({1, 2, 3}); + assert(i == 3); + i = std::max({1, 3, 2}); + assert(i == 3); +#if _LIBCPP_STD_VER > 11 + { + static_assert(std::max({1, 3, 2}) == 3, ""); + static_assert(std::max({2, 1, 3}) == 3, ""); + static_assert(std::max({3, 2, 1}) == 3, ""); + } +#endif +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_init_list_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_init_list_comp.pass.cpp new file mode 100644 index 00000000000..4dd47a73ef3 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/max_init_list_comp.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// 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<class T, class Compare> +// T +// max(initializer_list<T> t, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +int main() +{ +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + int i = std::max({2, 3, 1}, std::greater<int>()); + assert(i == 1); + i = std::max({2, 1, 3}, std::greater<int>()); + assert(i == 1); + i = std::max({3, 1, 2}, std::greater<int>()); + assert(i == 1); + i = std::max({3, 2, 1}, std::greater<int>()); + assert(i == 1); + i = std::max({1, 2, 3}, std::greater<int>()); + assert(i == 1); + i = std::max({1, 3, 2}, std::greater<int>()); + assert(i == 1); +#if _LIBCPP_STD_VER > 11 + { + static_assert(std::max({1, 3, 2}, std::greater<int>()) == 1, ""); + static_assert(std::max({2, 1, 3}, std::greater<int>()) == 1, ""); + static_assert(std::max({3, 2, 1}, std::greater<int>()) == 1, ""); + } +#endif +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min.pass.cpp new file mode 100644 index 00000000000..bbbd97bc5a4 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min.pass.cpp @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// 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<LessThanComparable T> +// const T& +// min(const T& a, const T& b); + +#include <algorithm> +#include <cassert> + +template <class T> +void +test(const T& a, const T& b, const T& x) +{ + assert(&std::min(a, b) == &x); +} + +int main() +{ + { + int x = 0; + int y = 0; + test(x, y, x); + test(y, x, y); + } + { + int x = 0; + int y = 1; + test(x, y, x); + test(y, x, x); + } + { + int x = 1; + int y = 0; + test(x, y, y); + test(y, x, y); + } +#if _LIBCPP_STD_VER > 11 + { + constexpr int x = 1; + constexpr int y = 0; + static_assert(std::min(x, y) == y, "" ); + static_assert(std::min(y, x) == y, "" ); + } +#endif +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_comp.pass.cpp new file mode 100644 index 00000000000..4ef705e7771 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_comp.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// 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<class T, StrictWeakOrder<auto, T> Compare> +// requires !SameType<T, Compare> && CopyConstructible<Compare> +// const T& +// min(const T& a, const T& b, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +template <class T, class C> +void +test(const T& a, const T& b, C c, const T& x) +{ + assert(&std::min(a, b, c) == &x); +} + +int main() +{ + { + int x = 0; + int y = 0; + test(x, y, std::greater<int>(), x); + test(y, x, std::greater<int>(), y); + } + { + int x = 0; + int y = 1; + test(x, y, std::greater<int>(), y); + test(y, x, std::greater<int>(), y); + } + { + int x = 1; + int y = 0; + test(x, y, std::greater<int>(), x); + test(y, x, std::greater<int>(), x); + } +#if _LIBCPP_STD_VER > 11 + { + constexpr int x = 1; + constexpr int y = 0; + static_assert(std::min(x, y, std::greater<int>()) == x, "" ); + static_assert(std::min(y, x, std::greater<int>()) == x, "" ); + } +#endif +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_element.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_element.pass.cpp new file mode 100644 index 00000000000..fd41f7a9ad7 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_element.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter> +// requires LessThanComparable<Iter::value_type> +// Iter +// min_element(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test(Iter first, Iter last) +{ + Iter i = std::min_element(first, last); + if (first != last) + { + for (Iter j = first; j != last; ++j) + assert(!(*j < *i)); + } + else + assert(i == last); +} + +template <class Iter> +void +test(unsigned N) +{ + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = i; + std::random_shuffle(a, a+N); + test(Iter(a), Iter(a+N)); + delete [] a; +} + +template <class Iter> +void +test() +{ + test<Iter>(0); + test<Iter>(1); + test<Iter>(2); + test<Iter>(3); + test<Iter>(10); + test<Iter>(1000); +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_element_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_element_comp.pass.cpp new file mode 100644 index 00000000000..2b5fdb1e0bb --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_element_comp.pass.cpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires CopyConstructible<Compare> +// Iter +// min_element(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test(Iter first, Iter last) +{ + Iter i = std::min_element(first, last, std::greater<int>()); + if (first != last) + { + for (Iter j = first; j != last; ++j) + assert(!std::greater<int>()(*j, *i)); + } + else + assert(i == last); +} + +template <class Iter> +void +test(unsigned N) +{ + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = i; + std::random_shuffle(a, a+N); + test(Iter(a), Iter(a+N)); + delete [] a; +} + +template <class Iter> +void +test() +{ + test<Iter>(0); + test<Iter>(1); + test<Iter>(2); + test<Iter>(3); + test<Iter>(10); + test<Iter>(1000); +} + +template <class Iter, class Pred> +void test_eq0(Iter first, Iter last, Pred p) +{ + assert(first == std::min_element(first, last, p)); +} + +void test_eq() +{ + const size_t N = 10; + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = 10; // all the same + test_eq0(a, a+N, std::less<int>()); + test_eq0(a, a+N, std::greater<int>()); + delete [] a; +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); + test_eq(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_init_list.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_init_list.pass.cpp new file mode 100644 index 00000000000..eed4ebd4575 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_init_list.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// 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<class T> +// T +// min(initializer_list<T> t); + +#include <algorithm> +#include <cassert> + +int main() +{ +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + int i = std::min({2, 3, 1}); + assert(i == 1); + i = std::min({2, 1, 3}); + assert(i == 1); + i = std::min({3, 1, 2}); + assert(i == 1); + i = std::min({3, 2, 1}); + assert(i == 1); + i = std::min({1, 2, 3}); + assert(i == 1); + i = std::min({1, 3, 2}); + assert(i == 1); +#if _LIBCPP_STD_VER > 11 + { + static_assert(std::min({1, 3, 2}) == 1, ""); + static_assert(std::min({2, 1, 3}) == 1, ""); + static_assert(std::min({3, 2, 1}) == 1, ""); + } +#endif +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_init_list_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_init_list_comp.pass.cpp new file mode 100644 index 00000000000..5e0301b657b --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/min_init_list_comp.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// 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<class T, class Compare> +// T +// min(initializer_list<T> t, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +int main() +{ +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + int i = std::min({2, 3, 1}, std::greater<int>()); + assert(i == 3); + i = std::min({2, 1, 3}, std::greater<int>()); + assert(i == 3); + i = std::min({3, 1, 2}, std::greater<int>()); + assert(i == 3); + i = std::min({3, 2, 1}, std::greater<int>()); + assert(i == 3); + i = std::min({1, 2, 3}, std::greater<int>()); + assert(i == 3); + i = std::min({1, 3, 2}, std::greater<int>()); + assert(i == 3); +#if _LIBCPP_STD_VER > 11 + { + static_assert(std::min({1, 3, 2}, std::greater<int>()) == 3, ""); + static_assert(std::min({2, 1, 3}, std::greater<int>()) == 3, ""); + static_assert(std::min({3, 2, 1}, std::greater<int>()) == 3, ""); + } +#endif +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax.pass.cpp new file mode 100644 index 00000000000..6ac972a2547 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax.pass.cpp @@ -0,0 +1,62 @@ +//===----------------------------------------------------------------------===// +// +// 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<LessThanComparable T> +// pair<const T&, const T&> +// minmax(const T& a, const T& b); + +#include <algorithm> +#include <cassert> + +template <class T> +void +test(const T& a, const T& b, const T& x, const T& y) +{ + std::pair<const T&, const T&> p = std::minmax(a, b); + assert(&p.first == &x); + assert(&p.second == &y); +} + +int main() +{ + { + int x = 0; + int y = 0; + test(x, y, x, y); + test(y, x, y, x); + } + { + int x = 0; + int y = 1; + test(x, y, x, y); + test(y, x, x, y); + } + { + int x = 1; + int y = 0; + test(x, y, y, x); + test(y, x, y, x); + } +#if _LIBCPP_STD_VER > 11 + { +// Note that you can't take a reference to a local var, since +// its address is not a compile-time constant. + constexpr static int x = 1; + constexpr static int y = 0; + constexpr auto p1 = std::minmax (x, y); + static_assert(p1.first == y, ""); + static_assert(p1.second == x, ""); + constexpr auto p2 = std::minmax (y, x); + static_assert(p2.first == y, ""); + static_assert(p2.second == x, ""); + } +#endif +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_comp.pass.cpp new file mode 100644 index 00000000000..771c8f84a74 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_comp.pass.cpp @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// 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<class T, StrictWeakOrder<auto, T> Compare> +// requires !SameType<T, Compare> && CopyConstructible<Compare> +// pair<const T&, const T&> +// minmax(const T& a, const T& b, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +template <class T, class C> +void +test(const T& a, const T& b, C c, const T& x, const T& y) +{ + std::pair<const T&, const T&> p = std::minmax(a, b, c); + assert(&p.first == &x); + assert(&p.second == &y); +} + + +int main() +{ + { + int x = 0; + int y = 0; + test(x, y, std::greater<int>(), x, y); + test(y, x, std::greater<int>(), y, x); + } + { + int x = 0; + int y = 1; + test(x, y, std::greater<int>(), y, x); + test(y, x, std::greater<int>(), y, x); + } + { + int x = 1; + int y = 0; + test(x, y, std::greater<int>(), x, y); + test(y, x, std::greater<int>(), x, y); + } +#if _LIBCPP_STD_VER > 11 + { +// Note that you can't take a reference to a local var, since +// its address is not a compile-time constant. + constexpr static int x = 1; + constexpr static int y = 0; + constexpr auto p1 = std::minmax(x, y, std::greater<>()); + static_assert(p1.first == x, ""); + static_assert(p1.second == y, ""); + constexpr auto p2 = std::minmax(y, x, std::greater<>()); + static_assert(p2.first == x, ""); + static_assert(p2.second == y, ""); + } +#endif +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_element.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_element.pass.cpp new file mode 100644 index 00000000000..6cdb87dedb4 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_element.pass.cpp @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter> +// requires LessThanComparable<Iter::value_type> +// pair<Iter, Iter> +// minmax_element(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test(Iter first, Iter last) +{ + std::pair<Iter, Iter> p = std::minmax_element(first, last); + if (first != last) + { + for (Iter j = first; j != last; ++j) + { + assert(!(*j < *p.first)); + assert(!(*p.second < *j)); + } + } + else + { + assert(p.first == last); + assert(p.second == last); + } +} + +template <class Iter> +void +test(unsigned N) +{ + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = i; + std::random_shuffle(a, a+N); + test(Iter(a), Iter(a+N)); + delete [] a; +} + +template <class Iter> +void +test() +{ + test<Iter>(0); + test<Iter>(1); + test<Iter>(2); + test<Iter>(3); + test<Iter>(10); + test<Iter>(1000); + { + const unsigned N = 100; + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = 5; + std::random_shuffle(a, a+N); + std::pair<Iter, Iter> p = std::minmax_element(Iter(a), Iter(a+N)); + assert(base(p.first) == a); + assert(base(p.second) == a+N-1); + delete [] a; + } +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_element_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_element_comp.pass.cpp new file mode 100644 index 00000000000..cc0e66e175c --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_element_comp.pass.cpp @@ -0,0 +1,88 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires CopyConstructible<Compare> +// pair<Iter, Iter> +// minmax_element(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test(Iter first, Iter last) +{ + typedef std::greater<int> Compare; + Compare comp; + std::pair<Iter, Iter> p = std::minmax_element(first, last, comp); + if (first != last) + { + for (Iter j = first; j != last; ++j) + { + assert(!comp(*j, *p.first)); + assert(!comp(*p.second, *j)); + } + } + else + { + assert(p.first == last); + assert(p.second == last); + } +} + +template <class Iter> +void +test(unsigned N) +{ + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = i; + std::random_shuffle(a, a+N); + test(Iter(a), Iter(a+N)); + delete [] a; +} + +template <class Iter> +void +test() +{ + test<Iter>(0); + test<Iter>(1); + test<Iter>(2); + test<Iter>(3); + test<Iter>(10); + test<Iter>(1000); + { + const unsigned N = 100; + int* a = new int[N]; + for (int i = 0; i < N; ++i) + a[i] = 5; + std::random_shuffle(a, a+N); + typedef std::greater<int> Compare; + Compare comp; + std::pair<Iter, Iter> p = std::minmax_element(Iter(a), Iter(a+N), comp); + assert(base(p.first) == a); + assert(base(p.second) == a+N-1); + delete [] a; + } +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list.pass.cpp new file mode 100644 index 00000000000..0196d10dcd9 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list.pass.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// 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<class T> +// pair<T, T> +// minmax(initializer_list<T> t); + +#include <algorithm> +#include <cassert> + +int main() +{ +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + assert((std::minmax({1, 2, 3}) == std::pair<int, int>(1, 3))); + assert((std::minmax({1, 3, 2}) == std::pair<int, int>(1, 3))); + assert((std::minmax({2, 1, 3}) == std::pair<int, int>(1, 3))); + assert((std::minmax({2, 3, 1}) == std::pair<int, int>(1, 3))); + assert((std::minmax({3, 1, 2}) == std::pair<int, int>(1, 3))); + assert((std::minmax({3, 2, 1}) == std::pair<int, int>(1, 3))); +#if _LIBCPP_STD_VER > 11 + { + static_assert((std::minmax({1, 2, 3}) == std::pair<int, int>(1, 3)), ""); + static_assert((std::minmax({1, 3, 2}) == std::pair<int, int>(1, 3)), ""); + static_assert((std::minmax({2, 1, 3}) == std::pair<int, int>(1, 3)), ""); + static_assert((std::minmax({2, 3, 1}) == std::pair<int, int>(1, 3)), ""); + static_assert((std::minmax({3, 1, 2}) == std::pair<int, int>(1, 3)), ""); + static_assert((std::minmax({3, 2, 1}) == std::pair<int, int>(1, 3)), ""); + } +#endif +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list_comp.pass.cpp new file mode 100644 index 00000000000..95a8c85c1da --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list_comp.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// 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<class T, class Compare> +// pair<T, T> +// minmax(initializer_list<T> t, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +int main() +{ +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + assert((std::minmax({1, 2, 3}, std::greater<int>()) == std::pair<int, int>(3, 1))); + assert((std::minmax({1, 3, 2}, std::greater<int>()) == std::pair<int, int>(3, 1))); + assert((std::minmax({2, 1, 3}, std::greater<int>()) == std::pair<int, int>(3, 1))); + assert((std::minmax({2, 3, 1}, std::greater<int>()) == std::pair<int, int>(3, 1))); + assert((std::minmax({3, 1, 2}, std::greater<int>()) == std::pair<int, int>(3, 1))); + assert((std::minmax({3, 2, 1}, std::greater<int>()) == std::pair<int, int>(3, 1))); +#if _LIBCPP_STD_VER > 11 + { + static_assert((std::minmax({1, 2, 3}, std::greater<int>()) == std::pair<int, int>(3, 1)), ""); + static_assert((std::minmax({1, 3, 2}, std::greater<int>()) == std::pair<int, int>(3, 1)), ""); + static_assert((std::minmax({2, 1, 3}, std::greater<int>()) == std::pair<int, int>(3, 1)), ""); + static_assert((std::minmax({2, 3, 1}, std::greater<int>()) == std::pair<int, int>(3, 1)), ""); + static_assert((std::minmax({3, 1, 2}, std::greater<int>()) == std::pair<int, int>(3, 1)), ""); + static_assert((std::minmax({3, 2, 1}, std::greater<int>()) == std::pair<int, int>(3, 1)), ""); + } +#endif +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.nth.element/nth_element.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.nth.element/nth_element.pass.cpp new file mode 100644 index 00000000000..dc5564eb3fc --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.nth.element/nth_element.pass.cpp @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> +// && LessThanComparable<Iter::value_type> +// void +// nth_element(Iter first, Iter nth, Iter last); + +#include <algorithm> +#include <cassert> + +void +test_one(unsigned N, unsigned M) +{ + assert(N != 0); + assert(M < N); + int* array = new int[N]; + for (int i = 0; i < N; ++i) + array[i] = i; + std::random_shuffle(array, array+N); + std::nth_element(array, array+M, array+N); + assert(array[M] == M); + std::nth_element(array, array+N, array+N); // begin, end, end + delete [] array; +} + +void +test(unsigned N) +{ + test_one(N, 0); + test_one(N, 1); + test_one(N, 2); + test_one(N, 3); + test_one(N, N/2-1); + test_one(N, N/2); + test_one(N, N/2+1); + test_one(N, N-3); + test_one(N, N-2); + test_one(N, N-1); +} + +int main() +{ + int d = 0; + std::nth_element(&d, &d, &d); + assert(d == 0); + test(256); + test(257); + test(499); + test(500); + test(997); + test(1000); + test(1009); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.nth.element/nth_element_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.nth.element/nth_element_comp.pass.cpp new file mode 100644 index 00000000000..cf8659038f1 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.nth.element/nth_element_comp.pass.cpp @@ -0,0 +1,86 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires ShuffleIterator<Iter> +// && CopyConstructible<Compare> +// void +// nth_element(Iter first, Iter nth, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <vector> +#include <cassert> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +void +test_one(unsigned N, unsigned M) +{ + assert(N != 0); + assert(M < N); + int* array = new int[N]; + for (int i = 0; i < N; ++i) + array[i] = i; + std::random_shuffle(array, array+N); + std::nth_element(array, array+M, array+N, std::greater<int>()); + assert(array[M] == N-M-1); + std::nth_element(array, array+N, array+N, std::greater<int>()); // begin, end, end + delete [] array; +} + +void +test(unsigned N) +{ + test_one(N, 0); + test_one(N, 1); + test_one(N, 2); + test_one(N, 3); + test_one(N, N/2-1); + test_one(N, N/2); + test_one(N, N/2+1); + test_one(N, N-3); + test_one(N, N-2); + test_one(N, N-1); +} + +int main() +{ + int d = 0; + std::nth_element(&d, &d, &d); + assert(d == 0); + test(256); + test(257); + test(499); + test(500); + test(997); + test(1000); + test(1009); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + std::vector<std::unique_ptr<int> > v(1000); + for (int i = 0; i < v.size(); ++i) + v[i].reset(new int(i)); + std::nth_element(v.begin(), v.begin() + v.size()/2, v.end(), indirect_less()); + assert(*v[v.size()/2] == v.size()/2); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/next_permutation.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/next_permutation.pass.cpp new file mode 100644 index 00000000000..fb58c718c7e --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/next_permutation.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// 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> +// bool +// next_permutation(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +#include <cstdio> + +int factorial(int x) +{ + int r = 1; + for (; x; --x) + r *= x; + return r; +} + +template <class Iter> +void +test() +{ + int ia[] = {1, 2, 3, 4, 5, 6}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int prev[sa]; + for (int e = 0; e <= sa; ++e) + { + int count = 0; + bool x; + do + { + std::copy(ia, ia+e, prev); + x = std::next_permutation(Iter(ia), Iter(ia+e)); + if (e > 1) + { + if (x) + assert(std::lexicographical_compare(prev, prev+e, ia, ia+e)); + else + assert(std::lexicographical_compare(ia, ia+e, prev, prev+e)); + } + ++count; + } while (x); + assert(count == factorial(e)); + } +} + +int main() +{ + test<bidirectional_iterator<int*> >(); + test<random_access_iterator<int*> >(); + test<int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/next_permutation_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/next_permutation_comp.pass.cpp new file mode 100644 index 00000000000..8e87e9a4351 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/next_permutation_comp.pass.cpp @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// 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> +// bool +// next_permutation(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +#include <cstdio> + +int factorial(int x) +{ + int r = 1; + for (; x; --x) + r *= x; + return r; +} + +template <class Iter> +void +test() +{ + typedef std::greater<int> C; + int ia[] = {6, 5, 4, 3, 2, 1}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int prev[sa]; + for (int e = 0; e <= sa; ++e) + { + int count = 0; + bool x; + do + { + std::copy(ia, ia+e, prev); + x = std::next_permutation(Iter(ia), Iter(ia+e), C()); + if (e > 1) + { + if (x) + assert(std::lexicographical_compare(prev, prev+e, ia, ia+e, C())); + else + assert(std::lexicographical_compare(ia, ia+e, prev, prev+e, C())); + } + ++count; + } while (x); + assert(count == factorial(e)); + } +} + +int main() +{ + test<bidirectional_iterator<int*> >(); + test<random_access_iterator<int*> >(); + test<int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/prev_permutation.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/prev_permutation.pass.cpp new file mode 100644 index 00000000000..d2fa2cb98b0 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/prev_permutation.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// 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> +// bool +// prev_permutation(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +#include <cstdio> + +int factorial(int x) +{ + int r = 1; + for (; x; --x) + r *= x; + return r; +} + +template <class Iter> +void +test() +{ + int ia[] = {6, 5, 4, 3, 2, 1}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int prev[sa]; + for (int e = 0; e <= sa; ++e) + { + int count = 0; + bool x; + do + { + std::copy(ia, ia+e, prev); + x = std::prev_permutation(Iter(ia), Iter(ia+e)); + if (e > 1) + { + if (x) + assert(std::lexicographical_compare(ia, ia+e, prev, prev+e)); + else + assert(std::lexicographical_compare(prev, prev+e, ia, ia+e)); + } + ++count; + } while (x); + assert(count == factorial(e)); + } +} + +int main() +{ + test<bidirectional_iterator<int*> >(); + test<random_access_iterator<int*> >(); + test<int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/prev_permutation_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/prev_permutation_comp.pass.cpp new file mode 100644 index 00000000000..51b7aa8c11b --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/prev_permutation_comp.pass.cpp @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// 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> +// bool +// prev_permutation(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +#include <cstdio> + +int factorial(int x) +{ + int r = 1; + for (; x; --x) + r *= x; + return r; +} + +template <class Iter> +void +test() +{ + typedef std::greater<int> C; + int ia[] = {1, 2, 3, 4, 5, 6}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int prev[sa]; + for (int e = 0; e <= sa; ++e) + { + int count = 0; + bool x; + do + { + std::copy(ia, ia+e, prev); + x = std::prev_permutation(Iter(ia), Iter(ia+e), C()); + if (e > 1) + { + if (x) + assert(std::lexicographical_compare(ia, ia+e, prev, prev+e, C())); + else + assert(std::lexicographical_compare(prev, prev+e, ia, ia+e, C())); + } + ++count; + } while (x); + assert(count == factorial(e)); + } +} + +int main() +{ + test<bidirectional_iterator<int*> >(); + test<random_access_iterator<int*> >(); + test<int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/includes/includes.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/includes/includes.pass.cpp new file mode 100644 index 00000000000..8db8177fb9c --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/includes/includes.pass.cpp @@ -0,0 +1,84 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator Iter1, InputIterator Iter2> +// requires HasLess<Iter1::value_type, Iter2::value_type> +// && HasLess<Iter2::value_type, Iter1::value_type> +// bool +// includes(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const unsigned sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4}; + const unsigned sb = sizeof(ib)/sizeof(ib[0]); + int ic[] = {1, 2}; + const unsigned sc = sizeof(ic)/sizeof(ic[0]); + int id[] = {3, 3, 3, 3}; + const unsigned sd = sizeof(id)/sizeof(id[0]); + + assert(std::includes(Iter1(ia), Iter1(ia), Iter2(ib), Iter2(ib))); + assert(!std::includes(Iter1(ia), Iter1(ia), Iter2(ib), Iter2(ib+1))); + assert(std::includes(Iter1(ia), Iter1(ia+1), Iter2(ib), Iter2(ib))); + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(ia), Iter2(ia+sa))); + + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(ib), Iter2(ib+sb))); + assert(!std::includes(Iter1(ib), Iter1(ib+sb), Iter2(ia), Iter2(ia+sa))); + + assert(std::includes(Iter1(ia), Iter1(ia+2), Iter2(ic), Iter2(ic+2))); + assert(!std::includes(Iter1(ia), Iter1(ia+2), Iter2(ib), Iter2(ib+2))); + + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(id), Iter2(id+1))); + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(id), Iter2(id+2))); + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(id), Iter2(id+3))); + assert(!std::includes(Iter1(ia), Iter1(ia+sa), Iter2(id), Iter2(id+4))); +} + +int main() +{ + test<input_iterator<const int*>, input_iterator<const int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*> >(); + test<input_iterator<const int*>, const int*>(); + + test<forward_iterator<const int*>, input_iterator<const int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*> >(); + test<forward_iterator<const int*>, const int*>(); + + test<bidirectional_iterator<const int*>, input_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, const int*>(); + + test<random_access_iterator<const int*>, input_iterator<const int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*> >(); + test<random_access_iterator<const int*>, const int*>(); + + test<const int*, input_iterator<const int*> >(); + test<const int*, forward_iterator<const int*> >(); + test<const int*, bidirectional_iterator<const int*> >(); + test<const int*, random_access_iterator<const int*> >(); + test<const int*, const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/includes/includes_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/includes/includes_comp.pass.cpp new file mode 100644 index 00000000000..7e1aef4749a --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/includes/includes_comp.pass.cpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator Iter1, InputIterator Iter2, typename Compare> +// requires Predicate<Compare, Iter1::value_type, Iter2::value_type> +// && Predicate<Compare, Iter2::value_type, Iter1::value_type> +// bool +// includes(Iter1 first1, Iter1 last1, Iter2 first2, Iter2 last2, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const unsigned sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4}; + const unsigned sb = sizeof(ib)/sizeof(ib[0]); + int ic[] = {1, 2}; + const unsigned sc = sizeof(ic)/sizeof(ic[0]); + int id[] = {3, 3, 3, 3}; + const unsigned sd = sizeof(id)/sizeof(id[0]); + + assert(std::includes(Iter1(ia), Iter1(ia), Iter2(ib), Iter2(ib), std::less<int>())); + assert(!std::includes(Iter1(ia), Iter1(ia), Iter2(ib), Iter2(ib+1), std::less<int>())); + assert(std::includes(Iter1(ia), Iter1(ia+1), Iter2(ib), Iter2(ib), std::less<int>())); + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(ia), Iter2(ia+sa), std::less<int>())); + + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(ib), Iter2(ib+sb), std::less<int>())); + assert(!std::includes(Iter1(ib), Iter1(ib+sb), Iter2(ia), Iter2(ia+sa), std::less<int>())); + + assert(std::includes(Iter1(ia), Iter1(ia+2), Iter2(ic), Iter2(ic+2), std::less<int>())); + assert(!std::includes(Iter1(ia), Iter1(ia+2), Iter2(ib), Iter2(ib+2), std::less<int>())); + + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(id), Iter2(id+1), std::less<int>())); + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(id), Iter2(id+2), std::less<int>())); + assert(std::includes(Iter1(ia), Iter1(ia+sa), Iter2(id), Iter2(id+3), std::less<int>())); + assert(!std::includes(Iter1(ia), Iter1(ia+sa), Iter2(id), Iter2(id+4), std::less<int>())); +} + +int main() +{ + test<input_iterator<const int*>, input_iterator<const int*> >(); + test<input_iterator<const int*>, forward_iterator<const int*> >(); + test<input_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<input_iterator<const int*>, random_access_iterator<const int*> >(); + test<input_iterator<const int*>, const int*>(); + + test<forward_iterator<const int*>, input_iterator<const int*> >(); + test<forward_iterator<const int*>, forward_iterator<const int*> >(); + test<forward_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<forward_iterator<const int*>, random_access_iterator<const int*> >(); + test<forward_iterator<const int*>, const int*>(); + + test<bidirectional_iterator<const int*>, input_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, random_access_iterator<const int*> >(); + test<bidirectional_iterator<const int*>, const int*>(); + + test<random_access_iterator<const int*>, input_iterator<const int*> >(); + test<random_access_iterator<const int*>, forward_iterator<const int*> >(); + test<random_access_iterator<const int*>, bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*>, random_access_iterator<const int*> >(); + test<random_access_iterator<const int*>, const int*>(); + + test<const int*, input_iterator<const int*> >(); + test<const int*, forward_iterator<const int*> >(); + test<const int*, bidirectional_iterator<const int*> >(); + test<const int*, random_access_iterator<const int*> >(); + test<const int*, const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/nothing_to_do.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..b58f5c55b64 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference.pass.cpp new file mode 100644 index 00000000000..c2c20c295ca --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference.pass.cpp @@ -0,0 +1,200 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter1, InputIterator InIter2, typename OutIter> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && HasLess<InIter2::value_type, InIter1::value_type> +// && HasLess<InIter1::value_type, InIter2::value_type> +// OutIter +// set_difference(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, +// OutIter result); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2, class OutIter> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4, 4, 6}; + const int sb = sizeof(ib)/sizeof(ib[0]); + int ic[20]; + int ir[] = {1, 2, 3, 3, 3, 4, 4}; + const int sr = sizeof(ir)/sizeof(ir[0]); + OutIter ce = std::set_difference(Iter1(ia), Iter1(ia+sa), + Iter2(ib), Iter2(ib+sb), OutIter(ic)); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + int irr[] = {6}; + const int srr = sizeof(irr)/sizeof(irr[0]); + ce = std::set_difference(Iter1(ib), Iter1(ib+sb), + Iter2(ia), Iter2(ia+sa), OutIter(ic)); + assert(base(ce) - ic == srr); + assert(std::lexicographical_compare(ic, base(ce), irr, irr+srr) == 0); +} + +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/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference_comp.pass.cpp new file mode 100644 index 00000000000..2b5a6a9f56b --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.difference/set_difference_comp.pass.cpp @@ -0,0 +1,202 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter1, InputIterator InIter2, typename OutIter, +// CopyConstructible Compare> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && Predicate<Compare, InIter1::value_type, InIter2::value_type> +// && Predicate<Compare, InIter2::value_type, InIter1::value_type> +// OutIter +// set_difference(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, +// OutIter result, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2, class OutIter> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4, 4, 6}; + const int sb = sizeof(ib)/sizeof(ib[0]); + int ic[20]; + int ir[] = {1, 2, 3, 3, 3, 4, 4}; + const int sr = sizeof(ir)/sizeof(ir[0]); + OutIter ce = std::set_difference(Iter1(ia), Iter1(ia+sa), + Iter2(ib), Iter2(ib+sb), OutIter(ic), std::less<int>()); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + int irr[] = {6}; + const int srr = sizeof(irr)/sizeof(irr[0]); + ce = std::set_difference(Iter1(ib), Iter1(ib+sb), + Iter2(ia), Iter2(ia+sa), OutIter(ic), std::less<int>()); + assert(base(ce) - ic == srr); + assert(std::lexicographical_compare(ic, base(ce), irr, irr+srr) == 0); +} + +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/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection.pass.cpp new file mode 100644 index 00000000000..f371890d8e7 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection.pass.cpp @@ -0,0 +1,198 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter1, InputIterator InIter2, typename OutIter> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && HasLess<InIter2::value_type, InIter1::value_type> +// && HasLess<InIter1::value_type, InIter2::value_type> +// OutIter +// set_intersection(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, +// OutIter result); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2, class OutIter> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4, 4, 6}; + const int sb = sizeof(ib)/sizeof(ib[0]); + int ic[20]; + int ir[] = {2, 4, 4}; + const int sr = sizeof(ir)/sizeof(ir[0]); + OutIter ce = std::set_intersection(Iter1(ia), Iter1(ia+sa), + Iter2(ib), Iter2(ib+sb), OutIter(ic)); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + ce = std::set_intersection(Iter1(ib), Iter1(ib+sb), + Iter2(ia), Iter2(ia+sa), OutIter(ic)); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); +} + +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/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection_comp.pass.cpp new file mode 100644 index 00000000000..035522b5462 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.intersection/set_intersection_comp.pass.cpp @@ -0,0 +1,200 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter1, InputIterator InIter2, typename OutIter, +// CopyConstructible Compare> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && Predicate<Compare, InIter1::value_type, InIter2::value_type> +// && Predicate<Compare, InIter2::value_type, InIter1::value_type> +// OutIter +// set_intersection(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, +// OutIter result, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2, class OutIter> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4, 4, 6}; + const int sb = sizeof(ib)/sizeof(ib[0]); + int ic[20]; + int ir[] = {2, 4, 4}; + const int sr = sizeof(ir)/sizeof(ir[0]); + OutIter ce = std::set_intersection(Iter1(ia), Iter1(ia+sa), + Iter2(ib), Iter2(ib+sb), OutIter(ic), std::less<int>()); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + ce = std::set_intersection(Iter1(ib), Iter1(ib+sb), + Iter2(ia), Iter2(ia+sa), OutIter(ic), std::less<int>()); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); +} + +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/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference.pass.cpp new file mode 100644 index 00000000000..ea3812a7f1c --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference.pass.cpp @@ -0,0 +1,199 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter1, InputIterator InIter2, typename OutIter> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && HasLess<InIter2::value_type, InIter1::value_type> +// && HasLess<InIter1::value_type, InIter2::value_type> +// OutIter +// set_symmetric_difference(InIter1 first1, InIter1 last1, +// InIter2 first2, InIter2 last2, +// OutIter result); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2, class OutIter> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4, 4, 6}; + const int sb = sizeof(ib)/sizeof(ib[0]); + int ic[20]; + int ir[] = {1, 2, 3, 3, 3, 4, 4, 6}; + const int sr = sizeof(ir)/sizeof(ir[0]); + OutIter ce = std::set_symmetric_difference(Iter1(ia), Iter1(ia+sa), + Iter2(ib), Iter2(ib+sb), OutIter(ic)); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + ce = std::set_symmetric_difference(Iter1(ib), Iter1(ib+sb), + Iter2(ia), Iter2(ia+sa), OutIter(ic)); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); +} + +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/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference_comp.pass.cpp new file mode 100644 index 00000000000..ba1f61a1067 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.symmetric.difference/set_symmetric_difference_comp.pass.cpp @@ -0,0 +1,203 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter1, InputIterator InIter2, typename OutIter, +// CopyConstructible Compare> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && Predicate<Compare, InIter1::value_type, InIter2::value_type> +// && Predicate<Compare, InIter2::value_type, InIter1::value_type> +// OutIter +// set_symmetric_difference(InIter1 first1, InIter1 last1, +// InIter2 first2, InIter2 last2, +// OutIter result, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2, class OutIter> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4, 4, 6}; + const int sb = sizeof(ib)/sizeof(ib[0]); + int ic[20]; + int ir[] = {1, 2, 3, 3, 3, 4, 4, 6}; + const int sr = sizeof(ir)/sizeof(ir[0]); + OutIter ce = std::set_symmetric_difference(Iter1(ia), Iter1(ia+sa), + Iter2(ib), Iter2(ib+sb), + OutIter(ic), std::less<int>()); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + ce = std::set_symmetric_difference(Iter1(ib), Iter1(ib+sb), + Iter2(ia), Iter2(ia+sa), + OutIter(ic), std::less<int>()); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); +} + +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/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union.pass.cpp new file mode 100644 index 00000000000..46578501d77 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union.pass.cpp @@ -0,0 +1,198 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter1, InputIterator InIter2, typename OutIter> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && HasLess<InIter2::value_type, InIter1::value_type> +// && HasLess<InIter1::value_type, InIter2::value_type> +// OutIter +// set_union(InIter1 first1, InIter1 last1, +// InIter2 first2, InIter2 last2, OutIter result); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2, class OutIter> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4, 4, 6}; + const int sb = sizeof(ib)/sizeof(ib[0]); + int ic[20]; + int ir[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6}; + const int sr = sizeof(ir)/sizeof(ir[0]); + OutIter ce = std::set_union(Iter1(ia), Iter1(ia+sa), + Iter2(ib), Iter2(ib+sb), OutIter(ic)); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + ce = std::set_union(Iter1(ib), Iter1(ib+sb), + Iter2(ia), Iter2(ia+sa), OutIter(ic)); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); +} + +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/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union_comp.pass.cpp new file mode 100644 index 00000000000..3d63e3fb9c4 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.set.operations/set.union/set_union_comp.pass.cpp @@ -0,0 +1,200 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter1, InputIterator InIter2, typename OutIter, +// CopyConstructible Compare> +// requires OutputIterator<OutIter, InIter1::reference> +// && OutputIterator<OutIter, InIter2::reference> +// && Predicate<Compare, InIter1::value_type, InIter2::value_type> +// && Predicate<Compare, InIter2::value_type, InIter1::value_type> +// OutIter +// set_union(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, +// OutIter result, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter1, class Iter2, class OutIter> +void +test() +{ + int ia[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4}; + const int sa = sizeof(ia)/sizeof(ia[0]); + int ib[] = {2, 4, 4, 6}; + const int sb = sizeof(ib)/sizeof(ib[0]); + int ic[20]; + int ir[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 6}; + const int sr = sizeof(ir)/sizeof(ir[0]); + OutIter ce = std::set_union(Iter1(ia), Iter1(ia+sa), + Iter2(ib), Iter2(ib+sb), OutIter(ic), std::less<int>()); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); + ce = std::set_union(Iter1(ib), Iter1(ib+sb), + Iter2(ia), Iter2(ia+sa), OutIter(ic), std::less<int>()); + assert(base(ce) - ic == sr); + assert(std::lexicographical_compare(ic, base(ce), ir, ir+sr) == 0); +} + +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/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted.pass.cpp new file mode 100644 index 00000000000..dd6b5c1766a --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted.pass.cpp @@ -0,0 +1,183 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter> +// requires LessThanComparable<Iter::value_type> +// bool +// is_sorted(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test() +{ + { + int a[] = {0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a))); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + + { + int a[] = {0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + + { + int a[] = {0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + + { + int a[] = {0, 0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {0, 1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa))); + } + { + int a[] = {1, 1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa))); + } +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_comp.pass.cpp new file mode 100644 index 00000000000..d5a34e2f2cb --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_comp.pass.cpp @@ -0,0 +1,184 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires CopyConstructible<Compare> +// bool +// is_sorted(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test() +{ + { + int a[] = {0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a))); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + + { + int a[] = {0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + + { + int a[] = {0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + + { + int a[] = {0, 0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {0, 1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(!std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } + { + int a[] = {1, 1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted(Iter(a), Iter(a+sa), std::greater<int>())); + } +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_until.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_until.pass.cpp new file mode 100644 index 00000000000..bef01027472 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_until.pass.cpp @@ -0,0 +1,183 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter> +// requires LessThanComparable<Iter::value_type> +// Iter +// is_sorted_until(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test() +{ + { + int a[] = {0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a)) == Iter(a)); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + + { + int a[] = {0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+1)); + } + { + int a[] = {1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + + { + int a[] = {0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+2)); + } + { + int a[] = {0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+1)); + } + { + int a[] = {1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+1)); + } + { + int a[] = {1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+2)); + } + { + int a[] = {1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + + { + int a[] = {0, 0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {0, 0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {0, 0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+3)); + } + { + int a[] = {0, 0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {0, 1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+2)); + } + { + int a[] = {0, 1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+2)); + } + { + int a[] = {0, 1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+3)); + } + { + int a[] = {0, 1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } + { + int a[] = {1, 0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+1)); + } + { + int a[] = {1, 0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+1)); + } + { + int a[] = {1, 0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+1)); + } + { + int a[] = {1, 0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+1)); + } + { + int a[] = {1, 1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+2)); + } + { + int a[] = {1, 1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+2)); + } + { + int a[] = {1, 1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+3)); + } + { + int a[] = {1, 1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa)) == Iter(a+sa)); + } +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_until_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_until_comp.pass.cpp new file mode 100644 index 00000000000..68ed29c6f4b --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/is.sorted/is_sorted_until_comp.pass.cpp @@ -0,0 +1,184 @@ +//===----------------------------------------------------------------------===// +// +// 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<ForwardIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires CopyConstructible<Compare> +// Iter +// is_sorted_until(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test() +{ + { + int a[] = {0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a), std::greater<int>()) == Iter(a)); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + + { + int a[] = {0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+1)); + } + { + int a[] = {1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + + { + int a[] = {0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+2)); + } + { + int a[] = {0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+1)); + } + { + int a[] = {0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+1)); + } + { + int a[] = {1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+2)); + } + { + int a[] = {1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + + { + int a[] = {0, 0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {0, 0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+3)); + } + { + int a[] = {0, 0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+2)); + } + { + int a[] = {0, 0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+2)); + } + { + int a[] = {0, 1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+1)); + } + { + int a[] = {0, 1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+1)); + } + { + int a[] = {0, 1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+1)); + } + { + int a[] = {0, 1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+1)); + } + { + int a[] = {1, 0, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {1, 0, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+3)); + } + { + int a[] = {1, 0, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+2)); + } + { + int a[] = {1, 0, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+2)); + } + { + int a[] = {1, 1, 0, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {1, 1, 0, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+3)); + } + { + int a[] = {1, 1, 1, 0}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } + { + int a[] = {1, 1, 1, 1}; + unsigned sa = sizeof(a) / sizeof(a[0]); + assert(std::is_sorted_until(Iter(a), Iter(a+sa), std::greater<int>()) == Iter(a+sa)); + } +} + +int main() +{ + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/nothing_to_do.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..b58f5c55b64 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort.copy/partial_sort_copy.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort.copy/partial_sort_copy.pass.cpp new file mode 100644 index 00000000000..5f298fde7b3 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort.copy/partial_sort_copy.pass.cpp @@ -0,0 +1,86 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter, RandomAccessIterator RAIter> +// requires ShuffleIterator<RAIter> +// && OutputIterator<RAIter, InIter::reference> +// && HasLess<InIter::value_type, RAIter::value_type> +// && LessThanComparable<RAIter::value_type> +// RAIter +// partial_sort_copy(InIter first, InIter last, RAIter result_first, RAIter result_last); + +#include <algorithm> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test_larger_sorts(unsigned N, unsigned M) +{ + int* input = new int[N]; + int* output = new int[M]; + for (int i = 0; i < N; ++i) + input[i] = i; + std::random_shuffle(input, input+N); + int* r = std::partial_sort_copy(Iter(input), Iter(input+N), output, output+M); + int* e = output + std::min(N, M); + assert(r == e); + int i = 0; + for (int* x = output; x < e; ++x, ++i) + assert(*x == i); + delete [] output; + delete [] input; +} + +template <class Iter> +void +test_larger_sorts(unsigned N) +{ + test_larger_sorts<Iter>(N, 0); + test_larger_sorts<Iter>(N, 1); + test_larger_sorts<Iter>(N, 2); + test_larger_sorts<Iter>(N, 3); + test_larger_sorts<Iter>(N, N/2-1); + test_larger_sorts<Iter>(N, N/2); + test_larger_sorts<Iter>(N, N/2+1); + test_larger_sorts<Iter>(N, N-2); + test_larger_sorts<Iter>(N, N-1); + test_larger_sorts<Iter>(N, N); + test_larger_sorts<Iter>(N, N+1000); +} + +template <class Iter> +void +test() +{ + test_larger_sorts<Iter>(0, 100); + test_larger_sorts<Iter>(10); + test_larger_sorts<Iter>(256); + test_larger_sorts<Iter>(257); + test_larger_sorts<Iter>(499); + test_larger_sorts<Iter>(500); + test_larger_sorts<Iter>(997); + test_larger_sorts<Iter>(1000); + test_larger_sorts<Iter>(1009); +} + +int main() +{ + int i = 0; + std::partial_sort_copy(&i, &i, &i, &i+5); + assert(i == 0); + test<input_iterator<const int*> >(); + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort.copy/partial_sort_copy_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort.copy/partial_sort_copy_comp.pass.cpp new file mode 100644 index 00000000000..df8fb9eacac --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort.copy/partial_sort_copy_comp.pass.cpp @@ -0,0 +1,90 @@ +//===----------------------------------------------------------------------===// +// +// 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<InputIterator InIter, RandomAccessIterator RAIter, class Compare> +// requires ShuffleIterator<RAIter> +// && OutputIterator<RAIter, InIter::reference> +// && Predicate<Compare, InIter::value_type, RAIter::value_type> +// && StrictWeakOrder<Compare, RAIter::value_type>} +// && CopyConstructible<Compare> +// RAIter +// partial_sort_copy(InIter first, InIter last, +// RAIter result_first, RAIter result_last, Compare comp); + +#include <algorithm> +#include <functional> +#include <cassert> + +#include "test_iterators.h" + +template <class Iter> +void +test_larger_sorts(unsigned N, unsigned M) +{ + int* input = new int[N]; + int* output = new int[M]; + for (int i = 0; i < N; ++i) + input[i] = i; + std::random_shuffle(input, input+N); + int* r = std::partial_sort_copy(Iter(input), Iter(input+N), output, output+M, + std::greater<int>()); + int* e = output + std::min(N, M); + assert(r == e); + int i = 0; + for (int* x = output; x < e; ++x, ++i) + assert(*x == N-i-1); + delete [] output; + delete [] input; +} + +template <class Iter> +void +test_larger_sorts(unsigned N) +{ + test_larger_sorts<Iter>(N, 0); + test_larger_sorts<Iter>(N, 1); + test_larger_sorts<Iter>(N, 2); + test_larger_sorts<Iter>(N, 3); + test_larger_sorts<Iter>(N, N/2-1); + test_larger_sorts<Iter>(N, N/2); + test_larger_sorts<Iter>(N, N/2+1); + test_larger_sorts<Iter>(N, N-2); + test_larger_sorts<Iter>(N, N-1); + test_larger_sorts<Iter>(N, N); + test_larger_sorts<Iter>(N, N+1000); +} + +template <class Iter> +void +test() +{ + test_larger_sorts<Iter>(0, 100); + test_larger_sorts<Iter>(10); + test_larger_sorts<Iter>(256); + test_larger_sorts<Iter>(257); + test_larger_sorts<Iter>(499); + test_larger_sorts<Iter>(500); + test_larger_sorts<Iter>(997); + test_larger_sorts<Iter>(1000); + test_larger_sorts<Iter>(1009); +} + +int main() +{ + int i = 0; + std::partial_sort_copy(&i, &i, &i, &i+5); + assert(i == 0); + test<input_iterator<const int*> >(); + test<forward_iterator<const int*> >(); + test<bidirectional_iterator<const int*> >(); + test<random_access_iterator<const int*> >(); + test<const int*>(); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort/partial_sort.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort/partial_sort.pass.cpp new file mode 100644 index 00000000000..7bb43461cba --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort/partial_sort.pass.cpp @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> +// && LessThanComparable<Iter::value_type> +// void +// partial_sort(Iter first, Iter middle, Iter last); + +#include <algorithm> +#include <cassert> + +void +test_larger_sorts(unsigned N, unsigned M) +{ + assert(N != 0); + int* array = new int[N]; + for (int i = 0; i < N; ++i) + array[i] = i; + std::random_shuffle(array, array+N); + std::partial_sort(array, array+M, array+N); + for (int i = 0; i < M; ++i) + assert(array[i] == i); + delete [] array; +} + +void +test_larger_sorts(unsigned N) +{ + test_larger_sorts(N, 0); + test_larger_sorts(N, 1); + test_larger_sorts(N, 2); + test_larger_sorts(N, 3); + test_larger_sorts(N, N/2-1); + test_larger_sorts(N, N/2); + test_larger_sorts(N, N/2+1); + test_larger_sorts(N, N-2); + test_larger_sorts(N, N-1); + test_larger_sorts(N, N); +} + +int main() +{ + int i = 0; + std::partial_sort(&i, &i, &i); + assert(i == 0); + test_larger_sorts(10); + test_larger_sorts(256); + test_larger_sorts(257); + test_larger_sorts(499); + test_larger_sorts(500); + test_larger_sorts(997); + test_larger_sorts(1000); + test_larger_sorts(1009); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort/partial_sort_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort/partial_sort_comp.pass.cpp new file mode 100644 index 00000000000..d822f6c388c --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/partial.sort/partial_sort_comp.pass.cpp @@ -0,0 +1,87 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires ShuffleIterator<Iter> +// && CopyConstructible<Compare> +// void +// partial_sort(Iter first, Iter middle, Iter last, Compare comp); + +#include <algorithm> +#include <vector> +#include <functional> +#include <cassert> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +void +test_larger_sorts(unsigned N, unsigned M) +{ + assert(N != 0); + int* array = new int[N]; + for (int i = 0; i < N; ++i) + array[i] = i; + std::random_shuffle(array, array+N); + std::partial_sort(array, array+M, array+N, std::greater<int>()); + for (int i = 0; i < M; ++i) + assert(array[i] == N-i-1); + delete [] array; +} + +void +test_larger_sorts(unsigned N) +{ + test_larger_sorts(N, 0); + test_larger_sorts(N, 1); + test_larger_sorts(N, 2); + test_larger_sorts(N, 3); + test_larger_sorts(N, N/2-1); + test_larger_sorts(N, N/2); + test_larger_sorts(N, N/2+1); + test_larger_sorts(N, N-2); + test_larger_sorts(N, N-1); + test_larger_sorts(N, N); +} + +int main() +{ + int i = 0; + std::partial_sort(&i, &i, &i); + assert(i == 0); + test_larger_sorts(10); + test_larger_sorts(256); + test_larger_sorts(257); + test_larger_sorts(499); + test_larger_sorts(500); + test_larger_sorts(997); + test_larger_sorts(1000); + test_larger_sorts(1009); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + std::vector<std::unique_ptr<int> > v(1000); + for (int i = 0; i < v.size(); ++i) + v[i].reset(new int(i)); + std::partial_sort(v.begin(), v.begin() + v.size()/2, v.end(), indirect_less()); + for (int i = 0; i < v.size()/2; ++i) + assert(*v[i] == i); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort.pass.cpp new file mode 100644 index 00000000000..2ea697a63b2 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort.pass.cpp @@ -0,0 +1,150 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> +// && LessThanComparable<Iter::value_type> +// void +// sort(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +template <class RI> +void +test_sort_helper(RI f, RI l) +{ + typedef typename std::iterator_traits<RI>::value_type value_type; + if (f != l) + { + long len = l - f; + value_type* save(new value_type[len]); + do + { + std::copy(f, l, save); + std::sort(save, save+len); + assert(std::is_sorted(save, save+len)); + } while (std::next_permutation(f, l)); + delete [] save; + } +} + +template <class RI> +void +test_sort_driver_driver(RI f, RI l, int start, RI real_last) +{ + for (RI i = l; i > f + start;) + { + *--i = start; + if (f == i) + { + test_sort_helper(f, real_last); + } + if (start > 0) + test_sort_driver_driver(f, i, start-1, real_last); + } +} + +template <class RI> +void +test_sort_driver(RI f, RI l, int start) +{ + test_sort_driver_driver(f, l, start, l); +} + +template <unsigned sa> +void +test_sort_() +{ + int ia[sa]; + for (int i = 0; i < sa; ++i) + { + test_sort_driver(ia, ia+sa, i); + } +} + +void +test_larger_sorts(unsigned N, unsigned M) +{ + assert(N != 0); + assert(M != 0); + // create array length N filled with M different numbers + int* array = new int[N]; + int x = 0; + for (int i = 0; i < N; ++i) + { + array[i] = x; + if (++x == M) + x = 0; + } + // test saw tooth pattern + std::sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test random pattern + std::random_shuffle(array, array+N); + std::sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test sorted pattern + std::sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test reverse sorted pattern + std::reverse(array, array+N); + std::sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test swap ranges 2 pattern + std::swap_ranges(array, array+N/2, array+N/2); + std::sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test reverse swap ranges 2 pattern + std::reverse(array, array+N); + std::swap_ranges(array, array+N/2, array+N/2); + std::sort(array, array+N); + assert(std::is_sorted(array, array+N)); + delete [] array; +} + +void +test_larger_sorts(unsigned N) +{ + test_larger_sorts(N, 1); + test_larger_sorts(N, 2); + test_larger_sorts(N, 3); + test_larger_sorts(N, N/2-1); + test_larger_sorts(N, N/2); + test_larger_sorts(N, N/2+1); + test_larger_sorts(N, N-2); + test_larger_sorts(N, N-1); + test_larger_sorts(N, N); +} + +int main() +{ + // test null range + int d = 0; + std::sort(&d, &d); + // exhaustively test all possibilities up to length 8 + test_sort_<1>(); + test_sort_<2>(); + test_sort_<3>(); + test_sort_<4>(); + test_sort_<5>(); + test_sort_<6>(); + test_sort_<7>(); + test_sort_<8>(); + + test_larger_sorts(256); + test_larger_sorts(257); + test_larger_sorts(499); + test_larger_sorts(500); + test_larger_sorts(997); + test_larger_sorts(1000); + test_larger_sorts(1009); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort_comp.pass.cpp new file mode 100644 index 00000000000..d6c4f046784 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort_comp.pass.cpp @@ -0,0 +1,57 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires ShuffleIterator<Iter> +// && CopyConstructible<Compare> +// void +// sort(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <vector> +#include <cassert> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +int main() +{ + { + std::vector<int> v(1000); + for (int i = 0; i < v.size(); ++i) + v[i] = i; + std::sort(v.begin(), v.end(), std::greater<int>()); + std::reverse(v.begin(), v.end()); + assert(std::is_sorted(v.begin(), v.end())); + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + std::vector<std::unique_ptr<int> > v(1000); + for (int i = 0; i < v.size(); ++i) + v[i].reset(new int(i)); + std::sort(v.begin(), v.end(), indirect_less()); + assert(std::is_sorted(v.begin(), v.end(), indirect_less())); + assert(*v[0] == 0); + assert(*v[1] == 1); + assert(*v[2] == 2); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/stable_sort.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/stable_sort.pass.cpp new file mode 100644 index 00000000000..5faa1682135 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/stable_sort.pass.cpp @@ -0,0 +1,150 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter> +// requires ShuffleIterator<Iter> +// && LessThanComparable<Iter::value_type> +// void +// stable_sort(Iter first, Iter last); + +#include <algorithm> +#include <cassert> + +template <class RI> +void +test_sort_helper(RI f, RI l) +{ + typedef typename std::iterator_traits<RI>::value_type value_type; + if (f != l) + { + long len = l - f; + value_type* save(new value_type[len]); + do + { + std::copy(f, l, save); + std::stable_sort(save, save+len); + assert(std::is_sorted(save, save+len)); + } while (std::next_permutation(f, l)); + delete [] save; + } +} + +template <class RI> +void +test_sort_driver_driver(RI f, RI l, int start, RI real_last) +{ + for (RI i = l; i > f + start;) + { + *--i = start; + if (f == i) + { + test_sort_helper(f, real_last); + } + if (start > 0) + test_sort_driver_driver(f, i, start-1, real_last); + } +} + +template <class RI> +void +test_sort_driver(RI f, RI l, int start) +{ + test_sort_driver_driver(f, l, start, l); +} + +template <unsigned sa> +void +test_sort_() +{ + int ia[sa]; + for (int i = 0; i < sa; ++i) + { + test_sort_driver(ia, ia+sa, i); + } +} + +void +test_larger_sorts(unsigned N, unsigned M) +{ + assert(N != 0); + assert(M != 0); + // create array length N filled with M different numbers + int* array = new int[N]; + int x = 0; + for (int i = 0; i < N; ++i) + { + array[i] = x; + if (++x == M) + x = 0; + } + // test saw tooth pattern + std::stable_sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test random pattern + std::random_shuffle(array, array+N); + std::stable_sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test sorted pattern + std::stable_sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test reverse sorted pattern + std::reverse(array, array+N); + std::stable_sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test swap ranges 2 pattern + std::swap_ranges(array, array+N/2, array+N/2); + std::stable_sort(array, array+N); + assert(std::is_sorted(array, array+N)); + // test reverse swap ranges 2 pattern + std::reverse(array, array+N); + std::swap_ranges(array, array+N/2, array+N/2); + std::stable_sort(array, array+N); + assert(std::is_sorted(array, array+N)); + delete [] array; +} + +void +test_larger_sorts(unsigned N) +{ + test_larger_sorts(N, 1); + test_larger_sorts(N, 2); + test_larger_sorts(N, 3); + test_larger_sorts(N, N/2-1); + test_larger_sorts(N, N/2); + test_larger_sorts(N, N/2+1); + test_larger_sorts(N, N-2); + test_larger_sorts(N, N-1); + test_larger_sorts(N, N); +} + +int main() +{ + // test null range + int d = 0; + std::stable_sort(&d, &d); + // exhaustively test all possibilities up to length 8 + test_sort_<1>(); + test_sort_<2>(); + test_sort_<3>(); + test_sort_<4>(); + test_sort_<5>(); + test_sort_<6>(); + test_sort_<7>(); + test_sort_<8>(); + + test_larger_sorts(256); + test_larger_sorts(257); + test_larger_sorts(499); + test_larger_sorts(500); + test_larger_sorts(997); + test_larger_sorts(1000); + test_larger_sorts(1009); +} diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/stable_sort_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/stable_sort_comp.pass.cpp new file mode 100644 index 00000000000..68e817ebeb3 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/stable.sort/stable_sort_comp.pass.cpp @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// 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<RandomAccessIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare> +// requires ShuffleIterator<Iter> +// && CopyConstructible<Compare> +// void +// stable_sort(Iter first, Iter last, Compare comp); + +#include <algorithm> +#include <functional> +#include <vector> +#include <cassert> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#include <memory> + +struct indirect_less +{ + template <class P> + bool operator()(const P& x, const P& y) + {return *x < *y;} +}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +struct first_only +{ + bool operator()(const std::pair<int, int>& x, const std::pair<int, int>& y) + { + return x.first < y.first; + } +}; + +void test() +{ + typedef std::pair<int, int> P; + const int N = 1000; + const int M = 10; + std::vector<P> v(N); + int x = 0; + int ver = 0; + for (int i = 0; i < N; ++i) + { + v[i] = P(x, ver); + if (++x == M) + { + x = 0; + ++ver; + } + } + for (int i = 0; i < N - M; i += M) + { + std::random_shuffle(v.begin() + i, v.begin() + i + M); + } + std::stable_sort(v.begin(), v.end(), first_only()); + assert(std::is_sorted(v.begin(), v.end())); +} + +int main() +{ + test(); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + { + std::vector<std::unique_ptr<int> > v(1000); + for (int i = 0; i < v.size(); ++i) + v[i].reset(new int(i)); + std::stable_sort(v.begin(), v.end(), indirect_less()); + assert(std::is_sorted(v.begin(), v.end(), indirect_less())); + assert(*v[0] == 0); + assert(*v[1] == 1); + assert(*v[2] == 2); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +} diff --git a/libcxx/test/std/algorithms/alg.sorting/nothing_to_do.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/nothing_to_do.pass.cpp new file mode 100644 index 00000000000..b58f5c55b64 --- /dev/null +++ b/libcxx/test/std/algorithms/alg.sorting/nothing_to_do.pass.cpp @@ -0,0 +1,12 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +int main() +{ +} |