run-nested.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <ccan/foreach/foreach.h>
  2. #include <ccan/tap/tap.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <ccan/foreach/foreach.c>
  6. static int test_int_recursion(unsigned int level)
  7. {
  8. int i, sum = 0;
  9. foreach_int(i, 0, 1, 2, 3, 4) {
  10. sum += i;
  11. if (i > level)
  12. sum += test_int_recursion(i);
  13. }
  14. return sum;
  15. }
  16. static int test_ptr_recursion(const char *level)
  17. {
  18. int sum = 0;
  19. const char *i;
  20. foreach_ptr(i, "0", "1", "2", "3", "4") {
  21. sum += atoi(i);
  22. if (atoi(i) > atoi(level))
  23. sum += test_ptr_recursion(i);
  24. }
  25. return sum;
  26. }
  27. static int count_iters(void)
  28. {
  29. unsigned int count = 0;
  30. #if !HAVE_COMPOUND_LITERALS || !HAVE_FOR_LOOP_DECLARATION
  31. struct iter_info *i;
  32. list_for_each(&iters, i, list)
  33. count++;
  34. #endif
  35. return count;
  36. }
  37. int main(void)
  38. {
  39. int i, j, sum;
  40. const char *istr, *jstr;
  41. plan_tests(12);
  42. sum = 0;
  43. foreach_int(i, 0, 1, 2, 3, 4)
  44. foreach_int(j, 0, 1, 2, 3, 4)
  45. sum += i*j;
  46. diag("sum = %i\n", sum);
  47. diag("iters = %i\n", count_iters());
  48. ok1(sum == 100);
  49. ok1(count_iters() <= 2);
  50. /* Same again... reusing iterators. */
  51. sum = 0;
  52. foreach_int(i, 0, 1, 2, 3, 4)
  53. foreach_int(j, 0, 1, 2, 3, 4)
  54. sum += i*j;
  55. diag("sum = %i\n", sum);
  56. diag("iters = %i\n", count_iters());
  57. ok1(sum == 100);
  58. ok1(count_iters() <= 2);
  59. sum = test_int_recursion(0);
  60. diag("sum = %i\n", sum);
  61. diag("iters = %i\n", count_iters());
  62. ok1(sum == 160);
  63. ok1(count_iters() <= 2 + 5); /* 5 is max depth of recursion. */
  64. sum = 0;
  65. foreach_ptr(istr, "0", "1", "2", "3", "4")
  66. foreach_ptr(jstr, "0", "1", "2", "3", "4")
  67. sum += atoi(istr)*atoi(jstr);
  68. diag("sum = %i\n", sum);
  69. diag("iters = %i\n", count_iters());
  70. ok1(sum == 100);
  71. ok1(count_iters() <= 2 + 5 + 2);
  72. /* Same again... reusing iterators. */
  73. sum = 0;
  74. foreach_ptr(istr, "0", "1", "2", "3", "4")
  75. foreach_ptr(jstr, "0", "1", "2", "3", "4")
  76. sum += atoi(istr)*atoi(jstr);
  77. diag("sum = %i\n", sum);
  78. diag("iters = %i\n", count_iters());
  79. ok1(sum == 100);
  80. ok1(count_iters() <= 2 + 5 + 2);
  81. sum = test_ptr_recursion("0");
  82. diag("sum = %i\n", sum);
  83. diag("iters = %i\n", count_iters());
  84. ok1(sum == 160);
  85. ok1(count_iters() <= 2 + 5 + 2);
  86. return exit_status();
  87. }