diff options
| author | Tyge Løvset <[email protected]> | 2023-03-09 18:53:31 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2023-03-09 18:53:31 +0100 |
| commit | 130fac827859005a266d77cb8caee6477af375d7 (patch) | |
| tree | 81e90c12c845bac6a597feadff7858a6315c9e51 /include/stc | |
| parent | e7b393ae42b6fe9c7aa9dbd33303e1c586148ed1 (diff) | |
| download | STC-modified-130fac827859005a266d77cb8caee6477af375d7.tar.gz STC-modified-130fac827859005a266d77cb8caee6477af375d7.zip | |
Added c_flt_transform() and some updates to coroutine.h. Added stc/calgo.h : includes filter.h, crange.h and coroutine.h from algo subfolder.
Diffstat (limited to 'include/stc')
| -rw-r--r-- | include/stc/algo/coroutine.h | 7 | ||||
| -rw-r--r-- | include/stc/algo/filter.h | 5 | ||||
| -rw-r--r-- | include/stc/calgo.h | 8 |
3 files changed, 18 insertions, 2 deletions
diff --git a/include/stc/algo/coroutine.h b/include/stc/algo/coroutine.h index 3aa4678a..00428f75 100644 --- a/include/stc/algo/coroutine.h +++ b/include/stc/algo/coroutine.h @@ -62,6 +62,10 @@ enum { cco_state_done = -2, }; +typedef struct { + int cco_state; +} cco_state; + #define cco_alive(ctx) ((ctx)->cco_state > 0) #define cco_done(ctx) ((ctx)->cco_state == cco_state_done) @@ -84,6 +88,9 @@ enum { case __LINE__:; \ } while (0) +#define cco_yield_2(corocall, ctx) \ + cco_yield_3(corocall, ctx,) + #define cco_yield_3(corocall, ctx, retval) \ do { \ *_state = __LINE__; \ diff --git a/include/stc/algo/filter.h b/include/stc/algo/filter.h index 48a36d9b..4c257fd3 100644 --- a/include/stc/algo/filter.h +++ b/include/stc/algo/filter.h @@ -57,12 +57,13 @@ int main() #define c_flt_skip(i, n) (c_flt_count(i) > (n)) #define c_flt_skipwhile(i, pred) ((i).b.s2[(i).b.s2top++] |= !(pred)) #define c_flt_takewhile(i, pred) _flt_takewhile(&(i).b, pred) +#define c_flt_transform(i, expr) (*((i).ref = &(i).val) = expr, true) #define c_flt_last(i) (i).b.s1[(i).b.s1top-1] #define c_flt_count(i) ++(i).b.s1[(i).b.s1top++] #define c_forfilter(i, C, cnt, filter) \ - for (struct {struct _flt_base b; C##_iter it; C##_value *ref;} \ - i = {.it=C##_begin(&cnt), .ref=i.it.ref} ; !i.b.done & (i.ref != NULL) ; \ + for (struct {struct _flt_base b; C##_iter it; C##_value *ref, val;} \ + i = {.it=C##_begin(&cnt), .ref=i.it.ref} ; !i.b.done & (i.it.ref != NULL) ; \ C##_next(&i.it), i.ref = i.it.ref, i.b.s1top=0, i.b.s2top=0) \ if (!(filter)) ; else diff --git a/include/stc/calgo.h b/include/stc/calgo.h new file mode 100644 index 00000000..21e73faf --- /dev/null +++ b/include/stc/calgo.h @@ -0,0 +1,8 @@ +#ifndef STC_CALGO_INCLUDED +#define STC_CALGO_INCLUDED + +#include "algo/crange.h" +#include "algo/filter.h" +#include "algo/coroutine.h" + +#endif |
