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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10
11// constexpr explicit repeat_view(const T& value, Bound bound = Bound()) requires copy_constructible<T>;
12// constexpr explicit repeat_view(T&& value, Bound bound = Bound());
13
14#include <ranges>
15#include <cassert>
16#include <iterator>
17#include <type_traits>
18
19#include "MoveOnly.h"
20
21struct Empty {};
22
23// Test explicit
24static_assert(std::is_constructible_v<std::ranges::repeat_view<Empty>, const Empty&>);
25static_assert(std::is_constructible_v<std::ranges::repeat_view<Empty>, Empty&&>);
26static_assert(std::is_constructible_v<std::ranges::repeat_view<Empty, int>, const Empty&>);
27static_assert(std::is_constructible_v<std::ranges::repeat_view<Empty, int>, Empty&&>);
28
29static_assert(!std::is_convertible_v<const Empty&, std::ranges::repeat_view<Empty>>);
30static_assert(!std::is_convertible_v<Empty&&, std::ranges::repeat_view<Empty>>);
31static_assert(!std::is_convertible_v<const Empty&, std::ranges::repeat_view<Empty, int>>);
32static_assert(!std::is_convertible_v<Empty&&, std::ranges::repeat_view<Empty, int>>);
33
34static_assert(!std::is_constructible_v<std::ranges::repeat_view<MoveOnly>, const MoveOnly&>);
35static_assert(std::is_constructible_v<std::ranges::repeat_view<MoveOnly>, MoveOnly&&>);
36
37constexpr bool test() {
38 // Move && unbound && default argument
39 {
40 std::ranges::repeat_view<Empty> rv(Empty{});
41 assert(rv.begin() + 10 != rv.end());
42 }
43
44 // Move && unbound && user-provided argument
45 {
46 std::ranges::repeat_view<Empty> rv(Empty{}, std::unreachable_sentinel);
47 assert(rv.begin() + 10 != rv.end());
48 }
49
50 // Move && bound && default argument
51 {
52 std::ranges::repeat_view<Empty, int> rv(Empty{});
53 assert(rv.begin() == rv.end());
54 }
55
56 // Move && bound && user-provided argument
57 {
58 std::ranges::repeat_view<Empty, int> rv(Empty{}, 10);
59 assert(rv.begin() + 10 == rv.end());
60 }
61
62 // Copy && unbound && default argument
63 {
64 Empty e;
65 std::ranges::repeat_view<Empty> rv(e);
66 assert(rv.begin() + 10 != rv.end());
67 }
68
69 // Copy && unbound && user-provided argument
70 {
71 Empty e;
72 std::ranges::repeat_view<Empty> rv(e, std::unreachable_sentinel);
73 assert(rv.begin() + 10 != rv.end());
74 }
75
76 // Copy && bound && default argument
77 {
78 Empty e;
79 std::ranges::repeat_view<Empty, int> rv(e);
80 assert(rv.begin() == rv.end());
81 }
82
83 // Copy && bound && user-provided argument
84 {
85 Empty e;
86 std::ranges::repeat_view<Empty, int> rv(e, 10);
87 assert(rv.begin() + 10 == rv.end());
88 }
89
90 return true;
91}
92
93int main(int, char**) {
94 test();
95 static_assert(test());
96
97 return 0;
98}
99

source code of libcxx/test/std/ranges/range.factories/range.repeat.view/ctor.value.bound.pass.cpp