diff options
| author | Tyge Løvset <[email protected]> | 2023-03-12 13:30:15 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2023-03-12 13:30:15 +0100 |
| commit | c9be5f66a481bd040b36a25314f6589dd939daa5 (patch) | |
| tree | d71cc01f17fabc526a72219c225b015b4130c8b3 /include/stc/algo/filter.h | |
| parent | 1ac8bb4ff664baa838b44ed6bf62225766f000c5 (diff) | |
| download | STC-modified-c9be5f66a481bd040b36a25314f6589dd939daa5.tar.gz STC-modified-c9be5f66a481bd040b36a25314f6589dd939daa5.zip | |
Safer state machine in coroutine.h (internal).
Removed c_forwhile() macro. Redundant, use c_forfilter().
Removed find and eq in cspan (use general c_find_if() instead for search).
Diffstat (limited to 'include/stc/algo/filter.h')
| -rw-r--r-- | include/stc/algo/filter.h | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/include/stc/algo/filter.h b/include/stc/algo/filter.h index a5e11b64..5e3125b1 100644 --- a/include/stc/algo/filter.h +++ b/include/stc/algo/filter.h @@ -35,10 +35,10 @@ int main() printf(" %d", *i.ref); puts(""); - c_forfilter (i, cstack_int, stk - , c_flt_skipwhile(i, *i.ref < 3) - && (*i.ref & 1) == 0 // even only - && c_flt_take(i, 2)) // break after 2 + c_forfilter (i, cstack_int, stk, + c_flt_skipwhile(i, *i.ref < 3) && + (*i.ref & 1) == 0 && // even only + c_flt_take(i, 2)) // break after 2 printf(" %d", *i.ref); puts(""); } @@ -57,8 +57,11 @@ int main() #define c_flt_last(i) (i).b.s1[(i).b.s1top - 1] #define c_forfilter(i, C, cnt, filter) \ + c_forfilter_it(i, C, C##_begin(&cnt), filter) + +#define c_forfilter_it(i, C, start, 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.it.ref != NULL) ; \ + i = {.it=start, .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 |
