xref: /llvm-project/libcxx/test/std/containers/iterator.rel_ops.compile.pass.cpp (revision 136737d94777140952c4948aa4c8fe441aec48e3)
14118858bSArthur O'Dwyer //===----------------------------------------------------------------------===//
24118858bSArthur O'Dwyer //
34118858bSArthur O'Dwyer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44118858bSArthur O'Dwyer // See https://llvm.org/LICENSE.txt for license information.
54118858bSArthur O'Dwyer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64118858bSArthur O'Dwyer //
74118858bSArthur O'Dwyer //===----------------------------------------------------------------------===//
84118858bSArthur O'Dwyer 
9f0fc8c48SLouis Dionne // XFAIL: availability-filesystem-missing
105024fe93SLouis Dionne 
11*136737d9SMark de Wever // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
12*136737d9SMark de Wever 
134118858bSArthur O'Dwyer // Make sure the various containers' iterators are not broken by the use of `std::rel_ops`.
144118858bSArthur O'Dwyer 
154118858bSArthur O'Dwyer #include <utility> // for std::rel_ops
164118858bSArthur O'Dwyer 
174118858bSArthur O'Dwyer #include <array>
184118858bSArthur O'Dwyer #include <deque>
19c352fa74SLouis Dionne #include <filesystem>
204118858bSArthur O'Dwyer #include <forward_list>
214118858bSArthur O'Dwyer #include <list>
224118858bSArthur O'Dwyer #include <map>
234118858bSArthur O'Dwyer #include <set>
244118858bSArthur O'Dwyer #include <string>
254118858bSArthur O'Dwyer #include <unordered_map>
264118858bSArthur O'Dwyer #include <unordered_set>
274118858bSArthur O'Dwyer #include <vector>
284118858bSArthur O'Dwyer 
294118858bSArthur O'Dwyer #include "test_macros.h"
304118858bSArthur O'Dwyer 
314118858bSArthur O'Dwyer #if TEST_STD_VER >= 17
324118858bSArthur O'Dwyer #include <string_view>
334118858bSArthur O'Dwyer #endif
344118858bSArthur O'Dwyer 
354118858bSArthur O'Dwyer #if TEST_STD_VER >= 20
364118858bSArthur O'Dwyer #include <span>
374118858bSArthur O'Dwyer #endif
384118858bSArthur O'Dwyer 
394118858bSArthur O'Dwyer using namespace std::rel_ops;
404118858bSArthur O'Dwyer 
414118858bSArthur O'Dwyer template<class It, class ConstIt>
424118858bSArthur O'Dwyer void test_eq(It it, ConstIt cit) {
434118858bSArthur O'Dwyer     (void)(it == it);
444118858bSArthur O'Dwyer     (void)(it != it);
454118858bSArthur O'Dwyer     (void)(it == cit);
464118858bSArthur O'Dwyer     (void)(it != cit);
474118858bSArthur O'Dwyer     (void)(cit == it);
484118858bSArthur O'Dwyer     (void)(cit != it);
494118858bSArthur O'Dwyer     (void)(cit == cit);
504118858bSArthur O'Dwyer     (void)(cit != cit);
514118858bSArthur O'Dwyer }
524118858bSArthur O'Dwyer 
534118858bSArthur O'Dwyer template<class It, class ConstIt>
544118858bSArthur O'Dwyer void test_lt(It it, ConstIt cit) {
554118858bSArthur O'Dwyer     (void)(it <  it);
564118858bSArthur O'Dwyer     (void)(it <= it);
574118858bSArthur O'Dwyer     (void)(it >  it);
584118858bSArthur O'Dwyer     (void)(it >= it);
594118858bSArthur O'Dwyer     (void)(it <  cit);
604118858bSArthur O'Dwyer     (void)(it <= cit);
614118858bSArthur O'Dwyer     (void)(it >  cit);
624118858bSArthur O'Dwyer     (void)(it >= cit);
634118858bSArthur O'Dwyer     (void)(cit <  it);
644118858bSArthur O'Dwyer     (void)(cit <= it);
654118858bSArthur O'Dwyer     (void)(cit >  it);
664118858bSArthur O'Dwyer     (void)(cit >= it);
674118858bSArthur O'Dwyer     (void)(cit <  cit);
684118858bSArthur O'Dwyer     (void)(cit <= cit);
694118858bSArthur O'Dwyer     (void)(cit >  cit);
704118858bSArthur O'Dwyer     (void)(cit >= cit);
714118858bSArthur O'Dwyer 
724118858bSArthur O'Dwyer     // Test subtraction too, even though std::rel_ops shouldn't affect it.
734118858bSArthur O'Dwyer 
744118858bSArthur O'Dwyer     (void)(it - it);
754118858bSArthur O'Dwyer     (void)(it - cit);
764118858bSArthur O'Dwyer     (void)(cit - it);
774118858bSArthur O'Dwyer     (void)(cit - cit);
784118858bSArthur O'Dwyer }
794118858bSArthur O'Dwyer 
804118858bSArthur O'Dwyer template<class Container>
814118858bSArthur O'Dwyer void test_forward() {
824118858bSArthur O'Dwyer     // There is no need to distinguish "forward" from "bidirectional."
834118858bSArthur O'Dwyer     // libc++ already can't handle `c.rbegin() >= c.rbegin()` in the
844118858bSArthur O'Dwyer     // presence of std::rel_ops, and neither can Microsoft nor libstdc++.
854118858bSArthur O'Dwyer 
864118858bSArthur O'Dwyer     Container c;
874118858bSArthur O'Dwyer     typename Container::iterator it = c.begin();
884118858bSArthur O'Dwyer     typename Container::const_iterator cit = c.begin();
894118858bSArthur O'Dwyer     test_eq(it, cit);
904118858bSArthur O'Dwyer }
914118858bSArthur O'Dwyer 
924118858bSArthur O'Dwyer template<class Container>
934118858bSArthur O'Dwyer void test_random_access() {
944118858bSArthur O'Dwyer     Container c;
954118858bSArthur O'Dwyer     typename Container::iterator it = c.begin();
964118858bSArthur O'Dwyer     typename Container::const_iterator cit = c.begin();
974118858bSArthur O'Dwyer     test_eq(it, cit);
984118858bSArthur O'Dwyer     test_lt(it, cit);
994118858bSArthur O'Dwyer }
1004118858bSArthur O'Dwyer 
1014118858bSArthur O'Dwyer template void test_random_access<std::array<int, 10> >();
1024118858bSArthur O'Dwyer template void test_random_access<std::deque<int> >();
1034118858bSArthur O'Dwyer template void test_forward<std::forward_list<int> >();
1044118858bSArthur O'Dwyer template void test_forward<std::list<int> >();
1054118858bSArthur O'Dwyer template void test_forward<std::map<int, int> >();
1064118858bSArthur O'Dwyer template void test_forward<std::multimap<int, int> >();
1074118858bSArthur O'Dwyer template void test_forward<std::multiset<int> >();
1084118858bSArthur O'Dwyer template void test_forward<std::set<int> >();
1094118858bSArthur O'Dwyer template void test_random_access<std::string>();
1104118858bSArthur O'Dwyer template void test_forward<std::unordered_map<int, int> >();
1114118858bSArthur O'Dwyer template void test_forward<std::unordered_multimap<int, int> >();
1124118858bSArthur O'Dwyer template void test_forward<std::unordered_multiset<int> >();
1134118858bSArthur O'Dwyer template void test_forward<std::unordered_set<int> >();
1144118858bSArthur O'Dwyer template void test_random_access<std::vector<int> >();
1154118858bSArthur O'Dwyer 
116c352fa74SLouis Dionne #if TEST_STD_VER >= 17
1174118858bSArthur O'Dwyer void test_directory_iterators() {
118c352fa74SLouis Dionne #ifndef TEST_HAS_NO_FILESYSTEM
119c352fa74SLouis Dionne     std::filesystem::directory_iterator it;
1204118858bSArthur O'Dwyer     test_eq(it, it);
1214118858bSArthur O'Dwyer 
122c352fa74SLouis Dionne     std::filesystem::recursive_directory_iterator rdit;
1234118858bSArthur O'Dwyer     test_eq(rdit, rdit);
124c352fa74SLouis Dionne #endif
1254118858bSArthur O'Dwyer }
1264118858bSArthur O'Dwyer 
127c352fa74SLouis Dionne template void test_forward<std::filesystem::path>();
1284118858bSArthur O'Dwyer #endif
1294118858bSArthur O'Dwyer 
1304118858bSArthur O'Dwyer #if TEST_STD_VER >= 17
1314118858bSArthur O'Dwyer template void test_random_access<std::string_view>();
1324118858bSArthur O'Dwyer #endif
1334118858bSArthur O'Dwyer 
1344118858bSArthur O'Dwyer #if TEST_STD_VER >= 20
1354118858bSArthur O'Dwyer void test_span() {
1364118858bSArthur O'Dwyer     std::span<int> c;
1374118858bSArthur O'Dwyer     std::span<int>::iterator it = c.begin();  // span has no const_iterator
1384118858bSArthur O'Dwyer     test_eq(it, it);
1394118858bSArthur O'Dwyer     test_lt(it, it);
1404118858bSArthur O'Dwyer }
1414118858bSArthur O'Dwyer #endif
142