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);
72test_indirect_array (
int line,
83 const char tname[] =
"int";
85 std::valarray<T> asrc (make_array<int>(
array));
86 const std::valarray<std::size_t> ainx (make_array<std::size_t> (inxs));
87 const std::valarray<T> aarg (make_array<int>(args));
93 const std::valarray<T> expect =
94 make_array<int>(
result, *opname ? 0 : asrc.
size ());
98 const std::indirect_array<T> ia (asrc [ainx]);
102 for (
const char *op = opname; *op; ) {
105 for ( ;
' ' == *op; ++op);
111 case ',': ia = aarg.size () ? aarg [0] : 0;
break;
114 case '=': ia = aarg; op += 1;
break;
117 case '*': ia *= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
118 case '/': ia /= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
119 case '%': ia %= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
120 case '+': ia += aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
121 case '-': ia -= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
122 case '^': ia ^= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
123 case '&': ia &= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
124 case '|': ia |= aarg;
RW_ASSERT (
'=' == op [1]); op += 2;
break;
125 case '<': ia <<= aarg;
RW_ASSERT (
'=' == op [2]); op += 3;
break;
126 case '>': ia >>= aarg;
RW_ASSERT (
'=' == op [2]); op += 3;
break;
132 for ( ;
' ' == *op; ++op);
141 if (
'\0' == *opname) {
143 ia = aarg.size () ? aarg [0] : 0;
147 for (std::size_t
i = 0;
i != asrc.size (); ++
i, ++nequal) {
148 if (asrc [
i] != expect [
i])
153 nmatch = int (asrc.size ());
155 const int*
const expect_begin = expect.size () ? &expect [0] : 0;
156 const int*
const actual_begin = asrc.size () ? &asrc [0] : 0;
159 "valarray<%s>({%s})[valarray<size_t>({%s})] %s "
160 "valarray<%1$s>({%s}) %c= {%{*.*Ad}}, got {%{*.*Ad}}",
162 nmatch ==
int (asrc.size ()) ?
'=' :
'!',
163 int (sizeof (int)), int (expect.
size ()), expect_begin,
164 int (sizeof (int)), int (asrc.
size ()), actual_begin);
172#define TEST(array, inx, op, arg, res, nmatch) \
173 test_indirect_array (__LINE__, array, inx, op, arg, res, nmatch)
178 "std::indirect_array<int>::operator=(int)");
188 TEST (
"",
"", 0,
"0",
"", -1);
189 TEST (
"1",
"", 0,
"0",
"1", -1);
191 TEST (
"1",
"0", 0,
"2",
"2", -1);
192 TEST (
"1,2",
"0", 0,
"3",
"3,2", -1);
193 TEST (
"1,2,3",
"0", 0,
"4",
"4,2,3", -1);
194 TEST (
"1,2,3,4",
"0", 0,
"5",
"5,2,3,4", -1);
195 TEST (
"1,2,3,4,5",
"0", 0,
"6",
"6,2,3,4,5", -1);
197 TEST (
"1,2,3,4,5",
"0,1", 0,
"6",
"6,6,3,4,5", -1);
198 TEST (
"1,2,3,4,5",
"0,2", 0,
"6",
"6,2,6,4,5", -1);
199 TEST (
"1,2,3,4,5",
"0,3", 0,
"6",
"6,2,3,6,5", -1);
200 TEST (
"1,2,3,4,5",
"0,4", 0,
"6",
"6,2,3,4,6", -1);
202 TEST (
"1,2,3,4,5",
"0,1,2", 0,
"6",
"6,6,6,4,5", -1);
203 TEST (
"1,2,3,4,5",
"0,1,3", 0,
"6",
"6,6,3,6,5", -1);
204 TEST (
"1,2,3,4,5",
"0,1,4", 0,
"6",
"6,6,3,4,6", -1);
206 TEST (
"1,2,3,4,5",
"0,2,1", 0,
"6",
"6,6,6,4,5", -1);
207 TEST (
"1,2,3,4,5",
"0,2,3", 0,
"6",
"6,2,6,6,5", -1);
208 TEST (
"1,2,3,4,5",
"0,2,4", 0,
"6",
"6,2,6,4,6", -1);
210 TEST (
"1,2,3,4,5",
"0,3,1", 0,
"6",
"6,6,3,6,5", -1);
211 TEST (
"1,2,3,4,5",
"0,3,2", 0,
"6",
"6,2,6,6,5", -1);
212 TEST (
"1,2,3,4,5",
"0,3,4", 0,
"6",
"6,2,3,6,6", -1);
215 rw_info (0, 0, __LINE__, \
216 "std::indirect_array<int>::operator%s(std::valarray<int>)", op);
228 TEST (
"",
"",
"=",
"",
"", -1 );
229 TEST (
"1",
"",
"=",
"",
"1", -1 );
230 TEST (
"1",
"0",
"=",
"2",
"2", -1 );
231 TEST (
"1",
"0",
"=",
"3",
"3", -1 );
232 TEST (
"2",
"0",
"=",
"4",
"1", 0 );
234 TEST (
"1,2",
"",
"=",
"",
"1,2", -1);
235 TEST (
"1,2",
"0",
"=",
"3",
"3,2", -1);
236 TEST (
"1,2",
"1",
"=",
"3",
"1,3", -1);
238 TEST (
"1,2,3",
"",
"=",
"",
"1,2,3", -1);
239 TEST (
"1,2,3",
"0,1",
"=",
"5,4",
"5,4,3", -1);
240 TEST (
"1,2,3",
"0,2",
"=",
"5,4",
"5,2,4", -1);
241 TEST (
"1,2,3",
"1,0",
"=",
"5,4",
"4,5,3", -1);
242 TEST (
"1,2,3",
"1,2",
"=",
"5,4",
"1,5,4", -1);
243 TEST (
"1,2,3",
"2,0",
"=",
"5,4",
"4,2,5", -1);
244 TEST (
"1,2,3",
"2,1",
"=",
"5,4",
"1,4,5", -1);
246 TEST (
"1,2,3,4",
"",
"=",
"",
"1,2,3,4", -1);
247 TEST (
"1,2,3,4",
"0",
"=",
"9",
"9,2,3,4", -1);
248 TEST (
"1,2,3,4",
"1",
"=",
"9",
"1,9,3,4", -1);
249 TEST (
"1,2,3,4",
"2",
"=",
"9",
"1,2,9,4", -1);
250 TEST (
"1,2,3,4",
"3",
"=",
"9",
"1,2,3,9", -1);
252 TEST (
"1,2,3,4",
"0,1",
"=",
"8,9",
"8,9,3,4", -1);
253 TEST (
"1,2,3,4",
"0,2",
"=",
"8,9",
"8,2,9,4", -1);
254 TEST (
"1,2,3,4",
"0,3",
"=",
"8,9",
"8,2,3,9", -1);
256 TEST (
"1,2,3,4",
"1,0",
"=",
"8,9",
"9,8,3,4", -1);
257 TEST (
"1,2,3,4",
"1,2",
"=",
"8,9",
"1,8,9,4", -1);
258 TEST (
"1,2,3,4",
"1,3",
"=",
"8,9",
"1,8,3,9", -1);
260 TEST (
"1,2,3,4",
"2,0",
"=",
"8,9",
"9,2,8,4", -1);
261 TEST (
"1,2,3,4",
"2,1",
"=",
"8,9",
"1,9,8,4", -1);
262 TEST (
"1,2,3,4",
"2,3",
"=",
"8,9",
"1,2,8,9", -1);
264 TEST (
"1,2,3,4",
"3,0",
"=",
"8,9",
"9,2,3,8", -1);
265 TEST (
"1,2,3,4",
"3,1",
"=",
"8,9",
"1,9,3,8", -1);
266 TEST (
"1,2,3,4",
"3,2",
"=",
"8,9",
"1,2,9,8", -1);
272 TEST (
"",
"",
"*=",
"",
"", -1);
273 TEST (
"1",
"",
"*=",
"",
"1", -1);
274 TEST (
"1",
"0",
"*=",
"9",
"9", -1);
276 TEST (
"1,2",
"",
"*=",
"",
"1, 2", -1);
277 TEST (
"1,2",
"0",
"*=",
"9",
"9, 2", -1);
278 TEST (
"1,2",
"1",
"*=",
"9",
"1,18", -1);
280 TEST (
"1,2",
"0,1",
"*=",
"8,9",
"8,18", -1);
281 TEST (
"1,2",
"1,0",
"*=",
"8,9",
"9,16", -1);
283 TEST (
"1,2,3",
"",
"*=",
"",
"1, 2, 3", -1);
284 TEST (
"1,2,3",
"0,1",
"*=",
"8,9",
"8,18, 3", -1);
285 TEST (
"1,2,3",
"0,2",
"*=",
"8,9",
"8, 2,27", -1);
287 TEST (
"1,2,3",
"1,0",
"*=",
"8,9",
"9,16, 3", -1);
288 TEST (
"1,2,3",
"1,2",
"*=",
"8,9",
"1,16,27", -1);
290 TEST (
"1,2,3",
"2,0",
"*=",
"8,9",
"9, 2,24", -1);
291 TEST (
"1,2,3",
"2,1",
"*=",
"8,9",
"1,18,24", -1);
293 TEST (
"1,2,3,4",
"0",
"*=",
"0",
"0,2,3,4", -1);
294 TEST (
"1,2,3,4",
"1",
"*=",
"0",
"1,0,3,4", -1);
295 TEST (
"1,2,3,4",
"2",
"*=",
"0",
"1,2,0,4", -1);
296 TEST (
"1,2,3,4",
"3",
"*=",
"0",
"1,2,3,0", -1);
298 TEST (
"1,2,3,4",
"0,1",
"*=",
"5,6",
"5,12, 3, 4", -1);
299 TEST (
"1,2,3,4",
"0,2",
"*=",
"5,6",
"5, 2,18, 4", -1);
300 TEST (
"1,2,3,4",
"0,3",
"*=",
"5,6",
"5, 2, 3,24", -1);
302 TEST (
"1,2,3,4",
"1,0",
"*=",
"5,6",
"6,10, 3, 4", -1);
303 TEST (
"1,2,3,4",
"1,2",
"*=",
"5,6",
"1,10,18, 4", -1);
304 TEST (
"1,2,3,4",
"1,3",
"*=",
"5,6",
"1,10, 3,24", -1);
306 TEST (
"1,2,3,4",
"2,0",
"*=",
"5,6",
"6, 2,15, 4", -1);
307 TEST (
"1,2,3,4",
"2,1",
"*=",
"5,6",
"1,12,15, 4", -1);
308 TEST (
"1,2,3,4",
"2,3",
"*=",
"5,6",
"1, 2,15,24", -1);
314 TEST (
"10",
"0",
"/=",
"2",
" 5", -1);
315 TEST (
"10,20",
"0",
"/=",
"2",
" 5,20", -1);
316 TEST (
"10,20",
"1",
"/=",
"2",
"10,10", -1);
318 TEST (
"10,20",
"0,1",
"/=",
"5,4",
"2,5", -1);
319 TEST (
"10,20",
"1,0",
"/=",
"5,4",
"2,4", -1);
321 TEST (
"10,20,30",
"0,1",
"/=",
"5,4",
"2, 5,30", -1);
322 TEST (
"10,20,30",
"0,2",
"/=",
"5,4",
"2,20, 7", -1);
324 TEST (
"10,20,30",
"1,0",
"/=",
"5,4",
" 2,4,30", -1);
325 TEST (
"10,20,30",
"1,2",
"/=",
"5,4",
"10,4, 7", -1);
327 TEST (
"10,20,30",
"2,0",
"/=",
"5,4",
" 2,20, 6", -1);
328 TEST (
"10,20,30",
"2,1",
"/=",
"5,4",
"10, 5, 6", -1);
332 TEST (
" 1, 2, 3, 4, 5",
"0,2,4",
"*=,/=",
"6,7,8",
"1, 2, 3, 4, 5", -1);
334 TEST (
"10,20,30,40,50",
"0,2,4",
"/=,*=",
"9,8,7",
"9,20,24,40,49", -1);
340 TEST (
"10,11,12,13,14,15",
"1,3,5",
"%=",
"6,7,8",
"10,5,12,6,14,7", -1);
346 TEST (
"1,2,3,4,5,6",
"1,3,5",
"+=",
"7,8,9",
"1,9,3,12,5,15", -1);
350 TEST (
"1,2,3,4,5,6",
"1,3,5",
"+=,+=",
"7,8,9",
"1,16,3,20,5,24", -1);
352 TEST (
"1,2,3,4,5,6",
"1,3,5",
"+=,-=",
"7,8,9",
"1,2,3,4,5,6", -1);
354 TEST (
"1,2,3,4,5,6",
"1,3,5",
"+=,/=",
"7,8,9",
"1,1,3,1,5,1", -1);
360 TEST (
"9,8,7,6,5,4",
"0,1,2",
"-=",
"9,8,7",
"0,0,0,6,5,4", -1);
361 TEST (
"9,8,7,6,5,4",
"1,2,3",
"-=",
"8,7,6",
"9,0,0,0,5,4", -1);
362 TEST (
"9,8,7,6,5,4",
"2,3,4",
"-=",
"7,6,5",
"9,8,0,0,0,4", -1);
363 TEST (
"9,8,7,6,5,4",
"3,4,5",
"-=",
"6,5,4",
"9,8,7,0,0,0", -1);
364 TEST (
"9,8,7,6,5,4",
"0,2,4",
"-=",
"3,2,1",
"6,8,5,6,4,4", -1);
370 TEST (
"1,3,5,7,9",
"0,2,4",
"^=",
"2,4,5",
"3,3,1,7,12", -1);
376 TEST (
"1,3,5,7,9",
"0,2,4",
"&=",
"3,1,7",
"1,3,1,7,1", -1);
382 TEST (
"1,3,5,7,9",
"0,2,4",
"|=",
"3,1,7",
"3,3,5,7,15", -1);
388 TEST (
"1,3,5,7,9",
"0,1,2",
"<<=",
"1,1,1",
"2,6,10, 7, 9", -1);
389 TEST (
"1,3,5,7,9",
"1,2,3",
"<<=",
"1,1,1",
"1,6,10,14, 9", -1);
390 TEST (
"1,3,5,7,9",
"2,3,4",
"<<=",
"1,1,1",
"1,3,10,14,18", -1);
394 TEST (
"1,3,5,7,9",
"2,3,4",
"<<=,>>=",
"1,1,1",
"1,3,5,7,9", -1);
400 TEST (
"2,6,10, 7, 9",
"0,1,2",
">>=",
"1,1,1",
"1,3,5,7,9", -1);
401 TEST (
"1,6,10,14, 9",
"1,2,3",
">>=",
"1,1,1",
"1,3,5,7,9", -1);
402 TEST (
"1,3,10,14,18",
"2,3,4",
">>=",
"1,1,1",
"1,3,5,7,9", -1);
406 TEST (
"10,11,12,13,14",
"0,2,4",
">>=,<<=",
"1,2,3",
"10,11,12,13,8", -1);
412int main (
int argc,
char *argv[])
415 return rw_test (argc, argv, __FILE__,
416 "valarray.indirect.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, inx, op, arg, res, nmatch)
_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 *,...)