From a4e5db32fc40770b94ca410f815e0becba71ab09 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 31 Mar 2022 21:45:19 -0700 Subject: iter: new minimizing, argmax, argmin clauses. --- cppawk-include/iter.h | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'cppawk-include') 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 -- cgit v1.2.3