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// XFAIL: availability-filesystem-missing
10
11// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
12
13// Make sure the various containers' iterators are not broken by the use of `std::rel_ops`.
14
15#include <utility> // for std::rel_ops
16
17#include <array>
18#include <deque>
19#include <filesystem>
20#include <forward_list>
21#include <list>
22#include <map>
23#include <set>
24#include <string>
25#include <unordered_map>
26#include <unordered_set>
27#include <vector>
28
29#include "test_macros.h"
30
31#if TEST_STD_VER >= 17
32# include <string_view>
33#endif
34
35#if TEST_STD_VER >= 20
36# include <span>
37#endif
38
39using namespace std::rel_ops;
40
41template <class It, class ConstIt>
42void test_eq(It it, ConstIt cit) {
43 (void)(it == it);
44 (void)(it != it);
45 (void)(it == cit);
46 (void)(it != cit);
47 (void)(cit == it);
48 (void)(cit != it);
49 (void)(cit == cit);
50 (void)(cit != cit);
51}
52
53template <class It, class ConstIt>
54void test_lt(It it, ConstIt cit) {
55 (void)(it < it);
56 (void)(it <= it);
57 (void)(it > it);
58 (void)(it >= it);
59 (void)(it < cit);
60 (void)(it <= cit);
61 (void)(it > cit);
62 (void)(it >= cit);
63 (void)(cit < it);
64 (void)(cit <= it);
65 (void)(cit > it);
66 (void)(cit >= it);
67 (void)(cit < cit);
68 (void)(cit <= cit);
69 (void)(cit > cit);
70 (void)(cit >= cit);
71
72 // Test subtraction too, even though std::rel_ops shouldn't affect it.
73
74 (void)(it - it);
75 (void)(it - cit);
76 (void)(cit - it);
77 (void)(cit - cit);
78}
79
80template <class Container>
81void test_forward() {
82 // There is no need to distinguish "forward" from "bidirectional."
83 // libc++ already can't handle `c.rbegin() >= c.rbegin()` in the
84 // presence of std::rel_ops, and neither can Microsoft nor libstdc++.
85
86 Container c;
87 typename Container::iterator it = c.begin();
88 typename Container::const_iterator cit = c.begin();
89 test_eq(it, cit);
90}
91
92template <class Container>
93void test_random_access() {
94 Container c;
95 typename Container::iterator it = c.begin();
96 typename Container::const_iterator cit = c.begin();
97 test_eq(it, cit);
98 test_lt(it, cit);
99}
100
101template void test_random_access<std::array<int, 10> >();
102template void test_random_access<std::deque<int> >();
103template void test_forward<std::forward_list<int> >();
104template void test_forward<std::list<int> >();
105template void test_forward<std::map<int, int> >();
106template void test_forward<std::multimap<int, int> >();
107template void test_forward<std::multiset<int> >();
108template void test_forward<std::set<int> >();
109template void test_random_access<std::string>();
110template void test_forward<std::unordered_map<int, int> >();
111template void test_forward<std::unordered_multimap<int, int> >();
112template void test_forward<std::unordered_multiset<int> >();
113template void test_forward<std::unordered_set<int> >();
114template void test_random_access<std::vector<int> >();
115
116#if TEST_STD_VER >= 17
117void test_directory_iterators() {
118# ifndef TEST_HAS_NO_FILESYSTEM
119 std::filesystem::directory_iterator it;
120 test_eq(it, it);
121
122 std::filesystem::recursive_directory_iterator rdit;
123 test_eq(rdit, rdit);
124# endif
125}
126
127template void test_forward<std::filesystem::path>();
128#endif
129
130#if TEST_STD_VER >= 17
131template void test_random_access<std::string_view>();
132#endif
133
134#if TEST_STD_VER >= 20
135void test_span() {
136 std::span<int> c;
137 std::span<int>::iterator it = c.begin(); // span has no const_iterator
138 test_eq(it, it);
139 test_lt(it, it);
140}
141#endif
142

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of libcxx/test/std/containers/iterator.rel_ops.compile.pass.cpp