@@ -52,57 +52,29 @@ struct Test {
5252 }
5353};
5454
55- TEST_CONSTEXPR_CXX20 void test_int_array () {
56- {
57- int a[4 ] = {};
58- assert (std::fill_n (a, UDI (4 ), static_cast <char >(1 )) == a + 4 );
59- assert (a[0 ] == 1 && a[1 ] == 1 && a[2 ] == 1 && a[3 ] == 1 );
60- }
61- #if TEST_STD_VER >= 11
62- {
63- const std::size_t N = 5 ;
64- int ib[] = {0 , 0 , 0 , 0 , 0 , 0 }; // one bigger than N
65-
66- auto it = std::fill_n (std::begin (ib), N, 5 );
67- assert (it == (std::begin (ib) + N) && std::all_of (std::begin (ib), it, [](int a) { return a == 5 ; }) &&
68- *it == 0 // don't overwrite the last value in the output array
69- );
70- }
71- #endif
72- }
73-
7455struct source {
7556 TEST_CONSTEXPR source () = default;
7657 TEST_CONSTEXPR_CXX20 operator int () const { return 1 ; }
7758};
7859
79- TEST_CONSTEXPR_CXX20 void test_int_array_struct_source () {
80- int a[4 ] = {};
81- assert (std::fill_n (a, UDI (4 ), source ()) == a + 4 );
82- assert (a[0 ] == 1 );
83- assert (a[1 ] == 1 );
84- assert (a[2 ] == 1 );
85- assert (a[3 ] == 1 );
86- }
87-
88- class A {
60+ class CharWrapper {
8961 char a_;
9062
9163public:
92- TEST_CONSTEXPR A () : a_(' a' ) {};
93- TEST_CONSTEXPR explicit A (char a) : a_(a) {}
64+ TEST_CONSTEXPR CharWrapper () : a_(' a' ) {};
65+ TEST_CONSTEXPR explicit CharWrapper (char a) : a_(a) {}
9466 TEST_CONSTEXPR operator unsigned char () const { return ' b' ; }
9567
96- TEST_CONSTEXPR friend bool operator ==(const A & x, const A & y) { return x.a_ == y.a_ ; }
68+ TEST_CONSTEXPR friend bool operator ==(const CharWrapper & x, const CharWrapper & y) { return x.a_ == y.a_ ; }
9769};
9870
99- struct B {
100- TEST_CONSTEXPR B () : c(0 ) {}
101- TEST_CONSTEXPR B (char xc) : c(xc + 1 ) {}
71+ struct CharTransformer {
72+ TEST_CONSTEXPR CharTransformer () : c(0 ) {}
73+ TEST_CONSTEXPR CharTransformer (char xc) : c(xc + 1 ) {}
10274 char c;
10375};
10476
105- struct Storage {
77+ struct CharUnionStorage {
10678 union {
10779 unsigned char a;
10880 unsigned char b;
@@ -154,35 +126,59 @@ TEST_CONSTEXPR_CXX20 bool test_vector_bool(std::size_t N) {
154126 return true ;
155127}
156128
157- TEST_CONSTEXPR_CXX20 void test_struct_array () {
158- {
159- A a[3 ];
160- assert (std::fill_n (&a[0 ], UDI (3 ), A (' a' )) == a + 3 );
161- assert (a[0 ] == A (' a' ));
162- assert (a[1 ] == A (' a' ));
163- assert (a[2 ] == A (' a' ));
164- }
165- {
166- B b[4 ] = {};
167- assert (std::fill_n (b, UDI (4 ), static_cast <char >(10 )) == b + 4 );
168- assert (b[0 ].c == 11 );
169- assert (b[1 ].c == 11 );
170- assert (b[2 ].c == 11 );
171- assert (b[3 ].c == 11 );
172- }
173- {
174- Storage foo[5 ];
175- std::fill_n (&foo[0 ], UDI (5 ), Storage ());
176- }
177- }
178-
179129TEST_CONSTEXPR_CXX20 bool test () {
180130 types::for_each (types::forward_iterator_list<char *>(), Test<char >());
181131 types::for_each (types::forward_iterator_list<int *>(), Test<int >());
182132
183- test_int_array ();
184- test_struct_array ();
185- test_int_array_struct_source ();
133+ { // Test with int arrays
134+ {
135+ int a[4 ] = {};
136+ assert (std::fill_n (a, UDI (4 ), static_cast <char >(1 )) == a + 4 );
137+ assert (a[0 ] == 1 && a[1 ] == 1 && a[2 ] == 1 && a[3 ] == 1 );
138+ }
139+ #if TEST_STD_VER >= 11
140+ {
141+ const std::size_t N = 5 ;
142+ int ib[] = {0 , 0 , 0 , 0 , 0 , 0 }; // one bigger than N
143+
144+ auto it = std::fill_n (std::begin (ib), N, 5 );
145+ assert (it == (std::begin (ib) + N) && std::all_of (std::begin (ib), it, [](int a) { return a == 5 ; }) &&
146+ *it == 0 // don't overwrite the last value in the output array
147+ );
148+ }
149+ #endif
150+ }
151+
152+ { // Test with struct arrays
153+ {
154+ CharWrapper a[3 ];
155+ assert (std::fill_n (&a[0 ], UDI (3 ), CharWrapper (' a' )) == a + 3 );
156+ assert (a[0 ] == CharWrapper (' a' ));
157+ assert (a[1 ] == CharWrapper (' a' ));
158+ assert (a[2 ] == CharWrapper (' a' ));
159+ }
160+ {
161+ CharTransformer b[4 ] = {};
162+ assert (std::fill_n (b, UDI (4 ), static_cast <char >(10 )) == b + 4 );
163+ assert (b[0 ].c == 11 );
164+ assert (b[1 ].c == 11 );
165+ assert (b[2 ].c == 11 );
166+ assert (b[3 ].c == 11 );
167+ }
168+ {
169+ CharUnionStorage foo[5 ];
170+ std::fill_n (&foo[0 ], UDI (5 ), CharUnionStorage ());
171+ }
172+ }
173+
174+ { // Test with an int array and struct source
175+ int a[4 ] = {};
176+ assert (std::fill_n (a, UDI (4 ), source ()) == a + 4 );
177+ assert (a[0 ] == 1 );
178+ assert (a[1 ] == 1 );
179+ assert (a[2 ] == 1 );
180+ assert (a[3 ] == 1 );
181+ }
186182
187183 { // Test vector<bool>::iterator optimization
188184 assert (test_vector_bool (8 ));
0 commit comments