summaryrefslogtreecommitdiffhomepage
path: root/include/stc/ccommon.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/stc/ccommon.h')
-rw-r--r--include/stc/ccommon.h42
1 files changed, 24 insertions, 18 deletions
diff --git a/include/stc/ccommon.h b/include/stc/ccommon.h
index ac55b3e9..4ed3ebf8 100644
--- a/include/stc/ccommon.h
+++ b/include/stc/ccommon.h
@@ -30,14 +30,6 @@
#include <string.h>
#include <assert.h>
-#if SIZE_MAX == UINT32_MAX
- typedef int32_t isize_t;
-# define ISIZE_MAX INT32_MAX
-#elif SIZE_MAX == UINT64_MAX
- typedef int64_t isize_t;
-# define ISIZE_MAX INT64_MAX
-#endif
-
#if defined(_MSC_VER)
# pragma warning(disable: 4116 4996) // unnamed type definition in parentheses
# define STC_FORCE_INLINE static __forceinline
@@ -171,27 +163,25 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle,
; it.ref != (C##_value*)_endref; C##_next(&it))
#ifndef c_FLT_STACK
-#define c_FLT_STACK 4
+#define c_FLT_STACK 20
#endif
-
-#define c_flt_drop(i, n) (++(i).dropped[(i).dn++] > (n))
-#define c_flt_dropwhile(i, pred) ((i).dropwhile |= !(pred))
-#define c_flt_take(i, n) (++(i).taken[(i).tn++] <= (n))
+#define c_flt_take(i, n) (++(i).stack[(i).top++] <= (n))
+#define c_flt_drop(i, n) (++(i).stack[(i).top++] > (n))
+#define c_flt_dropwhile(i, pred) ((i).stack[(i).top++] |= !(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, loopwhile) \
- c_forfilter_s(it, C, C##_begin(&cnt), filter) if (!(loopwhile)) break; else
+#define c_forfilter5(it, C, cnt, filter, takewhile) \
+ c_forfilter_s(it, C, C##_begin(&cnt), filter) if (!(takewhile)) break; else
#define c_forfilter_s(it, C, start, filter) \
c_foreach_s(it, C, start) if (!(filter)) ; else
#define c_foreach_s(i, C, start) \
for (struct {C##_iter it; C##_value *ref; \
- uint32_t index, taken[c_FLT_STACK+1], dropped[c_FLT_STACK]; \
- int8_t dn, tn; bool dropwhile;} \
+ uint32_t index, top, stack[c_FLT_STACK];} \
i = {.it=start, .ref=i.it.ref}; i.ref \
- ; C##_next(&i.it), i.ref = i.it.ref, ++i.index, i.dn=0, i.tn=0)
+ ; C##_next(&i.it), i.ref = i.it.ref, ++i.index, i.top=0)
#define c_forwhile(i, C, cnt, cond) \
for (struct {C##_iter it; C##_value *ref; size_t index;} \
@@ -213,6 +203,22 @@ STC_INLINE char* c_strnstrn(const char *s, const char *needle,
for (itype i=start, _inc=step, _end=(stop) - (_inc > 0) \
; (_inc > 0) ^ (i > _end); i += _inc)
+typedef intmax_t crange_value;
+struct {crange_value val, end, step; } typedef crange;
+struct {crange_value *ref, end, step; } typedef crange_iter;
+#define crange_from(...) c_MACRO_OVERLOAD(crange_from, __VA_ARGS__)
+#define crange_init() crange_from3(0, INTMAX_MAX, 1)
+#define crange_from1(start) crange_from3(start, INTMAX_MAX, 1)
+#define crange_from2(start, end) crange_from3(start, end, 1)
+STC_INLINE crange crange_from3(crange_value start, crange_value finish, crange_value step)
+ { crange r = {start, finish - (step > 0), step}; return r; }
+STC_INLINE crange_iter crange_begin(crange* self)
+ { crange_iter it = {&self->val, self->end, self->step}; return it; }
+STC_INLINE crange_iter crange_end(crange* self)
+ { crange_iter it = {NULL}; return it; }
+STC_INLINE void crange_next(crange_iter* it)
+ { *it->ref += it->step; if ((it->step > 0) == (*it->ref > it->end)) it->ref = NULL; }
+
#define c_forlist(it, T, ...) \
for (struct {T* data; T* ref; size_t index;} \
it = {.data=(T[])__VA_ARGS__, .ref=it.data} \