summaryrefslogtreecommitdiffhomepage
path: root/include/stc/algo/filter.h
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2023-03-12 13:30:15 +0100
committerTyge Løvset <[email protected]>2023-03-12 13:30:15 +0100
commitc9be5f66a481bd040b36a25314f6589dd939daa5 (patch)
treed71cc01f17fabc526a72219c225b015b4130c8b3 /include/stc/algo/filter.h
parent1ac8bb4ff664baa838b44ed6bf62225766f000c5 (diff)
downloadSTC-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.h13
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