43 if (0 ==
s ||
'\0' == *
s)
44 return n ? std::valarray<T>(
T (),
n) : std::valarray<T>();
48 for (std::size_t
i = 0; ; ++
i) {
51 long val = std::strtol (
s, &
end, 0);
62 return std::valarray<T>(
buf,
i);
73 typedef std::valarray<bool> BoolArray;
75 if (0 ==
s ||
'\0' == *
s)
76 return n ? BoolArray(
false,
n) : BoolArray ();
80 for (std::size_t
i = 0; ; ++
i) {
84 buf [
i] =
'1' == *
s++;
90 return BoolArray (
buf,
i);
98test_mask_array (
int line,
109 const char tname[] =
"int";
111 std::valarray<T> asrc (make_array<int>(
array));
113 const std::valarray<T> aarg (make_array<int>(args));
119 const std::valarray<T> expect =
120 make_array<int>(
result, *opname ? 0 : asrc.
size ());
124 const std::mask_array<T> ia (asrc [amask]);
128 for (
const char *op = opname; *op; ) {
131 for ( ;
' ' == *op; ++op);
137 case ',': ia = aarg.size () ? aarg [0] : 0;
break;
140 case '=': ia = aarg; op += 1;
break;
143 case '*': ia *= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
144 case '/': ia /= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
145 case '%': ia %= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
146 case '+': ia += aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
147 case '-': ia -= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
148 case '^': ia ^= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
149 case '&': ia &= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
150 case '|': ia |= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
151 case '<': ia <<= aarg;
RW_ASSERT (
'=' == op [2]); op += 3;
break;
152 case '>': ia >>= aarg;
RW_ASSERT (
'=' == op [2]); op += 3;
break;
158 for ( ;
' ' == *op; ++op);
167 if (
'\0' == *opname) {
169 ia = aarg.size () ? aarg [0] : 0;
173 for (std::size_t
i = 0;
i != asrc.size (); ++
i, ++nequal) {
174 if (asrc [
i] != expect [
i])
179 nmatch = int (asrc.size ());
181 const int*
const expect_begin = expect.size () ? &expect [0] : 0;
182 const int*
const actual_begin = asrc.size () ? &asrc [0] : 0;
184 if (
'=' == opname [0] &&
'\0' == opname [1]) {
186 "valarray<%s>({%s})[valarray<bool>({%s})] %s "
187 "%d %c= {%{*.*Ad}}, got {%{*.*Ad}}",
188 tname,
array, mask, opname,
189 aarg.
size () ? aarg [0] : 0,
190 nmatch == int (asrc.
size ()) ?
'=' :
'!',
191 int (sizeof (int)), int (expect.
size ()), expect_begin,
192 int (sizeof (int)), int (asrc.
size ()), actual_begin);
196 "valarray<%s>({%s})[valarray<bool>({%s})] %s "
197 "valarray<%1$s>({%s}) %c= {%{*.*Ad}}, got {%{*.*Ad}}",
199 nmatch ==
int (asrc.size ()) ?
'=' :
'!',
200 int (sizeof (int)), int (expect.
size ()), expect_begin,
201 int (sizeof (int)), int (asrc.
size ()), actual_begin);
210#define TEST(array, mask, op, arg, res) \
211 test_mask_array (__LINE__, array, mask, op, arg, res, -1)
216 "std::mask_array<int>::operator=(int)");
226 TEST (
"",
"", 0,
"0",
"");
227 TEST (
"1",
"", 0,
"0",
"1");
229 TEST (
"1",
"1", 0,
"2",
"2");
230 TEST (
"1,2",
"10", 0,
"3",
"3,2");
231 TEST (
"1,2,3",
"100", 0,
"4",
"4,2,3");
232 TEST (
"1,2,3,4",
"1000", 0,
"5",
"5,2,3,4");
233 TEST (
"1,2,3,4,5",
"10000", 0,
"6",
"6,2,3,4,5");
235 TEST (
"1,2,3,4,5",
"11000", 0,
"6",
"6,6,3,4,5");
236 TEST (
"1,2,3,4,5",
"10100", 0,
"6",
"6,2,6,4,5");
237 TEST (
"1,2,3,4,5",
"10010", 0,
"6",
"6,2,3,6,5");
238 TEST (
"1,2,3,4,5",
"10001", 0,
"6",
"6,2,3,4,6");
240 TEST (
"1,2,3,4,5",
"11100", 0,
"6",
"6,6,6,4,5");
241 TEST (
"1,2,3,4,5",
"11010", 0,
"6",
"6,6,3,6,5");
242 TEST (
"1,2,3,4,5",
"11001", 0,
"6",
"6,6,3,4,6");
244 TEST (
"1,2,3,4,5",
"10110", 0,
"6",
"6,2,6,6,5");
245 TEST (
"1,2,3,4,5",
"10101", 0,
"6",
"6,2,6,4,6");
247 TEST (
"1,2,3,4,5",
"11010", 0,
"6",
"6,6,3,6,5");
248 TEST (
"1,2,3,4,5",
"10110", 0,
"6",
"6,2,6,6,5");
249 TEST (
"1,2,3,4,5",
"10011", 0,
"6",
"6,2,3,6,6");
252 rw_info (0, 0, __LINE__, \
253 "std::mask_array<int>::operator%s(std::valarray<int>)", op);
265 TEST (
"",
"",
"=",
"",
"");
266 TEST (
"1",
"",
"=",
"",
"1");
267 TEST (
"1",
"1",
"=",
"2",
"2");
268 TEST (
"1",
"1",
"=",
"3",
"3");
269 TEST (
"2",
"1",
"=",
"4",
"4");
271 TEST (
"1,2",
"",
"=",
"",
"1,2");
272 TEST (
"1,2",
"01",
"=",
"3",
"1,3");
273 TEST (
"1,2",
"10",
"=",
"3",
"3,2");
274 TEST (
"1,2",
"11",
"=",
"3,4",
"3,4");
276 TEST (
"1,2,3",
"",
"=",
"",
"1,2,3");
277 TEST (
"1,2,3",
"000",
"=",
"",
"1,2,3");
278 TEST (
"1,2,3",
"001",
"=",
"6",
"1,2,6");
279 TEST (
"1,2,3",
"010",
"=",
"6",
"1,6,3");
280 TEST (
"1,2,3",
"011",
"=",
"6,5",
"1,6,5");
281 TEST (
"1,2,3",
"100",
"=",
"6",
"6,2,3");
282 TEST (
"1,2,3",
"101",
"=",
"6,5",
"6,2,5");
283 TEST (
"1,2,3",
"110",
"=",
"6,5",
"6,5,3");
284 TEST (
"1,2,3",
"111",
"=",
"6,5,4",
"6,5,4");
286 TEST (
"1,2,3,4",
"",
"=",
"",
"1,2,3,4");
287 TEST (
"1,2,3,4",
"0",
"=",
"",
"1,2,3,4");
288 TEST (
"1,2,3,4",
"1",
"=",
"5",
"5,2,3,4");
289 TEST (
"1,2,3,4",
"00",
"=",
"",
"1,2,3,4");
290 TEST (
"1,2,3,4",
"01",
"=",
"5",
"1,5,3,4");
291 TEST (
"1,2,3,4",
"10",
"=",
"5",
"5,2,3,4");
292 TEST (
"1,2,3,4",
"11",
"=",
"5,6",
"5,6,3,4");
294 TEST (
"1,2,3,4",
"000",
"=",
"",
"1,2,3,4");
295 TEST (
"1,2,3,4",
"001",
"=",
"5",
"1,2,5,4");
296 TEST (
"1,2,3,4",
"010",
"=",
"5",
"1,5,3,4");
297 TEST (
"1,2,3,4",
"011",
"=",
"5,6",
"1,5,6,4");
298 TEST (
"1,2,3,4",
"100",
"=",
"5",
"5,2,3,4");
299 TEST (
"1,2,3,4",
"101",
"=",
"5,6",
"5,2,6,4");
300 TEST (
"1,2,3,4",
"110",
"=",
"5,6",
"5,6,3,4");
301 TEST (
"1,2,3,4",
"111",
"=",
"5,6,7",
"5,6,7,4");
303 TEST (
"1,2,3,4",
"0000",
"=",
"",
"1,2,3,4");
304 TEST (
"1,2,3,4",
"0001",
"=",
"5",
"1,2,3,5");
305 TEST (
"1,2,3,4",
"0010",
"=",
"5",
"1,2,5,4");
306 TEST (
"1,2,3,4",
"0011",
"=",
"5,6",
"1,2,5,6");
307 TEST (
"1,2,3,4",
"0100",
"=",
"5",
"1,5,3,4");
308 TEST (
"1,2,3,4",
"0101",
"=",
"5,6",
"1,5,3,6");
309 TEST (
"1,2,3,4",
"0110",
"=",
"5,6",
"1,5,6,4");
310 TEST (
"1,2,3,4",
"0111",
"=",
"5,6,7",
"1,5,6,7");
312 TEST (
"1,2,3,4",
"1000",
"=",
"5",
"5,2,3,4");
313 TEST (
"1,2,3,4",
"1001",
"=",
"5,6",
"5,2,3,6");
314 TEST (
"1,2,3,4",
"1010",
"=",
"5,6",
"5,2,6,4");
315 TEST (
"1,2,3,4",
"1011",
"=",
"5,6,7",
"5,2,6,7");
316 TEST (
"1,2,3,4",
"1100",
"=",
"5,6",
"5,6,3,4");
317 TEST (
"1,2,3,4",
"1101",
"=",
"5,6,7",
"5,6,3,7");
318 TEST (
"1,2,3,4",
"1110",
"=",
"5,6,7",
"5,6,7,4");
319 TEST (
"1,2,3,4",
"1111",
"=",
"5,6,7,8",
"5,6,7,8");
325 TEST (
"",
"",
"*=",
"",
"");
326 TEST (
"1",
"",
"*=",
"",
"1");
327 TEST (
"1",
"0",
"*=",
"",
"1");
328 TEST (
"1",
"0",
"*=",
"5",
"1");
329 TEST (
"1",
"1",
"*=",
"5",
"5");
331 TEST (
"1,2",
"",
"*=",
"",
"1, 2");
332 TEST (
"1,2",
"0",
"*=",
"",
"1, 2");
333 TEST (
"1,2",
"00",
"*=",
"",
"1, 2");
334 TEST (
"1,2",
"01",
"*=",
"5",
"1,10");
335 TEST (
"1,2",
"10",
"*=",
"5",
"5, 2");
336 TEST (
"1,2",
"11",
"*=",
"5,6",
"5,12");
338 TEST (
"1,2,3",
"",
"*=",
"",
"1, 2, 3");
339 TEST (
"1,2,3",
"0",
"*=",
"",
"1, 2, 3");
340 TEST (
"1,2,3",
"00",
"*=",
"",
"1, 2, 3");
341 TEST (
"1,2,3",
"000",
"*=",
"",
"1, 2, 3");
342 TEST (
"1,2,3",
"001",
"*=",
"5",
"1, 2,15");
343 TEST (
"1,2,3",
"010",
"*=",
"5",
"1,10, 3");
344 TEST (
"1,2,3",
"011",
"*=",
"5,6",
"1,10,18");
345 TEST (
"1,2,3",
"100",
"*=",
"5",
"5, 2, 3");
346 TEST (
"1,2,3",
"101",
"*=",
"5,6",
"5, 2,18");
347 TEST (
"1,2,3",
"110",
"*=",
"5,6",
"5,12, 3");
348 TEST (
"1,2,3",
"111",
"*=",
"5,6,7",
"5,12,21");
350 TEST (
"1,2,3,4",
"",
"*=",
"",
"1, 2, 3, 4");
351 TEST (
"1,2,3,4",
"0",
"*=",
"",
"1, 2, 3, 4");
352 TEST (
"1,2,3,4",
"00",
"*=",
"",
"1, 2, 3, 4");
353 TEST (
"1,2,3,4",
"000",
"*=",
"",
"1, 2, 3, 4");
354 TEST (
"1,2,3,4",
"0000",
"*=",
"",
"1, 2, 3, 4");
355 TEST (
"1,2,3,4",
"0001",
"*=",
"5",
"1, 2, 3,20");
356 TEST (
"1,2,3,4",
"0010",
"*=",
"5",
"1, 2,15, 4");
357 TEST (
"1,2,3,4",
"0011",
"*=",
"5,6",
"1, 2,15,24");
358 TEST (
"1,2,3,4",
"0100",
"*=",
"5",
"1,10, 3, 4");
359 TEST (
"1,2,3,4",
"0101",
"*=",
"5,6",
"1,10, 3,24");
360 TEST (
"1,2,3,4",
"0110",
"*=",
"5,6",
"1,10,18, 4");
361 TEST (
"1,2,3,4",
"0111",
"*=",
"5,6,7",
"1,10,18,28");
362 TEST (
"1,2,3,4",
"1001",
"*=",
"5,6",
"5, 2, 3,24");
363 TEST (
"1,2,3,4",
"1010",
"*=",
"5,6",
"5, 2,18, 4");
364 TEST (
"1,2,3,4",
"1011",
"*=",
"5,6,7",
"5, 2,18,28");
365 TEST (
"1,2,3,4",
"1100",
"*=",
"5,6",
"5,12, 3, 4");
366 TEST (
"1,2,3,4",
"1101",
"*=",
"5,6,7",
"5,12, 3,28");
367 TEST (
"1,2,3,4",
"1110",
"*=",
"5,6,7",
"5,12,21, 4");
368 TEST (
"1,2,3,4",
"1111",
"*=",
"5,6,7,8",
"5,12,21,32");
372 TEST (
"1,2,3,4,5,6",
"010101",
"*=,*=",
"0,1,2",
"1,0,3,4,5,24");
378 TEST (
"",
"",
"/=",
"",
"");
379 TEST (
"10",
"",
"/=",
"",
"10");
380 TEST (
"10",
"0",
"/=",
"",
"10");
381 TEST (
"10",
"0",
"/=",
"5",
"10");
382 TEST (
"10",
"1",
"/=",
"5",
" 2");
384 TEST (
"10,20",
"",
"/=",
"",
"10,20");
385 TEST (
"10,20",
"0",
"/=",
"",
"10,20");
386 TEST (
"10,20",
"00",
"/=",
"",
"10,20");
387 TEST (
"10,20",
"01",
"/=",
"5",
"10, 4");
388 TEST (
"10,20",
"10",
"/=",
"5",
" 2,20");
389 TEST (
"10,20",
"11",
"/=",
"5,6",
" 2, 3");
391 TEST (
"10,20,30",
"",
"/=",
"",
"10,20,30");
392 TEST (
"10,20,30",
"0",
"/=",
"",
"10,20,30");
393 TEST (
"10,20,30",
"00",
"/=",
"",
"10,20,30");
394 TEST (
"10,20,30",
"000",
"/=",
"",
"10,20,30");
395 TEST (
"10,20,30",
"001",
"/=",
"5",
"10,20, 6");
396 TEST (
"10,20,30",
"010",
"/=",
"5",
"10, 4,30");
397 TEST (
"10,20,30",
"011",
"/=",
"5,6",
"10, 4, 5");
398 TEST (
"10,20,30",
"100",
"/=",
"5",
" 2,20,30");
399 TEST (
"10,20,30",
"101",
"/=",
"5,6",
" 2,20, 5");
400 TEST (
"10,20,30",
"110",
"/=",
"5,6",
" 2, 3,30");
401 TEST (
"10,20,30",
"111",
"/=",
"5,6,7",
" 2, 3, 4");
403 TEST (
"10,20,30,40",
"",
"/=",
"",
"10,20,30,40");
404 TEST (
"10,20,30,40",
"0",
"/=",
"",
"10,20,30,40");
405 TEST (
"10,20,30,40",
"00",
"/=",
"",
"10,20,30,40");
406 TEST (
"10,20,30,40",
"000",
"/=",
"",
"10,20,30,40");
407 TEST (
"10,20,30,40",
"0000",
"/=",
"",
"10,20,30,40");
408 TEST (
"10,20,30,40",
"0001",
"/=",
"5",
"10,20,30, 8");
409 TEST (
"10,20,30,40",
"0010",
"/=",
"5",
"10,20, 6,40");
410 TEST (
"10,20,30,40",
"0011",
"/=",
"5,6",
"10,20, 6, 6");
411 TEST (
"10,20,30,40",
"0100",
"/=",
"5",
"10, 4,30,40");
412 TEST (
"10,20,30,40",
"0101",
"/=",
"5,6",
"10, 4,30, 6");
413 TEST (
"10,20,30,40",
"0110",
"/=",
"5,6",
"10, 4, 5,40");
414 TEST (
"10,20,30,40",
"0111",
"/=",
"5,6,7",
"10, 4, 5, 5");
415 TEST (
"10,20,30,40",
"1000",
"/=",
"5",
" 2,20,30,40");
416 TEST (
"10,20,30,40",
"1001",
"/=",
"5,6",
" 2,20,30, 6");
417 TEST (
"10,20,30,40",
"1010",
"/=",
"5,6",
" 2,20, 5,40");
418 TEST (
"10,20,30,40",
"1011",
"/=",
"5,6,7",
" 2,20, 5, 5");
419 TEST (
"10,20,30,40",
"1100",
"/=",
"5,6",
" 2, 3,30,40");
420 TEST (
"10,20,30,40",
"1101",
"/=",
"5,6,7",
" 2, 3,30, 5");
421 TEST (
"10,20,30,40",
"1110",
"/=",
"5,6,7",
" 2, 3, 4,40");
422 TEST (
"10,20,30,40",
"1111",
"/=",
"5,6,7,8",
" 2, 3, 4, 5");
426 TEST (
"1,2,3,4,5,6",
"010101",
"*=,/=",
"7,8,9",
"1,2,3,4,5,6");
428 TEST (
"1,20,3,40,5,60",
"010101",
"/=,*=",
"7,8,9",
"1,14,3,40,5,54");
434 TEST (
"1, 2,3, 4,5, 6",
"010101",
"%=",
"3,5,7",
"1,2,3,4,5,6");
435 TEST (
"1,11,2,13,4,15",
"010101",
"%=",
"6,7,8",
"1,5,2,6,4,7");
441 TEST (
"1,2,3,4,5,6",
"010101",
"+=",
"7,8,9",
"1,9,3,12,5,15");
442 TEST (
"1,2,3,4,5,6",
"010101",
"+=,+=",
"1,2,3",
"1,4,3, 8,5,12");
448 TEST (
"9,8,7,6,5,4",
"111000",
"-=",
"9,8,7",
"0,0,0,6,5,4");
449 TEST (
"9,8,7,6,5,4",
"011100",
"-=",
"8,7,6",
"9,0,0,0,5,4");
450 TEST (
"9,8,7,6,5,4",
"001110",
"-=",
"7,6,5",
"9,8,0,0,0,4");
451 TEST (
"9,8,7,6,5,4",
"000111",
"-=",
"6,5,4",
"9,8,7,0,0,0");
452 TEST (
"9,8,7,6,5,4",
"010101",
"-=",
"3,2,1",
"9,5,7,4,5,3");
458 TEST (
"1,3,5,7,9",
"10101",
"^=",
"2,4,5",
"3,3,1,7,12");
464 TEST (
"1,3,5,7,9",
"10101",
"&=",
"3,1,7",
"1,3,1,7,1");
465 TEST (
"1,2,3,4,5",
"01010",
"&=",
"1,1",
"1,0,3,0,5");
471 TEST (
"1,3,5,7,9",
"10101",
"|=",
"3,1,7",
"3,3,5,7,15");
472 TEST (
"1,2,3,4,5",
"01010",
"|=",
"1,1",
"1,3,3,5, 5");
478 TEST (
"1,3,5,7,9",
"11100",
"<<=",
"1,1,1",
" 2, 6,10, 7, 9");
479 TEST (
"1,3,5,7,9",
"01110",
"<<=",
"1,1,1",
" 1, 6,10,14, 9");
480 TEST (
"1,3,5,7,9",
"00111",
"<<=",
"1,1,1",
" 1, 3,10,14,18");
481 TEST (
"1,3,5,7,9",
"11111",
"<<=",
"5,4,3,2,1",
"32,48,40,28,18");
485 TEST (
"1,3,5,7,9",
"00111",
"<<=,>>=",
"1,1,1",
"1,3,5,7,9");
491 TEST (
"2,6,10, 7, 9",
"11100",
">>=",
"1,1,1",
"1,3,5,7,9");
492 TEST (
"1,6,10,14, 9",
"01110",
">>=",
"1,1,1",
"1,3,5,7,9");
493 TEST (
"1,3,10,14,18",
"00111",
">>=",
"1,1,1",
"1,3,5,7,9");
497 TEST (
"10,11,12,13,14",
"10101",
">>=,<<=",
"1,2,3",
"10,11,12,13,8");
504int main (
int argc,
char *argv[])
507 return rw_test (argc, argv, __FILE__,
508 "valarray.mask.array",
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
std::valarray< T > make_array(const char *s, std::size_t n=0)
#define TEST(array, mask, op, arg, res)
std::valarray< bool > make_bool_array(const char *s, std::size_t n=0)
TOML_NODISCARD size_t size() const noexcept
Returns the number of elements in the array.
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)