From 2e3db1c709e88d68cece8c46566ca6b8481b7c07 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Mon, 26 Sep 2022 12:58:18 +0200 Subject: Added c_flt_takewhile() filter to c_forfilter() macro. --- docs/ccommon_api.md | 15 ++++++++------- examples/forfilter.c | 2 +- include/stc/ccommon.h | 5 +++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/ccommon_api.md b/docs/ccommon_api.md index 70033445..1b364e58 100644 --- a/docs/ccommon_api.md +++ b/docs/ccommon_api.md @@ -216,19 +216,20 @@ c_forloop (i, 30, 0, -5) printf(" %lld", i); ### c_forwhile, c_forfilter Iterate containers with stop-criteria and chained range filtering. -| Usage | Description | -|:-----------------------------------------------------------|:-------------------------------------| -| `c_forwhile (it, ctype, container, whilepred)` | Iterate as long as whilepred is true | -| `c_forfilter (it, ctype, container, filter(s))` | Filter out items in chain | -| `c_forfilter (it, ctype, container, filter(s), whilepred)` | Adds a "takewhile" filter argument | +| Usage | Description | +|:--------------------------------------------------------------|:-------------------------------------| +| `c_forwhile (it, ctype, container, shortcircuit)` | Iterate until shortcircuit is false | +| `c_forfilter (it, ctype, container, filter(s))` | Filter out items in chain | +| `c_forfilter (it, ctype, container, filter(s), shortcircuit)` | Add a "short-circuit" pred/filter | | Built-in filter | Description | |:----------------------------------|:-------------------------------------| | `c_flt_drop(it, numItems)` | Drop numItems | -| `c_flt_dropwhile(it, predicate)` | Drop items until predicate is false | | `c_flt_take(it, numItems)` | Take numItems | +| `c_flt_dropwhile(it, predicate)` | Drop items until predicate is false | +| `c_flt_takewhile(it, predicate)` | Take items until predicate is false | -`it.index` holds the current item index. +`it.index` holds the index of the source item. ```c #define i_type IVec #define i_val int diff --git a/examples/forfilter.c b/examples/forfilter.c index 3ac7821b..916d8e69 100644 --- a/examples/forfilter.c +++ b/examples/forfilter.c @@ -35,7 +35,7 @@ void demo1(void) && c_flt_dropwhile(i, *i.ref != 80) && flt_even(i) && flt_remove(i, 80) - , c_flt_take(i, 5) // takewhile + , c_flt_take(i, 5) // short-circuit ){ sum += res = trf_square(i); printf(" %d", res); diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h index 15cebe09..2edab5bc 100644 --- a/include/stc/ccommon.h +++ b/include/stc/ccommon.h @@ -168,12 +168,13 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle, #define c_flt_take(i, n) (++(i).s1[(i).s1top++] <= (n)) #define c_flt_drop(i, n) (++(i).s1[(i).s1top++] > (n)) #define c_flt_dropwhile(i, pred) ((i).s2[(i).s2top++] |= !(pred)) +#define c_flt_takewhile(i, pred) !c_flt_dropwhile(i, pred) #define c_forfilter(...) c_MACRO_OVERLOAD(c_forfilter, __VA_ARGS__) #define c_forfilter4(it, C, cnt, filter) \ c_forfilter_s(it, C, C##_begin(&cnt), filter) -#define c_forfilter5(it, C, cnt, filter, takewhile) \ - c_forfilter_s(it, C, C##_begin(&cnt), filter) if (!(takewhile)) break; else +#define c_forfilter5(it, C, cnt, filter, whilepred) \ + c_forfilter_s(it, C, C##_begin(&cnt), filter) if (!(whilepred)) break; else #define c_forfilter_s(it, C, start, filter) \ c_foreach_s(it, C, start) if (!(filter)) ; else -- cgit v1.2.3