summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--docs/ccommon_api.md15
-rw-r--r--examples/forfilter.c2
-rw-r--r--include/stc/ccommon.h5
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