1 #include <ccan/foreach/foreach.h>
2 #include <ccan/tap/tap.h>
6 #include <ccan/foreach/foreach.c>
8 static int test_int_recursion(unsigned int level)
12 foreach_int(i, 0, 1, 2, 3, 4) {
15 sum += test_int_recursion(i);
20 static int test_ptr_recursion(const char *level)
25 foreach_ptr(i, "0", "1", "2", "3", "4") {
27 if (atoi(i) > atoi(level))
28 sum += test_ptr_recursion(i);
33 static int count_iters(void)
35 unsigned int count = 0;
36 #if !HAVE_COMPOUND_LITERALS || !HAVE_FOR_LOOP_DECLARATION
39 list_for_each(&iters, i, list)
48 const char *istr, *jstr;
53 foreach_int(i, 0, 1, 2, 3, 4)
54 foreach_int(j, 0, 1, 2, 3, 4)
56 diag("sum = %i\n", sum);
57 diag("iters = %i\n", count_iters());
59 ok1(count_iters() <= 2);
61 /* Same again... reusing iterators. */
63 foreach_int(i, 0, 1, 2, 3, 4)
64 foreach_int(j, 0, 1, 2, 3, 4)
66 diag("sum = %i\n", sum);
67 diag("iters = %i\n", count_iters());
69 ok1(count_iters() <= 2);
72 foreach_ptr(istr, "0", "1", "2", "3", "4")
73 foreach_ptr(jstr, "0", "1", "2", "3", "4")
74 sum += atoi(istr)*atoi(jstr);
75 diag("sum = %i\n", sum);
76 diag("iters = %i\n", count_iters());
78 ok1(count_iters() <= 2 + 2);
80 /* Same again... reusing iterators. */
82 foreach_ptr(istr, "0", "1", "2", "3", "4")
83 foreach_ptr(jstr, "0", "1", "2", "3", "4")
84 sum += atoi(istr)*atoi(jstr);
85 diag("sum = %i\n", sum);
86 diag("iters = %i\n", count_iters());
88 ok1(count_iters() <= 2 + 2);
90 /* Do this twice, second time shouldn't increase iterators. */
91 for (i = 0; i < 2; i++) {
92 sum = test_int_recursion(0);
93 diag("sum = %i\n", sum);
94 diag("iters = %i\n", count_iters());
96 ok1(count_iters() <= 2 + 2 + 5); /* 5 is max depth of recursion. */
98 sum = test_ptr_recursion("0");
99 diag("sum = %i\n", sum);
100 diag("iters = %i\n", count_iters());
102 ok1(count_iters() <= 2 + 2 + 5);
104 return exit_status();