summaryrefslogtreecommitdiffhomepage
path: root/misc/examples/generator.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/examples/generator.c')
-rw-r--r--misc/examples/generator.c48
1 files changed, 25 insertions, 23 deletions
diff --git a/misc/examples/generator.c b/misc/examples/generator.c
index 2bccc489..a15f9ba5 100644
--- a/misc/examples/generator.c
+++ b/misc/examples/generator.c
@@ -4,49 +4,51 @@
#include <stdio.h>
typedef struct {
- int n;
+ int size;
int a, b, c;
-} Triple_value, Triple;
+} Triple, Triple_value;
typedef struct {
Triple_value* ref;
+ int count;
int cco_state;
} Triple_iter;
-bool Triple_next(Triple_iter* it) {
- Triple_value* t = it->ref;
- cco_begin(it);
- for (t->c = 1;; ++t->c) {
- for (t->a = 1; t->a < t->c; ++t->a) {
- for (t->b = t->a; t->b < t->c; ++t->b) {
- if (t->a*t->a + t->b*t->b == t->c*t->c) {
- if (t->n-- == 0) cco_return;
- cco_yield(true);
+int Triple_next(Triple_iter* it) {
+ Triple_value* g = it->ref;
+ cco_routine(it)
+ {
+ for (g->c = 5; g->size; ++g->c) {
+ for (g->a = 1; g->a < g->c; ++g->a) {
+ for (g->b = g->a; g->b < g->c; ++g->b) {
+ if (g->a*g->a + g->b*g->b == g->c*g->c) {
+ if (it->count++ == g->size)
+ cco_return;
+ cco_yield();
}
}
}
}
- cco_final:
- it->ref = NULL;
- cco_end(false);
+ cco_cleanup:
+ it->ref = NULL;
+ }
+ return 0;
}
-Triple_iter Triple_begin(Triple* t) {
- Triple_iter it = {t};
- if (t->n > 0) Triple_next(&it);
- else it.ref = NULL;
+Triple_iter Triple_begin(Triple* g) {
+ Triple_iter it = {.ref=g};
+ Triple_next(&it);
return it;
}
-int main()
+int main(void)
{
puts("Pythagorean triples with c < 100:");
- Triple t = {INT32_MAX};
- c_foreach (i, Triple, t)
- {
+ Triple triple = {.size=30}; // max number of triples
+ c_foreach (i, Triple, triple) {
if (i.ref->c < 100)
- printf("%u: (%d, %d, %d)\n", INT32_MAX - i.ref->n + 1, i.ref->a, i.ref->b, i.ref->c);
+ printf("%u: (%d, %d, %d)\n", i.count, i.ref->a, i.ref->b, i.ref->c);
else
cco_stop(&i);
}