summaryrefslogtreecommitdiffhomepage
path: root/include/stc/algo/filter.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/stc/algo/filter.h')
-rw-r--r--include/stc/algo/filter.h5
1 files changed, 3 insertions, 2 deletions
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