brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · b557346 Raw
137 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 outer-iterator& outer-iterator::operator++();12// constexpr decltype(auto) outer-iterator::operator++(int);13 14// Note that corner cases are tested in `range.lazy.split/general.pass.cpp`.15 16#include <ranges>17 18#include <algorithm>19#include <cassert>20#include <string>21#include "../types.h"22 23constexpr bool test() {24  using namespace std::string_literals;25  // Can call `outer-iterator::operator++`; `View` is a forward range.26  {27    SplitViewForward v("abc def ghi", " ");28 29    // ++i30    {31      auto i = v.begin();32      assert(std::ranges::equal(*i, "abc"s));33 34      decltype(auto) i2 = ++i;35      static_assert(std::is_lvalue_reference_v<decltype(i2)>);36      assert(&i2 == &i);37      assert(std::ranges::equal(*i2, "def"s));38    }39 40    // i++41    {42      auto i = v.begin();43      assert(std::ranges::equal(*i, "abc"s));44 45      decltype(auto) i2 = i++;46      static_assert(!std::is_reference_v<decltype(i2)>);47      assert(std::ranges::equal(*i2, "abc"s));48      assert(std::ranges::equal(*i, "def"s));49    }50  }51 52  // Can call `outer-iterator::operator++`; `View` is an input range.53  {54    SplitViewInput v("abc def ghi", ' ');55 56    // ++i57    {58      auto i = v.begin();59      assert(std::ranges::equal(*i, "abc"s));60 61      decltype(auto) i2 = ++i;62      static_assert(std::is_lvalue_reference_v<decltype(i2)>);63      assert(&i2 == &i);64      assert(std::ranges::equal(*i2, "def"s));65    }66 67    // i++68    {69      auto i = v.begin();70      assert(std::ranges::equal(*i, "abc"s));71 72      static_assert(std::is_void_v<decltype(i++)>);73      i++;74      assert(std::ranges::equal(*i, "def"s));75    }76  }77 78  // LWG350579  {80    using namespace std::string_view_literals;81 82    { // Motivational example83      auto v = std::views::lazy_split("xxyx"sv, "xy"sv);84 85      {86        auto i = v.begin();87        assert(std::ranges::equal(*i, "x"s));88 89        decltype(auto) i2 = ++i;90        static_assert(std::is_lvalue_reference_v<decltype(i2)>);91        assert(std::ranges::equal(*i2, "x"s));92      }93 94      {95        auto i = v.begin();96        assert(std::ranges::equal(*i, "x"s));97 98        decltype(auto) i2 = i++;99        static_assert(!std::is_reference_v<decltype(i2)>);100        assert(std::ranges::equal(*i2, "x"s));101        assert(std::ranges::equal(*i, "x"s));102      }103    }104    {105      auto v = std::views::lazy_split("zzht"sv, "zh"sv);106 107      {108        auto i = v.begin();109        assert(std::ranges::equal(*i, "z"s));110 111        decltype(auto) i2 = ++i;112        static_assert(std::is_lvalue_reference_v<decltype(i2)>);113        assert(std::ranges::equal(*i2, "t"s));114      }115 116      {117        auto i = v.begin();118        assert(std::ranges::equal(*i, "z"s));119 120        decltype(auto) i2 = i++;121        static_assert(!std::is_reference_v<decltype(i2)>);122        assert(std::ranges::equal(*i2, "z"s));123        assert(std::ranges::equal(*i, "t"s));124      }125    }126  }127 128  return true;129}130 131int main(int, char**) {132  test();133  static_assert(test());134 135  return 0;136}137