diff options
-rw-r--r-- | cppawk-include/iter.h | 47 | ||||
-rw-r--r-- | testcases-iter | 31 |
2 files changed, 78 insertions, 0 deletions
diff --git a/cppawk-include/iter.h b/cppawk-include/iter.h index 5151f9f..77163de 100644 --- a/cppawk-include/iter.h +++ b/cppawk-include/iter.h @@ -172,6 +172,53 @@ function __loop_max(a, b) #define __fini_maximizing(var, expr) 1 #define __step_maximizing(var, expr) 1 +function __loop_min(a, b) +{ + return a > b ? b : a +} + +#define __init_minimizing(var, expr) var = nil +#define __test_minimizing(var, expr) 1 +#define __prep_minimizing(var, expr) var = (null(var) \ + ? expr \ + : __loop_min(var, expr)) +#define __fini_minimizing(var, expr) 1 +#define __step_minimizing(var, expr) 1 + +function __loop_argmax(a, arga, b, argb) +{ + return a > b ? arga : argb; +} + +#define __init_argmax(amx, arg, expr) (__g(mx) = 0) || (amx = 0) +#define __test_argmax(amx, arg, expr) 1 +#define __prep_argmax(amx, arg, expr) ((__g(om) = __g(mx)) || 1) && \ + ((__g(mx) = \ + (null(__g(mx)) \ + ? expr \ + : __loop_max(__g(mx), \ + expr))) || 1) && \ + ((__g(om) != __g(mx)) ? amx = arg : 1) +#define __fini_argmax(amx, arg, expr) 1 +#define __step_argmax(amx, arg, expr) 1 + +function __loop_argmin(a, arga, b, argb) +{ + return a < b ? arga : argb; +} + +#define __init_argmin(ami, arg, expr) (__g(mi) = 0) || (ami = 0) +#define __test_argmin(ami, arg, expr) 1 +#define __prep_argmin(ami, arg, expr) ((__g(om) = __g(mi)) || 1) && \ + ((__g(mi) = \ + (null(__g(mi)) \ + ? expr \ + : __loop_min(__g(mi), \ + expr))) || 1) && \ + ((__g(om) != __g(mi)) ? ami = arg : 1) +#define __fini_argmin(ami, arg, expr) 1 +#define __step_argmin(ami, arg, expr) 1 + #define __init_while(expr) 1 #define __test_while(expr) expr #define __prep_while(expr) 1 diff --git a/testcases-iter b/testcases-iter index ef2a9b0..b9b7d22 100644 --- a/testcases-iter +++ b/testcases-iter @@ -301,3 +301,34 @@ BEGIN { 9 10 maxpos = 10 +-- +14: +$cppawk ' +#include <iter.h> + +BEGIN { + loop (range_step (x, 0, 3.14159, 0.001), + argmax (mx, x, sin(x) * cos(x)), + argmin (mi, x, sin(x) * cos(x))) + ; // empty + + print "max x =", mx + print "min x =", mi +}' +: +max x = 0.785 +min x = 2.356 +-- +15: +$cppawk ' +#include <iter.h> + +BEGIN { + loop (list(tail, item, list(1, 2, 3, 0, 5, -3, 7)), + minimizing(min, item)) + { + } + print "min =", min +}' +: +min = -3 |