@@ -52,57 +52,29 @@ struct Test {
52
52
}
53
53
};
54
54
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
-
74
55
struct source {
75
56
TEST_CONSTEXPR source () = default;
76
57
TEST_CONSTEXPR_CXX20 operator int () const { return 1 ; }
77
58
};
78
59
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 {
89
61
char a_;
90
62
91
63
public:
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) {}
94
66
TEST_CONSTEXPR operator unsigned char () const { return ' b' ; }
95
67
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_ ; }
97
69
};
98
70
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 ) {}
102
74
char c;
103
75
};
104
76
105
- struct Storage {
77
+ struct CharUnionStorage {
106
78
union {
107
79
unsigned char a;
108
80
unsigned char b;
@@ -154,35 +126,59 @@ TEST_CONSTEXPR_CXX20 bool test_vector_bool(std::size_t N) {
154
126
return true ;
155
127
}
156
128
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
-
179
129
TEST_CONSTEXPR_CXX20 bool test () {
180
130
types::for_each (types::forward_iterator_list<char *>(), Test<char >());
181
131
types::for_each (types::forward_iterator_list<int *>(), Test<int >());
182
132
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
+ }
186
182
187
183
{ // Test vector<bool>::iterator optimization
188
184
assert (test_vector_bool (8 ));
0 commit comments