Skip to content

Commit 6f32101

Browse files
committed
iterator test
1 parent b5ab483 commit 6f32101

File tree

5 files changed

+477
-0
lines changed

5 files changed

+477
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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+
11+
// <flat_set>
12+
13+
// iterator begin() noexcept;
14+
// const_iterator begin() const noexcept
15+
// iterator end() noexcept;
16+
// const_iterator end() const noexcept;
17+
//
18+
// const_iterator cbegin() const noexcept;
19+
// const_iterator cend() const noexcept;
20+
21+
#include <cassert>
22+
#include <cstddef>
23+
#include <deque>
24+
#include <flat_set>
25+
#include <functional>
26+
#include <string>
27+
28+
#include "MinSequenceContainer.h"
29+
#include "test_macros.h"
30+
#include "min_allocator.h"
31+
32+
template <class KeyContainer>
33+
void test_one() {
34+
using Key = typename KeyContainer::value_type;
35+
using M = std::flat_multiset<Key, std::less<Key>, KeyContainer>;
36+
37+
M m = {1, 2, 3, 4, 1, 4, 2, 3, 1};
38+
int expected[] = {1, 1, 1, 2, 2, 3, 3, 4, 4};
39+
const M& cm = m;
40+
ASSERT_SAME_TYPE(decltype(m.begin()), typename M::iterator);
41+
ASSERT_SAME_TYPE(decltype(m.cbegin()), typename M::const_iterator);
42+
ASSERT_SAME_TYPE(decltype(cm.begin()), typename M::const_iterator);
43+
ASSERT_SAME_TYPE(decltype(m.end()), typename M::iterator);
44+
ASSERT_SAME_TYPE(decltype(m.cend()), typename M::const_iterator);
45+
ASSERT_SAME_TYPE(decltype(cm.end()), typename M::const_iterator);
46+
static_assert(noexcept(m.begin()));
47+
static_assert(noexcept(cm.begin()));
48+
static_assert(noexcept(m.cbegin()));
49+
static_assert(noexcept(m.end()));
50+
static_assert(noexcept(cm.end()));
51+
static_assert(noexcept(m.cend()));
52+
assert(m.size() == 9);
53+
assert(std::distance(m.begin(), m.end()) == 9);
54+
assert(std::distance(cm.begin(), cm.end()) == 9);
55+
assert(std::distance(m.cbegin(), m.cend()) == 9);
56+
typename M::iterator i; // default-construct
57+
i = m.begin(); // move-assignment
58+
typename M::const_iterator k = i; // converting constructor
59+
assert(i == k); // comparison
60+
for (int j = 0; j < 9; ++j, ++i) { // pre-increment
61+
assert(*i == expected[j]); // operator*
62+
}
63+
assert(i == m.end());
64+
for (int j = 8; j >= 0; --j) {
65+
--i; // pre-decrement
66+
assert((*i) == expected[j]);
67+
}
68+
assert(i == m.begin());
69+
}
70+
71+
void test() {
72+
test_one<std::vector<int>>();
73+
test_one<std::deque<int>>();
74+
test_one<MinSequenceContainer<int>>();
75+
test_one<std::vector<int, min_allocator<int>>>();
76+
77+
{
78+
// N3644 testing
79+
using C = std::flat_multiset<int>;
80+
C::iterator ii1{}, ii2{};
81+
C::iterator ii4 = ii1;
82+
C::const_iterator cii{};
83+
assert(ii1 == ii2);
84+
assert(ii1 == ii4);
85+
assert(!(ii1 != ii2));
86+
87+
assert((ii1 == cii));
88+
assert((cii == ii1));
89+
assert(!(ii1 != cii));
90+
assert(!(cii != ii1));
91+
}
92+
}
93+
94+
int main(int, char**) {
95+
test();
96+
97+
return 0;
98+
}
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
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+
11+
// <flat_set>
12+
13+
// flat_multiset iterators should be C++20 random access iterators
14+
15+
#include <compare>
16+
#include <concepts>
17+
#include <deque>
18+
#include <flat_set>
19+
#include <functional>
20+
#include <vector>
21+
22+
#include "MinSequenceContainer.h"
23+
#include "test_macros.h"
24+
#include "min_allocator.h"
25+
26+
template <class KeyContainer>
27+
void test_one() {
28+
using Key = typename KeyContainer::value_type;
29+
using M = std::flat_multiset<Key, std::less<Key>, KeyContainer>;
30+
using KI = typename KeyContainer::iterator;
31+
using I = M::iterator;
32+
using CI = M::const_iterator;
33+
using RI = M::reverse_iterator;
34+
using CRI = M::const_reverse_iterator;
35+
36+
static_assert(std::equality_comparable<I>);
37+
static_assert(std::equality_comparable<CI>);
38+
static_assert(std::equality_comparable<RI>);
39+
static_assert(std::equality_comparable<CRI>);
40+
41+
static_assert(std::totally_ordered<I>);
42+
static_assert(std::totally_ordered<CI>);
43+
static_assert(std::totally_ordered<RI>);
44+
static_assert(std::totally_ordered<CRI>);
45+
46+
M m = {1, 1, 3, 4};
47+
48+
I i1 = m.begin();
49+
I i2 = m.begin() + 1;
50+
51+
assert(i1 == i1);
52+
assert(!(i1 != i1));
53+
assert(i1 != i2);
54+
assert(!(i1 == i2));
55+
assert(i1 < i2);
56+
assert(!(i1 < i1));
57+
assert(i1 <= i1);
58+
assert(i1 <= i2);
59+
assert(!(i2 <= i1));
60+
assert(i2 > i1);
61+
assert(!(i2 > i2));
62+
assert(i2 >= i1);
63+
assert(i2 >= i2);
64+
assert(!(i1 >= i2));
65+
66+
CI ci1 = m.cbegin();
67+
CI ci2 = m.cbegin() + 1;
68+
assert(ci1 == ci1);
69+
assert(!(ci1 != ci1));
70+
assert(ci1 != ci2);
71+
assert(!(ci1 == ci2));
72+
assert(ci1 < ci2);
73+
assert(!(ci1 < ci1));
74+
assert(ci1 <= ci1);
75+
assert(ci1 <= ci2);
76+
assert(!(ci2 <= ci1));
77+
assert(ci2 > ci1);
78+
assert(!(ci2 > ci2));
79+
assert(ci2 >= ci1);
80+
assert(ci2 >= ci2);
81+
assert(!(ci1 >= ci2));
82+
83+
RI ri1 = m.rbegin();
84+
RI ri2 = m.rbegin() + 1;
85+
assert(ri1 == ri1);
86+
assert(!(ri1 != ri1));
87+
assert(ri1 != ri2);
88+
assert(!(ri1 == ri2));
89+
assert(ri1 < ri2);
90+
assert(!(ri1 < ri1));
91+
assert(ri1 <= ri1);
92+
assert(ri1 <= ri2);
93+
assert(!(ri2 <= ri1));
94+
assert(ri2 > ri1);
95+
assert(!(ri2 > ri2));
96+
assert(ri2 >= ri1);
97+
assert(ri2 >= ri2);
98+
assert(!(ri1 >= ri2));
99+
100+
CRI cri1 = m.crbegin();
101+
CRI cri2 = m.crbegin() + 1;
102+
assert(cri1 == cri1);
103+
assert(!(cri1 != cri1));
104+
assert(cri1 != cri2);
105+
assert(!(cri1 == cri2));
106+
assert(cri1 < cri2);
107+
assert(!(cri1 < cri1));
108+
assert(cri1 <= cri1);
109+
assert(cri1 <= cri2);
110+
assert(!(cri2 <= cri1));
111+
assert(cri2 > cri1);
112+
assert(!(cri2 > cri2));
113+
assert(cri2 >= cri1);
114+
assert(cri2 >= cri2);
115+
assert(!(cri1 >= cri2));
116+
117+
if constexpr (std::three_way_comparable<KI>) {
118+
static_assert(std::three_way_comparable<I>); // ...of course the wrapped iterators still support <=>.
119+
static_assert(std::three_way_comparable<CI>);
120+
static_assert(std::three_way_comparable<RI>);
121+
static_assert(std::three_way_comparable<CRI>);
122+
static_assert(std::same_as<decltype(I() <=> I()), std::strong_ordering>);
123+
static_assert(std::same_as<decltype(I() <=> CI()), std::strong_ordering>);
124+
static_assert(std::same_as<decltype(CI() <=> CI()), std::strong_ordering>);
125+
static_assert(std::same_as<decltype(RI() <=> RI()), std::strong_ordering>);
126+
static_assert(std::same_as<decltype(RI() <=> CRI()), std::strong_ordering>);
127+
static_assert(std::same_as<decltype(CRI() <=> CRI()), std::strong_ordering>);
128+
129+
assert(i1 <=> i1 == std::strong_ordering::equivalent);
130+
assert(i1 <=> i2 == std::strong_ordering::less);
131+
assert(i2 <=> i1 == std::strong_ordering::greater);
132+
133+
assert(ci1 <=> ci1 == std::strong_ordering::equivalent);
134+
assert(ci1 <=> ci2 == std::strong_ordering::less);
135+
assert(ci2 <=> ci1 == std::strong_ordering::greater);
136+
137+
assert(ri1 <=> ri1 == std::strong_ordering::equivalent);
138+
assert(ri1 <=> ri2 == std::strong_ordering::less);
139+
assert(ri2 <=> ri1 == std::strong_ordering::greater);
140+
141+
assert(cri1 <=> cri1 == std::strong_ordering::equivalent);
142+
assert(cri1 <=> cri2 == std::strong_ordering::less);
143+
assert(cri2 <=> cri1 == std::strong_ordering::greater);
144+
}
145+
}
146+
147+
void test() {
148+
test_one<std::vector<int>>();
149+
test_one<std::deque<int>>();
150+
test_one<MinSequenceContainer<int>>();
151+
test_one<std::vector<int, min_allocator<int>>>();
152+
}
153+
154+
int main(int, char**) {
155+
test();
156+
157+
return 0;
158+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
11+
// <flat_set>
12+
13+
// iterator, const_iterator, reverse_iterator, const_reverse_iterator
14+
15+
#include <flat_set>
16+
#include <deque>
17+
#include <functional>
18+
#include <iterator>
19+
#include <string>
20+
#include <vector>
21+
#include <type_traits>
22+
23+
#include "MinSequenceContainer.h"
24+
#include "test_macros.h"
25+
#include "min_allocator.h"
26+
27+
template <class KeyContainer>
28+
void test() {
29+
using Key = typename KeyContainer::value_type;
30+
using C = std::flat_multiset<Key, std::less<Key>, KeyContainer>;
31+
using I = C::iterator;
32+
using CI = C::const_iterator;
33+
using RI = C::reverse_iterator;
34+
using CRI = C::const_reverse_iterator;
35+
static_assert(std::random_access_iterator<I>);
36+
static_assert(std::random_access_iterator<CI>);
37+
static_assert(std::random_access_iterator<RI>);
38+
static_assert(std::random_access_iterator<CRI>);
39+
static_assert(!std::contiguous_iterator<RI>);
40+
static_assert(!std::contiguous_iterator<CRI>);
41+
static_assert(!std::indirectly_writable<I, std::pair<int, char>>);
42+
static_assert(!std::indirectly_writable<CI, std::pair<int, char>>);
43+
static_assert(!std::indirectly_writable<RI, std::pair<int, char>>);
44+
static_assert(!std::indirectly_writable<CRI, std::pair<int, char>>);
45+
static_assert(std::sentinel_for<I, I>);
46+
static_assert(std::sentinel_for<I, CI>);
47+
static_assert(!std::sentinel_for<I, RI>);
48+
static_assert(!std::sentinel_for<I, CRI>);
49+
static_assert(std::sentinel_for<CI, I>);
50+
static_assert(std::sentinel_for<CI, CI>);
51+
static_assert(!std::sentinel_for<CI, RI>);
52+
static_assert(!std::sentinel_for<CI, CRI>);
53+
static_assert(!std::sentinel_for<RI, I>);
54+
static_assert(!std::sentinel_for<RI, CI>);
55+
static_assert(std::sentinel_for<RI, RI>);
56+
static_assert(std::sentinel_for<RI, CRI>);
57+
static_assert(!std::sentinel_for<CRI, I>);
58+
static_assert(!std::sentinel_for<CRI, CI>);
59+
static_assert(std::sentinel_for<CRI, RI>);
60+
static_assert(std::sentinel_for<CRI, CRI>);
61+
static_assert(std::indirectly_movable_storable<I, Key*>);
62+
static_assert(std::indirectly_movable_storable<CI, Key*>);
63+
static_assert(std::indirectly_movable_storable<RI, Key*>);
64+
static_assert(std::indirectly_movable_storable<CRI, Key*>);
65+
66+
static_assert(std::is_same_v<typename std::iterator_traits<I>::iterator_category, std::random_access_iterator_tag>);
67+
static_assert(std::is_same_v<typename std::iterator_traits<CI>::iterator_category, std::random_access_iterator_tag>);
68+
static_assert(std::is_same_v<typename std::iterator_traits<RI>::iterator_category, std::random_access_iterator_tag>);
69+
static_assert(std::is_same_v<typename std::iterator_traits<CRI>::iterator_category, std::random_access_iterator_tag>);
70+
}
71+
72+
void test() {
73+
test<std::vector<int>>();
74+
test<std::deque<int>>();
75+
test<MinSequenceContainer<int>>();
76+
test<std::vector<int, min_allocator<int>>>();
77+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
11+
#include <concepts>
12+
#include <deque>
13+
#include <flat_set>
14+
#include <functional>
15+
#include <ranges>
16+
#include <string>
17+
#include <vector>
18+
#include "MinSequenceContainer.h"
19+
#include "min_allocator.h"
20+
21+
template <class KeyContainer>
22+
void test() {
23+
{
24+
using Key = typename KeyContainer::value_type;
25+
using C = std::flat_multiset<Key, std::less<Key>, KeyContainer>;
26+
27+
static_assert(std::same_as<std::ranges::iterator_t<C>, typename C::iterator>);
28+
static_assert(std::ranges::random_access_range<C>);
29+
static_assert(std::ranges::common_range<C>);
30+
static_assert(std::ranges::input_range<C>);
31+
static_assert(!std::ranges::view<C>);
32+
static_assert(std::ranges::sized_range<C>);
33+
static_assert(!std::ranges::borrowed_range<C>);
34+
static_assert(std::ranges::viewable_range<C>);
35+
36+
static_assert(std::same_as<std::ranges::iterator_t<const C>, typename C::const_iterator>);
37+
static_assert(std::ranges::random_access_range<const C>);
38+
static_assert(std::ranges::common_range<const C>);
39+
static_assert(std::ranges::input_range<const C>);
40+
static_assert(!std::ranges::view<const C>);
41+
static_assert(std::ranges::sized_range<const C>);
42+
static_assert(!std::ranges::borrowed_range<const C>);
43+
static_assert(!std::ranges::viewable_range<const C>);
44+
}
45+
}
46+
47+
void test() {
48+
test<std::vector<int>>();
49+
test<std::deque<int>>();
50+
test<MinSequenceContainer<int>>();
51+
test<std::vector<int, min_allocator<int>>>();
52+
}

0 commit comments

Comments
 (0)