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
10 // UNSUPPORTED: libcpp-no-concepts
11 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
12 
13 // iota_view::<iterator>::operator{<,>,<=,>=,==,!=,<=>}
14 
15 #include <ranges>
16 #include <compare>
17 
18 #include "test_macros.h"
19 #include "test_iterators.h"
20 #include "../types.h"
21 
22 constexpr bool test() {
23   {
24     // Test `int`, which has operator<=>; the iota iterator should also have operator<=>.
25     using R = std::ranges::iota_view<int>;
26     static_assert(std::three_way_comparable<std::ranges::iterator_t<R>>);
27 
28     std::same_as<R> auto r = std::views::iota(42);
29     auto iter1 = r.begin();
30     auto iter2 = iter1 + 1;
31 
32     assert(!(iter1 < iter1));  assert(iter1 < iter2);     assert(!(iter2 < iter1));
33     assert(iter1 <= iter1);    assert(iter1 <= iter2);    assert(!(iter2 <= iter1));
34     assert(!(iter1 > iter1));  assert(!(iter1 > iter2));  assert(iter2 > iter1);
35     assert(iter1 >= iter1);    assert(!(iter1 >= iter2)); assert(iter2 >= iter1);
36     assert(iter1 == iter1);    assert(!(iter1 == iter2)); assert(iter2 == iter2);
37     assert(!(iter1 != iter1)); assert(iter1 != iter2);    assert(!(iter2 != iter2));
38 
39     assert((iter1 <=> iter2) == std::strong_ordering::less);
40     assert((iter1 <=> iter1) == std::strong_ordering::equal);
41     assert((iter2 <=> iter1) == std::strong_ordering::greater);
42   }
43 
44   {
45     // Test a new-school iterator with operator<=>; the iota iterator should also have operator<=>.
46     using It = three_way_contiguous_iterator<int*>;
47     static_assert(std::three_way_comparable<It>);
48     using R = std::ranges::iota_view<It>;
49     static_assert(std::three_way_comparable<std::ranges::iterator_t<R>>);
50 
51     int a[] = {1,2,3};
52     std::same_as<R> auto r = std::views::iota(It(a));
53     auto iter1 = r.begin();
54     auto iter2 = iter1 + 1;
55 
56     assert(!(iter1 < iter1));  assert(iter1 < iter2);     assert(!(iter2 < iter1));
57     assert(iter1 <= iter1);    assert(iter1 <= iter2);    assert(!(iter2 <= iter1));
58     assert(!(iter1 > iter1));  assert(!(iter1 > iter2));  assert(iter2 > iter1);
59     assert(iter1 >= iter1);    assert(!(iter1 >= iter2)); assert(iter2 >= iter1);
60     assert(iter1 == iter1);    assert(!(iter1 == iter2)); assert(iter2 == iter2);
61     assert(!(iter1 != iter1)); assert(iter1 != iter2);    assert(!(iter2 != iter2));
62 
63     assert((iter1 <=> iter2) == std::strong_ordering::less);
64     assert((iter1 <=> iter1) == std::strong_ordering::equal);
65     assert((iter2 <=> iter1) == std::strong_ordering::greater);
66   }
67 
68   {
69     // Test an old-school iterator with no operator<=>; the iota iterator shouldn't have operator<=> either.
70     using It = random_access_iterator<int*>;
71     static_assert(!std::three_way_comparable<It>);
72     using R = std::ranges::iota_view<It>;
73     static_assert(!std::three_way_comparable<std::ranges::iterator_t<R>>);
74 
75     int a[] = {1,2,3};
76     std::same_as<R> auto r = std::views::iota(It(a));
77     auto iter1 = r.begin();
78     auto iter2 = iter1 + 1;
79 
80     assert(!(iter1 < iter1));  assert(iter1 < iter2);     assert(!(iter2 < iter1));
81     assert(iter1 <= iter1);    assert(iter1 <= iter2);    assert(!(iter2 <= iter1));
82     assert(!(iter1 > iter1));  assert(!(iter1 > iter2));  assert(iter2 > iter1);
83     assert(iter1 >= iter1);    assert(!(iter1 >= iter2)); assert(iter2 >= iter1);
84     assert(iter1 == iter1);    assert(!(iter1 == iter2)); assert(iter2 == iter2);
85     assert(!(iter1 != iter1)); assert(iter1 != iter2);    assert(!(iter2 != iter2));
86   }
87 
88   return true;
89 }
90 
91 int main(int, char**) {
92   test();
93   static_assert(test());
94 
95   return 0;
96 }
97