//===----------------------------------------------------------------------===// // // 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, c++20 // template // views::repeat(T &&) requires constructible_from, T>; // template // views::repeat(T &&, Bound &&) requires constructible_from, T, Bound>; #include #include #include #include #include #include "MoveOnly.h" struct NonCopyable { NonCopyable(NonCopyable&) = delete; }; struct NonDefaultCtor { NonDefaultCtor(int) {} }; struct Empty {}; struct LessThan3 { constexpr bool operator()(int i) const { return i < 3; } }; struct EqualTo33 { constexpr bool operator()(int i) const { return i == 33; } }; struct Add3 { constexpr int operator()(int i) const { return i + 3; } }; // Tp is_object static_assert(std::is_invocable_v); static_assert(!std::is_invocable_v); // _Bound is semiregular, integer like or std::unreachable_sentinel_t static_assert(!std::is_invocable_v); static_assert(!std::is_invocable_v); static_assert(!std::is_invocable_v); static_assert(std::is_invocable_v); // Tp is copy_constructible static_assert(!std::is_invocable_v); // Tp is move_constructible static_assert(std::is_invocable_v); constexpr bool test() { assert(*std::views::repeat(33).begin() == 33); assert(*std::views::repeat(33, 10).begin() == 33); static_assert(std::same_as>); static_assert(std::same_as>); static_assert(std::same_as); // unbound && drop_view { auto r = std::views::repeat(33) | std::views::drop(3); static_assert(!std::ranges::sized_range); assert(*r.begin() == 33); } // bound && drop_view { auto r = std::views::repeat(33, 8) | std::views::drop(3); static_assert(std::ranges::sized_range); assert(*r.begin() == 33); assert(r.size() == 5); } // unbound && take_view { auto r = std::views::repeat(33) | std::views::take(3); static_assert(std::ranges::sized_range); assert(*r.begin() == 33); assert(r.size() == 3); } // bound && take_view { auto r = std::views::repeat(33, 8) | std::views::take(3); static_assert(std::ranges::sized_range); assert(*r.begin() == 33); assert(r.size() == 3); } // bound && transform_view { auto r = std::views::repeat(33, 8) | std::views::transform(Add3{}); assert(*r.begin() == 36); assert(r.size() == 8); } // unbound && transform_view { auto r = std::views::repeat(33) | std::views::transform(Add3{}); assert(*r.begin() == 36); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }