summaryrefslogtreecommitdiffhomepage
path: root/misc/examples/coroutines/generator.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/examples/coroutines/generator.c')
-rw-r--r--misc/examples/coroutines/generator.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/misc/examples/coroutines/generator.c b/misc/examples/coroutines/generator.c
index 3f51ce9c..96498498 100644
--- a/misc/examples/coroutines/generator.c
+++ b/misc/examples/coroutines/generator.c
@@ -2,12 +2,15 @@
#include <stdio.h>
#include <stc/coroutine.h>
+#include <stc/algorithm.h>
typedef struct {
- int size;
+ int max_triples;
int a, b, c;
} Triple;
+// Create an iterable generator over Triple with count items.
+// Requires coroutine Triple_next() and function Triple_begin() to be defined.
cco_iter_struct(Triple,
int count;
);
@@ -20,16 +23,15 @@ int Triple_next(Triple_iter* it) {
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)
+ if (it->count++ == g->max_triples)
cco_return;
cco_yield();
}
}
}
}
- cco_cleanup:
- it->ref = NULL;
- puts("done");
+ cco_final:
+ it->ref = NULL; // stop the iterator
}
return 0;
}
@@ -43,12 +45,22 @@ Triple_iter Triple_begin(Triple* g) {
int main(void)
{
- puts("Pythagorean triples; stops at 100 triples or c >= 100:");
- Triple triple = {.size=100};
+ puts("Pythagorean triples.\nGet max 200 triples with c < 50:");
+ Triple triple = {.max_triples=200};
+
c_foreach (i, Triple, triple) {
- if (i.ref->c < 100)
+ if (i.ref->c < 50)
printf("%u: (%d, %d, %d)\n", i.count, i.ref->a, i.ref->b, i.ref->c);
else
cco_stop(&i);
}
+
+ puts("\nGet the 10 first triples with odd a's and a <= 20:");
+ c_forfilter (i, Triple, triple,
+ i.ref->a <= 20 &&
+ (i.ref->a & 1) &&
+ c_flt_take(i, 10)
+ ){
+ printf("%d: (%d, %d, %d)\n", c_flt_getcount(i), i.ref->a, i.ref->b, i.ref->c);
+ }
}