diff options
| author | Tyge Løvset <[email protected]> | 2023-08-08 12:28:15 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2023-08-08 15:57:25 +0200 |
| commit | c27c266b6c4ae0e5e535b18c3790ee97416412b9 (patch) | |
| tree | 0b73c9cf644486abbc9213f98c1c308b7511c7dc /misc/examples/coroutines/generator.c | |
| parent | 9e13d34c82abfeeadcc8697331f9fd3e5e7f2bca (diff) | |
| download | STC-modified-c27c266b6c4ae0e5e535b18c3790ee97416412b9.tar.gz STC-modified-c27c266b6c4ae0e5e535b18c3790ee97416412b9.zip | |
Reverted cco_cleanup => cco_final. (cco_cleanup deprecated).
Updated generator.c example. Misc internal refactoring.
Diffstat (limited to 'misc/examples/coroutines/generator.c')
| -rw-r--r-- | misc/examples/coroutines/generator.c | 28 |
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); + } } |
