Skip to content

Commit 634d9b4

Browse files
committed
Test [range.join.with.iterator]
1 parent 6444d04 commit 634d9b4

File tree

9 files changed

+2078
-0
lines changed

9 files changed

+2078
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10+
// UNSUPPORTED: !c++experimental
11+
12+
// <ranges>
13+
14+
// iterator() = default;
15+
16+
#include <ranges>
17+
18+
#include <cassert>
19+
#include <initializer_list>
20+
#include <iterator>
21+
#include <type_traits>
22+
#include <utility>
23+
24+
#include "../types.h"
25+
#include "test_comparisons.h"
26+
#include "test_iterators.h"
27+
28+
constexpr bool test() {
29+
{ // `V` and `Pattern` model forward range
30+
using Inner = BasicVectorView<int, ViewProperties{}, forward_iterator>;
31+
using V = BasicVectorView<Inner, ViewProperties{}, forward_iterator>;
32+
using Pattern = Inner;
33+
using JWV = std::ranges::join_with_view<V, Pattern>;
34+
using Iter = std::ranges::iterator_t<JWV>;
35+
using ConstIter = std::ranges::iterator_t<const JWV>;
36+
37+
Iter iter;
38+
assert(testEquality(iter, Iter{}, true));
39+
40+
ConstIter citer;
41+
assert(testEquality(citer, ConstIter{}, true));
42+
assert(testEquality(iter, citer, true));
43+
44+
std::ranges::join_with_view<V, Pattern> jwv(V{Inner{1, 2}, Inner{2, 1}}, Pattern{3, 3});
45+
Iter jwv_iter = jwv.begin();
46+
ConstIter jwv_citer = std::as_const(jwv).begin();
47+
assert(testEquality(jwv_iter, jwv_citer, true));
48+
49+
assert(testEquality(jwv_iter, iter, false));
50+
assert(testEquality(jwv_iter, citer, false));
51+
assert(testEquality(jwv_citer, iter, false));
52+
assert(testEquality(jwv_citer, citer, false));
53+
}
54+
55+
{ // `InnerIter` is not default constructible (does not model forward iterator, JWV cannot be const-accessed)
56+
using Inner = BasicVectorView<char, ViewProperties{.common = false}, EqComparableInputIter>;
57+
using V = BasicVectorView<Inner, ViewProperties{.common = false}, forward_iterator>;
58+
using Pattern = BasicVectorView<char, ViewProperties{}, forward_iterator>;
59+
using JWV = std::ranges::join_with_view<V, Pattern>;
60+
using Iter = std::ranges::iterator_t<JWV>;
61+
62+
Iter iter;
63+
assert(testEquality(iter, Iter{}, true));
64+
65+
std::ranges::join_with_view<V, Pattern> jwv(V{Inner{'a', 'b'}, Inner{'c', 'd'}}, Pattern{',', ' '});
66+
Iter jwv_iter = jwv.begin();
67+
assert(testEquality(jwv_iter, iter, false));
68+
}
69+
70+
return true;
71+
}
72+
73+
int main(int, char**) {
74+
test();
75+
#if __cpp_lib_variant >= 202106
76+
static_assert(test());
77+
#endif
78+
79+
return 0;
80+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10+
// UNSUPPORTED: !c++experimental
11+
12+
// <ranges>
13+
14+
// constexpr iterator(iterator<!Const> i)
15+
// requires Const && convertible_to<iterator_t<V>, OuterIter> &&
16+
// convertible_to<iterator_t<InnerRng>, InnerIter> &&
17+
// convertible_to<iterator_t<Pattern>, PatternIter>;
18+
19+
#include <ranges>
20+
21+
#include <cassert>
22+
#include <vector>
23+
24+
#include "../types.h"
25+
26+
constexpr bool test() {
27+
{ // Regular conversion from `!Const` to `Const` iterator
28+
std::vector<std::vector<int>> vec = {{1, 2}, {3, 4}, {5, 6}};
29+
int pattern = 0;
30+
std::ranges::join_with_view jwv(vec, pattern);
31+
auto it = jwv.begin();
32+
assert(*it == 1);
33+
34+
using CIter = std::ranges::iterator_t<const decltype(jwv)>;
35+
const CIter cit1 = it; // `cit1` points to element of `V`
36+
assert(*cit1 == 1);
37+
assert(cit1 == it);
38+
39+
std::ranges::advance(it, 2);
40+
assert(*it == 0);
41+
CIter cit2 = it; // `cit2` points to element of `Pattern`
42+
assert(*cit2 == 0);
43+
assert(cit2 == it);
44+
45+
++it;
46+
assert(*it == 3);
47+
CIter cit3 = it;
48+
assert(*cit3 == 3);
49+
assert(cit3 == it);
50+
51+
--cit3;
52+
assert(cit2 == cit3);
53+
}
54+
55+
{ // Test conversion from `Const` to `!Const` (should be invalid)
56+
using V = std::vector<std::vector<int>>;
57+
using Pattern = std::ranges::single_view<int>;
58+
using JWV = std::ranges::join_with_view<std::views::all_t<V>, Pattern>;
59+
using Iter = std::ranges::iterator_t<JWV>;
60+
using CIter = std::ranges::iterator_t<const JWV>;
61+
static_assert(!std::convertible_to<CIter, Iter>);
62+
static_assert(!std::constructible_from<Iter, CIter>);
63+
}
64+
65+
{ // When `convertible_to<iterator_t<V>, OuterIter>` is not modeled
66+
using Inner = std::vector<short>;
67+
using V = ConstOppositeView<Inner>;
68+
using Pattern = std::ranges::single_view<short>;
69+
using JWV = std::ranges::join_with_view<V, Pattern>;
70+
using Iter = std::ranges::iterator_t<JWV>;
71+
using CIter = std::ranges::iterator_t<const JWV>;
72+
static_assert(!std::convertible_to<CIter, Iter>);
73+
static_assert(!std::constructible_from<Iter, CIter>);
74+
}
75+
76+
{ // When `convertible_to<iterator_t<InnerRng>, InnerIter>` is not modeled
77+
using Inner = ConstOppositeView<long>;
78+
using V = std::vector<Inner>;
79+
using Pattern = std::ranges::single_view<long>;
80+
using JWV = std::ranges::join_with_view<std::views::all_t<V>, Pattern>;
81+
using Iter = std::ranges::iterator_t<JWV>;
82+
using CIter = std::ranges::iterator_t<const JWV>;
83+
static_assert(!std::convertible_to<CIter, Iter>);
84+
static_assert(!std::constructible_from<Iter, CIter>);
85+
}
86+
87+
{ // When `convertible_to<iterator_t<Pattern>, PatternIter>` is not modeled
88+
using V = std::vector<std::vector<long long>>;
89+
using Pattern = ConstOppositeView<long long>;
90+
using JWV = std::ranges::join_with_view<std::views::all_t<V>, Pattern>;
91+
using Iter = std::ranges::iterator_t<JWV>;
92+
using CIter = std::ranges::iterator_t<const JWV>;
93+
static_assert(!std::convertible_to<CIter, Iter>);
94+
static_assert(!std::constructible_from<Iter, CIter>);
95+
}
96+
97+
return true;
98+
}
99+
100+
int main(int, char**) {
101+
test();
102+
#if __cpp_lib_variant >= 202106
103+
static_assert(test());
104+
#endif
105+
106+
return 0;
107+
}

0 commit comments

Comments
 (0)