//===----------------------------------------------------------------------===// // // 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 // requires constructible_from && // constructible_from // constexpr explicit repeat_view(piecewise_construct_t, // tuple value_args, tuple bound_args = tuple<>{}); #include #include #include #include #include struct C {}; struct B { int v; }; struct A { int x = 111; int y = 222; constexpr A() = default; constexpr A(B b) : x(b.v), y(b.v + 1) {} constexpr A(int _x, int _y) : x(_x), y(_y) {} }; static_assert(std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); static_assert(std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); static_assert(std::constructible_from, std::piecewise_construct_t, std::tuple<>, std::tuple>); static_assert(std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); static_assert(std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); static_assert(std::constructible_from, std::piecewise_construct_t, std::tuple<>, std::tuple>); static_assert(!std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); static_assert(!std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); static_assert(!std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); static_assert(!std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); static_assert( !std::constructible_from, std::piecewise_construct_t, std::tuple, std::tuple>); constexpr bool test() { { std::ranges::repeat_view rv(std::piecewise_construct, std::tuple{}, std::tuple{3}); assert(rv.size() == 3); assert(rv[0].x == 111); assert(rv[0].y == 222); assert(rv.begin() + 3 == rv.end()); } { std::ranges::repeat_view rv(std::piecewise_construct, std::tuple{}, std::tuple{std::unreachable_sentinel}); assert(rv[0].x == 111); assert(rv[0].y == 222); assert(rv.begin() + 300 != rv.end()); } { std::ranges::repeat_view rv(std::piecewise_construct, std::tuple{1, 2}, std::tuple{3}); assert(rv.size() == 3); assert(rv[0].x == 1); assert(rv[0].y == 2); assert(rv.begin() + 3 == rv.end()); } { std::ranges::repeat_view rv(std::piecewise_construct, std::tuple{1, 2}, std::tuple{std::unreachable_sentinel}); assert(rv[0].x == 1); assert(rv[0].y == 2); assert(rv.begin() + 300 != rv.end()); } { std::ranges::repeat_view rv(std::piecewise_construct, std::tuple{B{11}}, std::tuple{3}); assert(rv.size() == 3); assert(rv[0].x == 11); assert(rv[0].y == 12); assert(rv.begin() + 3 == rv.end()); } { std::ranges::repeat_view rv(std::piecewise_construct, std::tuple{B{10}}, std::tuple{std::unreachable_sentinel}); assert(rv[0].x == 10); assert(rv[0].y == 11); assert(rv.begin() + 300 != rv.end()); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }