//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // constexpr auto size() requires sized_range // constexpr auto size() const requires sized_range #include #include #include #include #include "types.h" template concept HasSize = requires(T t) { t.size(); }; static_assert(HasSize>); static_assert(HasSize>); struct NonSized : std::ranges::view_base { using iterator = forward_iterator*>; iterator begin() const; iterator end() const; }; static_assert(!std::ranges::sized_range); static_assert(!std::ranges::sized_range); static_assert(!HasSize>); static_assert(!HasSize>); struct SizedNonConst : TupleBufferView { using TupleBufferView::TupleBufferView; using iterator = forward_iterator*>; constexpr auto begin() const { return iterator{buffer_}; } constexpr auto end() const { return iterator{buffer_ + size_}; } constexpr std::size_t size() { return size_; } }; static_assert(HasSize>); static_assert(!HasSize>); struct OnlyConstSized : TupleBufferView { using TupleBufferView::TupleBufferView; using iterator = forward_iterator*>; constexpr auto begin() const { return iterator{buffer_}; } constexpr auto end() const { return iterator{buffer_ + size_}; } constexpr std::size_t size() const { return size_; } constexpr std::size_t size() = delete; }; static_assert(HasSize); static_assert(HasSize>); static_assert(HasSize>); constexpr bool test() { std::tuple buffer[] = {{1}, {2}, {3}}; // non-const and const are sized { auto ev = std::views::elements<0>(buffer); assert(ev.size() == 3); assert(std::as_const(ev).size() == 3); } { // const-view non-sized range auto ev = std::views::elements<0>(SizedNonConst{buffer}); assert(ev.size() == 3); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }