Skip to content

Commit bf5350d

Browse files
committed
Further refactoring by addressing ldionne's comments
1 parent 1339b30 commit bf5350d

File tree

4 files changed

+176
-175
lines changed

4 files changed

+176
-175
lines changed

libcxx/test/std/algorithms/alg.modifying.operations/alg.swap/iter_swap.pass.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@
1010

1111
// template<Iterator Iter1, Iterator Iter2>
1212
// requires HasSwap<Iter1::reference, Iter2::reference>
13-
// void
14-
// iter_swap(Iter1 a, Iter2 b);
13+
// void iter_swap(Iter1 a, Iter2 b); // constexpr since C++20
1514

1615
#include <algorithm>
1716
#include <cassert>
@@ -20,22 +19,22 @@
2019
#include "test_iterators.h"
2120
#include "type_algorithms.h"
2221

23-
template <class Iter1>
24-
struct Test {
25-
template <class Iter2>
26-
TEST_CONSTEXPR_CXX20 void operator()() {
27-
int i = 1;
28-
int j = 2;
29-
std::iter_swap(Iter1(&i), Iter2(&j));
30-
assert(i == 2 && j == 1);
31-
}
32-
};
33-
3422
struct TestIterators {
3523
template <class Iter>
3624
TEST_CONSTEXPR_CXX20 void operator()() {
37-
types::for_each(types::forward_iterator_list<int*>(), Test<Iter>());
25+
types::for_each(types::forward_iterator_list<int*>(), TestImpl<Iter>());
3826
}
27+
28+
template <class Iter1>
29+
struct TestImpl {
30+
template <class Iter2>
31+
TEST_CONSTEXPR_CXX20 void operator()() {
32+
int i = 1;
33+
int j = 2;
34+
std::iter_swap(Iter1(&i), Iter2(&j));
35+
assert(i == 2 && j == 1);
36+
}
37+
};
3938
};
4039

