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 // friend constexpr iterator operator+(iterator i, difference_type n) 14 // requires advanceable<W>; 15 // friend constexpr iterator operator+(difference_type n, iterator i) 16 // requires advanceable<W>; 17 18 #include <ranges> 19 #include <cassert> 20 21 #include "test_macros.h" 22 #include "../types.h" 23 24 constexpr bool test() { 25 // When "_Start" is signed integer like. 26 { 27 std::ranges::iota_view<int> io(0); 28 auto iter1 = io.begin(); 29 auto iter2 = io.begin(); 30 assert(iter1 == iter2); 31 assert(iter1 + 5 != iter2); 32 assert(iter1 + 5 == std::ranges::next(iter2, 5)); 33 34 static_assert(std::is_reference_v<decltype(iter2 += 5)>); 35 } 36 37 // When "_Start" is not integer like. 38 { 39 std::ranges::iota_view io(SomeInt(0)); 40 auto iter1 = io.begin(); 41 auto iter2 = io.begin(); 42 assert(iter1 == iter2); 43 assert(iter1 + 5 != iter2); 44 assert(iter1 + 5 == std::ranges::next(iter2, 5)); 45 46 static_assert(std::is_reference_v<decltype(iter2 += 5)>); 47 } 48 49 // When "_Start" is unsigned integer like and n is greater than or equal to zero. 50 { 51 std::ranges::iota_view<unsigned> io(0); 52 auto iter1 = io.begin(); 53 auto iter2 = io.begin(); 54 assert(iter1 == iter2); 55 assert(iter1 + 5 != iter2); 56 assert(iter1 + 5 == std::ranges::next(iter2, 5)); 57 58 static_assert(std::is_reference_v<decltype(iter2 += 5)>); 59 } 60 { 61 std::ranges::iota_view<unsigned> io(0); 62 auto iter1 = io.begin(); 63 auto iter2 = io.begin(); 64 assert(iter1 == iter2); 65 assert(iter1 + 0 == iter2); 66 } 67 68 // When "_Start" is unsigned integer like and n is less than zero. 69 { 70 std::ranges::iota_view<unsigned> io(0); 71 auto iter1 = io.begin(); 72 auto iter2 = io.begin(); 73 assert(iter1 == iter2); 74 assert(iter1 + 5 != iter2); 75 assert(iter1 + 5 == std::ranges::next(iter2, 5)); 76 77 static_assert(std::is_reference_v<decltype(iter2 += 5)>); 78 } 79 80 return true; 81 } 82 83 int main(int, char**) { 84 test(); 85 static_assert(test()); 86 87 return 0; 88 } 89