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