brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · 3de1a93 Raw
81 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// constexpr auto size()10// constexpr auto size() const11 12// UNSUPPORTED: c++03, c++11, c++14, c++17, c++2013 14#include <cassert>15#include <cstddef>16#include <ranges>17 18struct ConstSizedView : std::ranges::view_base {19  bool* size_called;20  int* begin() const;21  int* end() const;22 23  constexpr std::size_t size() const {24    *size_called = true;25    return 3;26  }27};28 29struct SizedView : std::ranges::view_base {30  bool* size_called;31  int* begin() const;32  int* end() const;33 34  constexpr int size() {35    *size_called = true;36    return 5;37  }38};39 40struct UnsizedView : std::ranges::view_base {41  int* begin() const;42  int* end() const;43};44 45template <class T>46concept HasSize = requires(T v) { v.size(); };47 48static_assert(HasSize<ConstSizedView>);49static_assert(HasSize<const ConstSizedView>);50static_assert(HasSize<SizedView>);51static_assert(!HasSize<const SizedView>);52static_assert(!HasSize<UnsizedView>);53static_assert(!HasSize<const UnsizedView>);54 55constexpr bool test() {56  {57    bool size_called = false;58    std::ranges::as_rvalue_view view(ConstSizedView{{}, &size_called});59    std::same_as<std::size_t> auto size = view.size();60    assert(size == 3);61    assert(size_called);62  }63 64  {65    bool size_called = false;66    std::ranges::as_rvalue_view view(SizedView{{}, &size_called});67    std::same_as<int> auto size = view.size();68    assert(size == 5);69    assert(size_called);70  }71 72  return true;73}74 75int main(int, char**) {76  test();77  static_assert(test());78 79  return 0;80}81