| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #include <ccan/foreach/foreach.h>
- #include <ccan/tap/tap.h>
- #include <stdio.h>
- #include <string.h>
- #include <ccan/foreach/foreach.c>
- static int test_int_recursion(unsigned int level)
- {
- int i, sum = 0;
- foreach_int(i, 0, 1, 2, 3, 4) {
- sum += i;
- if (i > level)
- sum += test_int_recursion(i);
- }
- return sum;
- }
- static int test_ptr_recursion(const char *level)
- {
- int sum = 0;
- const char *i;
- foreach_ptr(i, "0", "1", "2", "3", "4") {
- sum += atoi(i);
- if (atoi(i) > atoi(level))
- sum += test_ptr_recursion(i);
- }
- return sum;
- }
- static int count_iters(void)
- {
- unsigned int count = 0;
- #if !HAVE_COMPOUND_LITERALS || !HAVE_FOR_LOOP_DECLARATION
- struct iter_info *i;
-
- list_for_each(&iters, i, list)
- count++;
- #endif
- return count;
- }
- int main(void)
- {
- int i, j, sum;
- const char *istr, *jstr;
- plan_tests(12);
- sum = 0;
- foreach_int(i, 0, 1, 2, 3, 4)
- foreach_int(j, 0, 1, 2, 3, 4)
- sum += i*j;
- diag("sum = %i\n", sum);
- diag("iters = %i\n", count_iters());
- ok1(sum == 100);
- ok1(count_iters() <= 2);
- /* Same again... reusing iterators. */
- sum = 0;
- foreach_int(i, 0, 1, 2, 3, 4)
- foreach_int(j, 0, 1, 2, 3, 4)
- sum += i*j;
- diag("sum = %i\n", sum);
- diag("iters = %i\n", count_iters());
- ok1(sum == 100);
- ok1(count_iters() <= 2);
- sum = test_int_recursion(0);
- diag("sum = %i\n", sum);
- diag("iters = %i\n", count_iters());
- ok1(sum == 160);
- ok1(count_iters() <= 2 + 5); /* 5 is max depth of recursion. */
- sum = 0;
- foreach_ptr(istr, "0", "1", "2", "3", "4")
- foreach_ptr(jstr, "0", "1", "2", "3", "4")
- sum += atoi(istr)*atoi(jstr);
- diag("sum = %i\n", sum);
- diag("iters = %i\n", count_iters());
- ok1(sum == 100);
- ok1(count_iters() <= 2 + 5 + 2);
- /* Same again... reusing iterators. */
- sum = 0;
- foreach_ptr(istr, "0", "1", "2", "3", "4")
- foreach_ptr(jstr, "0", "1", "2", "3", "4")
- sum += atoi(istr)*atoi(jstr);
- diag("sum = %i\n", sum);
- diag("iters = %i\n", count_iters());
- ok1(sum == 100);
- ok1(count_iters() <= 2 + 5 + 2);
- sum = test_ptr_recursion("0");
- diag("sum = %i\n", sum);
- diag("iters = %i\n", count_iters());
- ok1(sum == 160);
- ok1(count_iters() <= 2 + 5 + 2);
- return exit_status();
- }
-
|