100 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// friend constexpr bool operator==(const iterator& x, const iterator& y);12 13#include <algorithm>14#include <cassert>15#include <concepts>16#include <ranges>17 18#include "test_iterators.h"19 20template <class Iter>21constexpr void testOne() {22 using Range = std::ranges::subrange<Iter>;23 using SplitView = std::ranges::split_view<Range, std::ranges::single_view<int>>;24 static_assert(std::ranges::common_range<SplitView>);25 26 {27 // simple test28 {29 int buffer[] = {0, 1, 2, -1, 4, 5, 6};30 Range input(Iter{buffer}, Iter{buffer + 7});31 SplitView sv(input, -1);32 auto b = sv.begin(), e = sv.end();33 34 assert(b == b);35 assert(!(b != b));36 37 assert(e == e);38 assert(!(e != e));39 40 assert(!(b == e));41 assert(b != e);42 43 std::advance(b, 2);44 assert(b == b);45 assert(!(b != b));46 47 assert(e == e);48 assert(!(e != e));49 50 assert(b == e);51 assert(!(b != e));52 }53 54 // iterator at trailing empty position should not equal to end55 {56 int buffer[] = {0, 1, 2, -1};57 Range input(Iter{buffer}, Iter{buffer + 4});58 SplitView sv(input, -1);59 auto b = sv.begin(), e = sv.end();60 61 ++b; // cur points to end but trailing_empty is true62 63 assert(b != e);64 assert(!(b == e));65 66 ++b;67 assert(b == e);68 assert(!(b != e));69 }70 71 // Default-constructed iterators compare equal.72 {73 int buffer[] = {0, 1, 2, -1, 4, 5, 6};74 Range input(Iter{buffer}, Iter{buffer + 7});75 std::ranges::split_view sv(buffer, -1);76 using SplitIter = decltype(sv.begin());77 SplitIter i1, i2;78 assert(i1 == i2);79 assert(!(i1 != i2));80 }81 }82}83 84constexpr bool test() {85 testOne<forward_iterator<int*>>();86 testOne<bidirectional_iterator<int*>>();87 testOne<random_access_iterator<int*>>();88 testOne<contiguous_iterator<int*>>();89 testOne<int*>();90 91 return true;92}93 94int main(int, char**) {95 test();96 static_assert(test());97 98 return 0;99}100