1 //===----------------------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
11 // template<class Iter, IntegralLike Size, class T>
12 // requires OutputIterator<Iter, const T&>
13 // constexpr OutputIterator // constexpr after C++17
14 // fill_n(Iter first, Size n, const T& value);
19 #include "test_macros.h"
20 #include "test_iterators.h"
21 #include "user_defined_integral.h"
24 TEST_CONSTEXPR
bool test_constexpr() {
25 const std::size_t N
= 5;
26 int ib
[] = {0, 0, 0, 0, 0, 0}; // one bigger than N
28 auto it
= std::fill_n(std::begin(ib
), N
, 5);
29 return it
== (std::begin(ib
) + N
)
30 && std::all_of(std::begin(ib
), it
, [](int a
) {return a
== 5; })
31 && *it
== 0 // don't overwrite the last value in the output array
36 typedef UserDefinedIntegral
<unsigned> UDI
;
43 Iter it
= std::fill_n(Iter(a
), UDI(4), char(1));
44 assert(base(it
) == a
+ 4);
56 Iter it
= std::fill_n(Iter(a
), UDI(4), 1);
57 assert(base(it
) == a
+ 4);
68 assert(std::fill_n(a
, UDI(4), static_cast<char>(1)) == a
+ 4);
78 operator int() const { return i
++; }
83 test_int_array_struct_source()
86 assert(std::fill_n(a
, UDI(4), source()) == a
+ 4);
95 test1(char xc
) : c(xc
+ 1) { }
102 test1 test1a
[4] = {};
103 assert(std::fill_n(test1a
, UDI(4), static_cast<char>(10)) == test1a
+ 4);
104 assert(test1a
[0].c
== 11);
105 assert(test1a
[1].c
== 11);
106 assert(test1a
[2].c
== 11);
107 assert(test1a
[3].c
== 11);
115 explicit A(char a
) : a_(a
) {}
116 operator unsigned char() const {return 'b';}
118 friend bool operator==(const A
& x
, const A
& y
)
119 {return x
.a_
== y
.a_
;}
126 assert(std::fill_n(&a
[0], UDI(3), A('a')) == a
+3);
127 assert(a
[0] == A('a'));
128 assert(a
[1] == A('a'));
129 assert(a
[2] == A('a'));
144 std::fill_n(&foo
[0], UDI(5), Storage());
148 int main(int, char**)
150 test_char
<cpp17_output_iterator
<char*> >();
151 test_char
<forward_iterator
<char*> >();
152 test_char
<bidirectional_iterator
<char*> >();
153 test_char
<random_access_iterator
<char*> >();
156 test_int
<cpp17_output_iterator
<int*> >();
157 test_int
<forward_iterator
<int*> >();
158 test_int
<bidirectional_iterator
<int*> >();
159 test_int
<random_access_iterator
<int*> >();
163 test_int_array_struct_source();
169 #if TEST_STD_VER > 17
170 static_assert(test_constexpr());