[libcxx-commits] [libcxx] [libc++][test] Refactor tests for ranges::swap_range algorithms (PR #121138)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Feb 5 09:50:36 PST 2025
================
@@ -78,141 +70,101 @@ constexpr void test_borrowed_input_range() {
int r1[] = {1, 2, 3};
int r2[] = {4, 5, 6};
std::ranges::swap_ranges(std::views::all(r1), r2);
- assert(r1[0] == 4);
- assert(r1[1] == 5);
- assert(r1[2] == 6);
- assert(r2[0] == 1);
- assert(r2[1] == 2);
- assert(r2[2] == 3);
+ assert(std::ranges::equal(r1, std::array{4, 5, 6}));
+ assert(std::ranges::equal(r2, std::array{1, 2, 3}));
}
{
int r1[] = {1, 2, 3};
int r2[] = {4, 5, 6};
std::ranges::swap_ranges(r1, std::views::all(r2));
- assert(r1[0] == 4);
- assert(r1[1] == 5);
- assert(r1[2] == 6);
- assert(r2[0] == 1);
- assert(r2[1] == 2);
- assert(r2[2] == 3);
+ assert(std::ranges::equal(r1, std::array{4, 5, 6}));
+ assert(std::ranges::equal(r2, std::array{1, 2, 3}));
}
{
int r1[] = {1, 2, 3};
int r2[] = {4, 5, 6};
std::ranges::swap_ranges(std::views::all(r1), std::views::all(r2));
- assert(r1[0] == 4);
- assert(r1[1] == 5);
- assert(r1[2] == 6);
- assert(r2[0] == 1);
- assert(r2[1] == 2);
- assert(r2[2] == 3);
+ assert(std::ranges::equal(r1, std::array{4, 5, 6}));
+ assert(std::ranges::equal(r2, std::array{1, 2, 3}));
}
}
constexpr void test_sentinel() {
- int i[3] = {1, 2, 3};
- int j[3] = {4, 5, 6};
- using It = cpp17_input_iterator<int*>;
- using Sent = sentinel_wrapper<It>;
- using Expected = std::ranges::swap_ranges_result<It, It>;
- std::same_as<Expected> auto r =
- std::ranges::swap_ranges(It(i), Sent(It(i + 3)), It(j), Sent(It(j + 3)));
+ int i[3] = {1, 2, 3};
+ int j[3] = {4, 5, 6};
+ using It = cpp17_input_iterator<int*>;
+ using Sent = sentinel_wrapper<It>;
+ using Expected = std::ranges::swap_ranges_result<It, It>;
+ std::same_as<Expected> auto r = std::ranges::swap_ranges(It(i), Sent(It(i + 3)), It(j), Sent(It(j + 3)));
assert(base(r.in1) == i + 3);
assert(base(r.in2) == j + 3);
- assert(i[0] == 4);
- assert(i[1] == 5);
- assert(i[2] == 6);
- assert(j[0] == 1);
- assert(j[1] == 2);
- assert(j[2] == 3);
+ assert(std::ranges::equal(i, std::array{4, 5, 6}));
+ assert(std::ranges::equal(j, std::array{1, 2, 3}));
}
-template <class Iter1, class Iter2>
-constexpr void test_iterators() {
- using Expected = std::ranges::swap_ranges_result<Iter1, Iter2>;
- int i[3] = {1, 2, 3};
- int j[3] = {4, 5, 6};
- std::same_as<Expected> auto r =
- std::ranges::swap_ranges(Iter1(i), sentinel_wrapper(Iter1(i + 3)), Iter2(j), sentinel_wrapper(Iter2(j + 3)));
- assert(base(r.in1) == i + 3);
- assert(base(r.in2) == j + 3);
- assert(i[0] == 4);
- assert(i[1] == 5);
- assert(i[2] == 6);
- assert(j[0] == 1);
- assert(j[1] == 2);
- assert(j[2] == 3);
-}
+template <class Iter1>
+struct Test {
+ template <class Iter2>
+ TEST_CONSTEXPR_CXX20 void operator()() {
+ using Expected = std::ranges::swap_ranges_result<Iter1, Iter2>;
+ int a[3] = {1, 2, 3};
+ int b[3] = {4, 5, 6};
+ std::same_as<Expected> auto r =
+ std::ranges::swap_ranges(Iter1(a), sentinel_wrapper(Iter1(a + 3)), Iter2(b), sentinel_wrapper(Iter2(b + 3)));
+ assert(base(r.in1) == a + 3);
+ assert(base(r.in2) == b + 3);
+ assert(std::ranges::equal(a, std::array{4, 5, 6}));
+ assert(std::ranges::equal(b, std::array{1, 2, 3}));
+ }
+};
+
+struct TestIterators {
+ template <class Iter>
+ TEST_CONSTEXPR_CXX20 void operator()() {
+ types::for_each(types::cpp20_input_iterator_list<int*>(), Test<Iter>());
+ }
+};
+
+template <class Ptr>
+using cpp20_proxy_in_iterator_list =
+ types::type_list<Cpp20InputProxyIterator<Ptr>,
+ ForwardProxyIterator<Ptr>,
+ BidirectionalProxyIterator<Ptr>,
+ RandomAccessProxyIterator<Ptr>,
+ ContiguousProxyIterator<Ptr>>;
+
+struct TestProxyInIterators {
+ template <class Iter>
+ TEST_CONSTEXPR_CXX20 void operator()() {
+ types::for_each(cpp20_proxy_in_iterator_list<int*>(), Test<Iter>());
+ }
+};
constexpr void test_rval_range() {
{
- using Expected = std::ranges::swap_ranges_result<std::array<int, 3>::iterator, std::ranges::dangling>;
+ using Expected = std::ranges::swap_ranges_result<std::array<int, 3>::iterator, std::ranges::dangling>;
std::array<int, 3> r = {1, 2, 3};
std::same_as<Expected> auto a = std::ranges::swap_ranges(r, std::array{4, 5, 6});
assert((r == std::array{4, 5, 6}));
assert(a.in1 == r.begin() + 3);
}
{
std::array<int, 3> r = {1, 2, 3};
- using Expected = std::ranges::swap_ranges_result<std::ranges::dangling, std::array<int, 3>::iterator>;
+ using Expected = std::ranges::swap_ranges_result<std::ranges::dangling, std::array<int, 3>::iterator>;
std::same_as<Expected> auto b = std::ranges::swap_ranges(std::array{4, 5, 6}, r);
assert((r == std::array{4, 5, 6}));
assert(b.in2 == r.begin() + 3);
}
}
-template <class Out>
-constexpr void test_proxy_in_iterators() {
- test_iterators<ProxyIterator<cpp20_input_iterator<int*>>, Out>();
- test_iterators<ProxyIterator<forward_iterator<int*>>, Out>();
- test_iterators<ProxyIterator<bidirectional_iterator<int*>>, Out>();
- test_iterators<ProxyIterator<random_access_iterator<int*>>, Out>();
- test_iterators<ProxyIterator<contiguous_iterator<int*>>, Out>();
-}
-
constexpr bool test() {
test_range();
-
- test_iterators<cpp20_input_iterator<int*>, cpp20_input_iterator<int*>>();
- test_iterators<cpp20_input_iterator<int*>, forward_iterator<int*>>();
- test_iterators<cpp20_input_iterator<int*>, bidirectional_iterator<int*>>();
- test_iterators<cpp20_input_iterator<int*>, random_access_iterator<int*>>();
- test_iterators<cpp20_input_iterator<int*>, int*>();
-
- test_iterators<forward_iterator<int*>, cpp20_input_iterator<int*>>();
- test_iterators<forward_iterator<int*>, forward_iterator<int*>>();
- test_iterators<forward_iterator<int*>, bidirectional_iterator<int*>>();
- test_iterators<forward_iterator<int*>, random_access_iterator<int*>>();
- test_iterators<forward_iterator<int*>, int*>();
-
- test_iterators<bidirectional_iterator<int*>, cpp20_input_iterator<int*>>();
- test_iterators<bidirectional_iterator<int*>, forward_iterator<int*>>();
- test_iterators<bidirectional_iterator<int*>, bidirectional_iterator<int*>>();
- test_iterators<bidirectional_iterator<int*>, random_access_iterator<int*>>();
- test_iterators<bidirectional_iterator<int*>, int*>();
-
- test_iterators<random_access_iterator<int*>, cpp20_input_iterator<int*>>();
- test_iterators<random_access_iterator<int*>, forward_iterator<int*>>();
- test_iterators<random_access_iterator<int*>, bidirectional_iterator<int*>>();
- test_iterators<random_access_iterator<int*>, random_access_iterator<int*>>();
- test_iterators<random_access_iterator<int*>, int*>();
-
- test_iterators<int*, cpp20_input_iterator<int*>>();
- test_iterators<int*, forward_iterator<int*>>();
- test_iterators<int*, bidirectional_iterator<int*>>();
- test_iterators<int*, random_access_iterator<int*>>();
- test_iterators<int*, int*>();
-
- test_proxy_in_iterators<ProxyIterator<cpp20_input_iterator<int*>>>();
- test_proxy_in_iterators<ProxyIterator<forward_iterator<int*>>>();
- test_proxy_in_iterators<ProxyIterator<bidirectional_iterator<int*>>>();
- test_proxy_in_iterators<ProxyIterator<random_access_iterator<int*>>>();
- test_proxy_in_iterators<ProxyIterator<contiguous_iterator<int*>>>();
-
test_sentinel();
test_different_lengths();
test_borrowed_input_range();
test_rval_range();
+ types::for_each(types::cpp20_input_iterator_list<int*>(), TestIterators());
+ types::for_each(cpp20_proxy_in_iterator_list<int*>(), TestProxyInIterators());
----------------
ldionne wrote:
```suggestion
types::for_each(types::cpp20_input_iterator_list<int*>(), []<class Iter1> {
types::for_each(types::cpp20_input_iterator_list<int*>(), []<class Iter2> {
test_iterators<Iter1, Iter2>();
test_iterators<ProxyIterator<Iter1>, ProxyIterator<Iter2>>();
});
});
```
https://github.com/llvm/llvm-project/pull/121138
More information about the libcxx-commits
mailing list