X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fforeach%2Ftest%2Frun-nested.c;fp=ccan%2Fforeach%2Ftest%2Frun-nested.c;h=13ab46678b6c6e1e9de83ff35394a886f29360a0;hp=0000000000000000000000000000000000000000;hb=daddafe53685b0b6f90a7746cbbd1a2e7df59216;hpb=2965496c70c345ea83e14d4b25e8687f7c682531 diff --git a/ccan/foreach/test/run-nested.c b/ccan/foreach/test/run-nested.c new file mode 100644 index 00000000..13ab4667 --- /dev/null +++ b/ccan/foreach/test/run-nested.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include + +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(); +} +