4140
TEST_CONSTEXPR_CXX20 bool test() {

libcxx/test/std/algorithms/alg.modifying.operations/alg.swap/ranges.swap_ranges.pass.cpp

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include <cassert>
2525
#include <ranges>
2626

27+
#include <cstdio>
28+
2729
#include "test_iterators.h"
2830
#include "type_algorithms.h"
2931

@@ -102,43 +104,18 @@ constexpr void test_sentinel() {
102104
assert(std::ranges::equal(j, std::array{1, 2, 3}));
103105
}
104106

105-
template <class Iter1>
106-
struct Test {
107-
template <class Iter2>
108-
TEST_CONSTEXPR_CXX20 void operator()() {
109-
using Expected = std::ranges::swap_ranges_result<Iter1, Iter2>;
110-
int a[3] = {1, 2, 3};
111-
int b[3] = {4, 5, 6};
112-
std::same_as<Expected> auto r =
113-
std::ranges::swap_ranges(Iter1(a), sentinel_wrapper(Iter1(a + 3)), Iter2(b), sentinel_wrapper(Iter2(b + 3)));
114-
assert(base(r.in1) == a + 3);
115-
assert(base(r.in2) == b + 3);
116-
assert(std::ranges::equal(a, std::array{4, 5, 6}));
117-
assert(std::ranges::equal(b, std::array{1, 2, 3}));
118-
}
119-
};
120-
121-
struct TestIterators {
122-
template <class Iter>
123-
TEST_CONSTEXPR_CXX20 void operator()() {
124-
types::for_each(types::cpp20_input_iterator_list<int*>(), Test<Iter>());
125-
}
126-
};
127-
128-
template <class Ptr>
129-
using cpp20_proxy_in_iterator_list =
130-
types::type_list<Cpp20InputProxyIterator<Ptr>,
131-
ForwardProxyIterator<Ptr>,
132-
BidirectionalProxyIterator<Ptr>,
133-
RandomAccessProxyIterator<Ptr>,
134-
ContiguousProxyIterator<Ptr>>;
135-
136-
struct TestProxyInIterators {
137-
template <class Iter>
138-
TEST_CONSTEXPR_CXX20 void operator()() {
139-
types::for_each(cpp20_proxy_in_iterator_list<int*>(), Test<Iter>());
140-
}
141-
};
107+
template <class Iter1, class Iter2>
108+
TEST_CONSTEXPR_CXX20 void test_iterators() {
109+
using Expected = std::ranges::swap_ranges_result<Iter1, Iter2>;
110+
int a[3] = {1, 2, 3};
111+
int b[3] = {4, 5, 6};
112+
std::same_as<Expected> auto r =
113+
std::ranges::swap_ranges(Iter1(a), sentinel_wrapper(Iter1(a + 3)), Iter2(b), sentinel_wrapper(Iter2(b + 3)));
114+
assert(base(r.in1) == a + 3);
115+
assert(base(r.in2) == b + 3);
116+
assert(std::ranges::equal(a, std::array{4, 5, 6}));
117+
assert(std::ranges::equal(b, std::array{1, 2, 3}));
118+
}
142119

143120
constexpr void test_rval_range() {
144121
{
@@ -163,8 +140,13 @@ constexpr bool test() {
163140
test_different_lengths();
164141
test_borrowed_input_range();
165142
test_rval_range();
166-
types::for_each(types::cpp20_input_iterator_list<int*>(), TestIterators());
167-
types::for_each(cpp20_proxy_in_iterator_list<int*>(), TestProxyInIterators());
143+
144+
types::for_each(types::cpp20_input_iterator_list<int*>(), []<class Iter1>() {
145+
types::for_each(types::cpp20_input_iterator_list<int*>(), []<class Iter2>() {
146+
test_iterators<Iter1, Iter2>();
147+
test_iterators<ProxyIterator<Iter1>, ProxyIterator<Iter2>>();
148+
});
149+
});
168150

169151
return true;
170152
}

libcxx/test/std/algorithms/alg.modifying.operations/alg.swap/swap_ranges.pass.cpp

Lines changed: 45 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -23,60 +23,50 @@
2323
#include "test_iterators.h"
2424
#include "type_algorithms.h"
2525

26-
template <class Iter1>
27-
struct Test1 {
28-
template <class Iter2>
29-
TEST_CONSTEXPR_CXX20 void operator()() {
30-
int a[] = {1, 2, 3};
31-
int b[] = {4, 5, 6};
32-
Iter2 r = std::swap_ranges(Iter1(a), Iter1(a + 3), Iter2(b));
33-
assert(base(r) == b + 3);
34-
assert(a[0] == 4 && a[1] == 5 && a[2] == 6);
35-
assert(b[0] == 1 && b[1] == 2 && b[2] == 3);
36-
}
37-
};
38-
3926
struct TestPtr {
4027
template <class Iter>
4128
TEST_CONSTEXPR_CXX20 void operator()() {
42-
types::for_each(types::forward_iterator_list<int*>(), Test1<Iter>());
29+
types::for_each(types::forward_iterator_list<int*>(), TestPtrImpl<Iter>());
4330
}
44-
};
4531

46-
TEST_CONSTEXPR_CXX20 bool test_ptr() {
47-
types::for_each(types::forward_iterator_list<int*>(), TestPtr());
48-
return true;
49-
}
50-
51-
#if TEST_STD_VER >= 11
52-
template <class Iter1>
53-
struct Test2 {
54-
template <class Iter2>
55-
TEST_CONSTEXPR_CXX23 void operator()() {
56-
std::unique_ptr<int> a[3];
57-
for (int k = 0; k < 3; ++k)
58-
a[k].reset(new int(k + 1));
59-
std::unique_ptr<int> b[3];
60-
for (int k = 0; k < 3; ++k)
61-
b[k].reset(new int(k + 4));
62-
Iter2 r = std::swap_ranges(Iter1(a), Iter1(a + 3), Iter2(b));
63-
assert(base(r) == b + 3);
64-
assert(*a[0] == 4 && *a[1] == 5 && *a[2] == 6);
65-
assert(*b[0] == 1 && *b[1] == 2 && *b[2] == 3);
66-
}
32+
template <class Iter1>
33+
struct TestPtrImpl {
34+
template <class Iter2>
35+
TEST_CONSTEXPR_CXX20 void operator()() {
36+
int a[] = {1, 2, 3};
37+
int b[] = {4, 5, 6};
38+
Iter2 r = std::swap_ranges(Iter1(a), Iter1(a + 3), Iter2(b));
39+
assert(base(r) == b + 3);
40+
assert(a[0] == 4 && a[1] == 5 && a[2] == 6);
41+
assert(b[0] == 1 && b[1] == 2 && b[2] == 3);
42+
}
43+
};
6744
};
6845

69-
struct TestUnqPtr {
46+
#if TEST_STD_VER >= 11
47+
struct TestUniquePtr {
7048
template <class Iter>
7149
TEST_CONSTEXPR_CXX20 void operator()() {
72-
types::for_each(types::forward_iterator_list<std::unique_ptr<int>*>(), Test2<Iter>());
50+
types::for_each(types::forward_iterator_list<std::unique_ptr<int>*>(), TestUniquePtrImpl<Iter>());
7351
}
74-
};
7552

76-
TEST_CONSTEXPR_CXX23 bool test_unq_ptr() {
77-
types::for_each(types::forward_iterator_list<std::unique_ptr<int>*>(), TestUnqPtr());
78-
return true;
79-
}
53+
template <class Iter1>
54+
struct TestUniquePtrImpl {
55+
template <class Iter2>
56+
TEST_CONSTEXPR_CXX23 void operator()() {
57+
std::unique_ptr<int> a[3];
58+
for (int k = 0; k < 3; ++k)
59+
a[k].reset(new int(k + 1));
60+
std::unique_ptr<int> b[3];
61+
for (int k = 0; k < 3; ++k)
62+
b[k].reset(new int(k + 4));
63+
Iter2 r = std::swap_ranges(Iter1(a), Iter1(a + 3), Iter2(b));
64+
assert(base(r) == b + 3);
65+
assert(*a[0] == 4 && *a[1] == 5 && *a[2] == 6);
66+
assert(*b[0] == 1 && *b[1] == 2 && *b[2] == 3);
67+
}
68+
};
69+
};
8070
#endif
8171

8272
TEST_CONSTEXPR_CXX20 bool test_simple_cases() {
@@ -90,33 +80,35 @@ TEST_CONSTEXPR_CXX20 bool test_simple_cases() {
9080
{
9181
std::array<std::array<int, 2>, 2> a = {{{0, 1}, {2, 3}}}, a0 = a;
9282
std::array<std::array<int, 2>, 2> b = {{{9, 8}, {7, 6}}}, b0 = b;
93-
std::swap(a, b);
83+
std::swap_ranges(a.begin(), a.end(), b.begin());
9484
assert(a == b0);
9585
assert(b == a0);
9686
}
9787
{
9888
std::array<std::array<int, 3>, 3> a = {{{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}}, a0 = a;
9989
std::array<std::array<int, 3>, 3> b = {{{9, 8, 7}, {6, 5, 4}, {3, 2, 1}}}, b0 = b;
100-
std::swap(a, b);
90+
std::swap_ranges(a.begin(), a.end(), b.begin());
10191
assert(a == b0);
10292
assert(b == a0);
10393
}
10494

10595
return true;
10696
}
10797

108-
int main(int, char**) {
98+
TEST_CONSTEXPR_CXX20 bool tests() {
10999
test_simple_cases();
110-
test_ptr();
100+
types::for_each(types::forward_iterator_list<int*>(), TestPtr());
111101
#if TEST_STD_VER >= 11
112-
test_unq_ptr();
102+
types::for_each(types::forward_iterator_list<std::unique_ptr<int>*>(), TestUniquePtr());
113103
#endif
104+
return true;
105+
}
106+
107+
int main(int, char**) {
108+
tests();
114109
#if TEST_STD_VER >= 20
115-
static_assert(test_simple_cases());
116-
static_assert(test_ptr());
117-
#endif
118-
#if TEST_STD_VER >= 23
119-
static_assert(test_unq_ptr());
110+
static_assert(tests());
120111
#endif
112+
121113
return 0;
122114
}

0 commit comments

Comments
 (0)