summaryrefslogtreecommitdiffhomepage
path: root/include/stc
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2023-03-09 18:53:31 +0100
committerTyge Løvset <[email protected]>2023-03-09 18:53:31 +0100
commit130fac827859005a266d77cb8caee6477af375d7 (patch)
tree81e90c12c845bac6a597feadff7858a6315c9e51 /include/stc
parente7b393ae42b6fe9c7aa9dbd33303e1c586148ed1 (diff)
downloadSTC-modified-130fac827859005a266d77cb8caee6477af375d7.tar.gz
STC-modified-130fac827859005a266d77cb8caee6477af375d7.zip
Added c_flt_transform() and some updates to coroutine.h. Added stc/calgo.h : includes filter.h, crange.h and coroutine.h from algo subfolder.
Diffstat (limited to 'include/stc')
-rw-r--r--include/stc/algo/coroutine.h7
-rw-r--r--include/stc/algo/filter.h5
-rw-r--r--include/stc/calgo.h8
3 files changed, 18 insertions, 2 deletions
diff --git a/include/stc/algo/coroutine.h b/include/stc/algo/coroutine.h
index 3aa4678a..00428f75 100644
--- a/include/stc/algo/coroutine.h
+++ b/include/stc/algo/coroutine.h
@@ -62,6 +62,10 @@ enum {
cco_state_done = -2,
};
+typedef struct {
+ int cco_state;
+} cco_state;
+
#define cco_alive(ctx) ((ctx)->cco_state > 0)
#define cco_done(ctx) ((ctx)->cco_state == cco_state_done)
@@ -84,6 +88,9 @@ enum {
case __LINE__:; \
} while (0)
+#define cco_yield_2(corocall, ctx) \
+ cco_yield_3(corocall, ctx,)
+
#define cco_yield_3(corocall, ctx, retval) \
do { \
*_state = __LINE__; \
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
diff --git a/include/stc/calgo.h b/include/stc/calgo.h
new file mode 100644
index 00000000..21e73faf
--- /dev/null
+++ b/include/stc/calgo.h
@@ -0,0 +1,8 @@
+#ifndef STC_CALGO_INCLUDED
+#define STC_CALGO_INCLUDED
+
+#include "algo/crange.h"
+#include "algo/filter.h"
+#include "algo/coroutine.h"
+
+#endif