brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 6c8aece Raw
71 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// constexpr auto end();12 13#include <cassert>14#include <ranges>15#include <type_traits>16#include <utility>17 18#include "test_iterators.h"19 20struct View : std::ranges::view_base {21  int* begin() const;22  int* end() const;23};24 25// Test that end is not const26template <class T>27concept HasEnd = requires(T t) { t.end(); };28 29static_assert(HasEnd<std::ranges::split_view<View, View>>);30static_assert(!HasEnd<const std::ranges::split_view<View, View>>);31 32constexpr bool test() {33  // return iterator34  {35    int buffer[]   = {1, 2, -1, 4, 5, 6, 5, 4, -1, 2, 1};36    auto inputView = std::views::all(buffer);37    static_assert(std::ranges::common_range<decltype(inputView)>);38 39    std::ranges::split_view sv(buffer, -1);40    using SplitIter                           = std::ranges::iterator_t<decltype(sv)>;41    std::same_as<SplitIter> decltype(auto) sentinel = sv.end();42    assert(sentinel.base() == buffer + 11);43  }44 45  // return sentinel46  {47    using Iter   = int*;48    using Sent   = sentinel_wrapper<Iter>;49    using Range  = std::ranges::subrange<Iter, Sent>;50    int buffer[] = {1, 2, -1, 4, 5, 6, 5, 4, -1, 2, 1};51    Range range  = {buffer, Sent{buffer + 11}};52    static_assert(!std::ranges::common_range<Range>);53 54    std::ranges::split_view sv(range, -1);55    auto sentinel = sv.end();56 57    using SplitIter = std::ranges::iterator_t<decltype(sv)>;58    static_assert(!std::same_as<decltype(sentinel), SplitIter>);59 60    assert(std::next(sv.begin(), 3) == sentinel);61  }62 63  return true;64}65 66int main(int, char**) {67  test();68  static_assert(test());69  return 0;70}71