aboutsummaryrefslogtreecommitdiffstats
path: root/cppawk-include
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-03-31 20:54:35 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-03-31 20:54:35 -0700
commit238b309af9310dc7508696df0513c1a5036aea49 (patch)
treef89157c10b2c5e6dfd85ccb1a68f976cd738b87a /cppawk-include
parent40d1cc8671870ee13184d0fb5d96a6472886ad66 (diff)
downloadcppawk-238b309af9310dc7508696df0513c1a5036aea49.tar.gz
cppawk-238b309af9310dc7508696df0513c1a5036aea49.tar.bz2
cppawk-238b309af9310dc7508696df0513c1a5036aea49.zip
loop: add summing, maximizing, while, until.
Diffstat (limited to 'cppawk-include')
-rw-r--r--cppawk-include/iter.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/cppawk-include/iter.h b/cppawk-include/iter.h
index 8b6a3ce..4abbdce 100644
--- a/cppawk-include/iter.h
+++ b/cppawk-include/iter.h
@@ -153,6 +153,37 @@
#define __fini_collect(var, expr) var = list_end(var)
#define __step_collect(var, expr) 1
+#define __init_summing(var, expr) var = 0
+#define __test_summing(var, expr) 1
+#define __prep_summing(var, expr) var += (expr)
+#define __fini_summing(var, expr) 1
+#define __step_summing(var, expr) 1
+
+function __loop_max(a, b)
+{
+ return a > b ? a : b
+}
+
+#define __init_maximizing(var, expr) var = nil
+#define __test_maximizing(var, expr) 1
+#define __prep_maximizing(var, expr) var = (null(var) \
+ ? expr \
+ : __loop_max(var, expr))
+#define __fini_maximizing(var, expr) 1
+#define __step_maximizing(var, expr) 1
+
+#define __init_while(expr) 1
+#define __test_while(expr) expr
+#define __prep_while(expr) 1
+#define __fini_while(expr) 1
+#define __step_while(expr) 1
+
+#define __init_until(expr) 1
+#define __test_until(expr) !(expr)
+#define __prep_until(expr) 1
+#define __fini_until(expr) 1
+#define __step_until(expr) 1
+
#define __init_lockstep(...) prog(__varexpand3(__init_first, __init_next, \
__VA_ARGS__))
#define __test_lockstep(...) __and(__varexpand3(__test_first, __test_next, \