diff options
| author | Tyge Løvset <[email protected]> | 2022-09-26 12:58:18 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2022-09-26 12:58:18 +0200 |
| commit | 2e3db1c709e88d68cece8c46566ca6b8481b7c07 (patch) | |
| tree | 1f0a729f9918e0ed05a370fc56ae4b84a8ca53a7 | |
| parent | b49dd3163d699852450cf18c27f012c98a0fc2f8 (diff) | |
| download | STC-modified-2e3db1c709e88d68cece8c46566ca6b8481b7c07.tar.gz STC-modified-2e3db1c709e88d68cece8c46566ca6b8481b7c07.zip | |
Added c_flt_takewhile() filter to c_forfilter() macro.
| -rw-r--r-- | docs/ccommon_api.md | 15 | ||||
| -rw-r--r-- | examples/forfilter.c | 2 | ||||
| -rw-r--r-- | 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 |
