diff options
| author | Tyge Løvset <[email protected]> | 2022-09-22 08:11:23 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2022-09-22 08:11:23 +0200 |
| commit | 61c222312bb1cc03ab987fdbc541039723c9e243 (patch) | |
| tree | b17f84ad042a9f58399f135e6b6d51e282a6443c | |
| parent | 43b5d0ec65ecf06bc28c4ba90bd75aaa16d4169b (diff) | |
| download | STC-modified-61c222312bb1cc03ab987fdbc541039723c9e243.tar.gz STC-modified-61c222312bb1cc03ab987fdbc541039723c9e243.zip | |
Added c_forfilter_s() and c_forloop_s() intermediate macros, supports start iter instead of *_begin().
| -rw-r--r-- | include/stc/ccommon.h | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h index 0bf371fc..69871728 100644 --- a/include/stc/ccommon.h +++ b/include/stc/ccommon.h @@ -166,11 +166,15 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle, #define c_forfilter4(it, C, cnt, filter) \ c_forfilter5(it, C, cnt, filter, true) #define c_forfilter5(it, C, cnt, filter, cond) \ - c_forloop(it, C, cnt, cond) if (!((filter) && ++it.taken)) ; else + c_forfilter_s(it, C, C##_begin(&cnt), filter, cond) +#define c_forfilter_s(it, C, start, filter, cond) \ + c_forloop_s(it, C, start, cond) if (!((filter) && ++it.taken)) ; else #define c_forloop(i, C, cnt, cond) \ + c_forloop_s(i, C, C##_begin(&cnt), cond) +#define c_forloop_s(i, C, start, cond) \ for (struct {C##_iter it; const C##_value *ref; size_t idx, taken;} \ - i = {.it=C##_begin(&cnt), .ref=i.it.ref, .idx=0, .taken=0} \ + i = {.it=start, .ref=i.it.ref, .idx=0, .taken=0} \ ; i.ref && (cond); C##_next(&i.it), i.ref = i.it.ref, ++i.idx) #define c_forpair(key, val, C, cnt) /* structured binding */ \ |
