brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · 1132727 Raw
150 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 begin();12// constexpr auto begin() const requires forward_range<View> && forward_range<const View>;13 14#include <ranges>15 16#include <cassert>17#include <utility>18#include "test_iterators.h"19#include "test_range.h"20#include "types.h"21 22template <class View>23concept ConstBeginDisabled = !requires (const View v) {24  { (*v.begin()) };25};26 27constexpr bool test() {28  // non-const: forward_range<View> && simple-view<View> -> outer-iterator<Const = true>29  // const: forward_range<View> && forward_range<const View> -> outer-iterator<Const = true>30  {31    using V = ForwardView;32    using P = V;33 34    static_assert(std::ranges::forward_range<V>);35    static_assert(std::ranges::forward_range<const V>);36    static_assert(simple_view<V>);37    static_assert(simple_view<P>);38 39    {40      std::ranges::lazy_split_view<V, P> v;41      auto it = v.begin();42      static_assert(std::is_same_v<decltype(it)::iterator_concept, std::forward_iterator_tag>);43      static_assert(std::is_same_v<decltype(*(*it).begin()), const char&>);44    }45 46    {47      const std::ranges::lazy_split_view<V, P> cv;48      auto it = cv.begin();49      static_assert(std::is_same_v<decltype(it)::iterator_concept, std::forward_iterator_tag>);50      static_assert(std::is_same_v<decltype(*(*it).begin()), const char&>);51    }52  }53 54  // non-const: forward_range<View> && !simple-view<View> -> outer-iterator<Const = false>55  // const: forward_range<View> && forward_range<const View> -> outer-iterator<Const = true>56  {57    using V = ForwardDiffView;58    using P = V;59 60    static_assert(std::ranges::forward_range<V>);61    static_assert(std::ranges::forward_range<const V>);62    static_assert(!simple_view<V>);63    static_assert(!simple_view<P>);64 65    {66      std::ranges::lazy_split_view<V, P> v;67      auto it = v.begin();68      static_assert(std::is_same_v<decltype(it)::iterator_concept, std::forward_iterator_tag>);69      static_assert(std::is_same_v<decltype(*(*it).begin()), char&>);70    }71 72    {73      const std::ranges::lazy_split_view<V, P> cv;74      auto it = cv.begin();75      static_assert(std::is_same_v<decltype(it)::iterator_concept, std::forward_iterator_tag>);76      static_assert(std::is_same_v<decltype(*(*it).begin()), const char&>);77    }78  }79 80  // non-const: forward_range<View> && !simple-view<View> -> outer-iterator<Const = false>81  // const: forward_range<View> && !forward_range<const View> -> disabled82  {83    using V = ForwardOnlyIfNonConstView;84    using P = V;85    static_assert(std::ranges::forward_range<V>);86    static_assert(!std::ranges::forward_range<const V>);87    static_assert(!simple_view<V>);88    static_assert(!simple_view<P>);89 90    std::ranges::lazy_split_view<V, P> v;91    auto it = v.begin();92    static_assert(std::is_same_v<decltype(it)::iterator_concept, std::forward_iterator_tag>);93    static_assert(std::is_same_v<decltype(*(*it).begin()), const char&>);94 95    static_assert(ConstBeginDisabled<decltype(v)>);96  }97 98  // non-const: forward_range<View> && simple-view<View> && !simple-view<Pattern> -> outer-iterator<Const = false>99  // const: forward_range<View> && forward_range<const View> -> outer-iterator<Const = true>100  {101    using V = ForwardView;102    using P = ForwardOnlyIfNonConstView;103 104    static_assert(std::ranges::forward_range<V>);105    static_assert(std::ranges::forward_range<const V>);106    static_assert(simple_view<V>);107    static_assert(!simple_view<P>);108 109    {110      std::ranges::lazy_split_view<V, P> v;111      auto it = v.begin();112      static_assert(std::is_same_v<decltype(it)::iterator_concept, std::forward_iterator_tag>);113      static_assert(std::is_same_v<decltype(*(*it).begin()), const char&>);114    }115 116    {117      const std::ranges::lazy_split_view<V, P> cv;118      auto it = cv.begin();119      static_assert(std::is_same_v<decltype(it)::iterator_concept, std::forward_iterator_tag>);120      static_assert(std::is_same_v<decltype(*(*it).begin()), const char&>);121    }122  }123 124  // non-const: !forward_range<View> && tiny-range<Pattern> -> outer-iterator<Const = false>125  // const: !forward_range<View> -> disabled126  {127    using V = InputView;128    using P = ForwardTinyView;129 130    static_assert(!std::ranges::forward_range<V>);131    static_assert(std::ranges::forward_range<P>);132 133    std::ranges::lazy_split_view<V, P> v;134    auto it = v.begin();135    static_assert(std::is_same_v<decltype(it)::iterator_concept, std::input_iterator_tag>);136    static_assert(std::is_same_v<decltype(*(*it).begin()), char&>);137 138    static_assert(ConstBeginDisabled<decltype(v)>);139  }140 141  return true;142}143 144int main(int, char**) {145  test();146  static_assert(test());147 148  return 0;149}150