diff options
Diffstat (limited to 'cppawk-include')
-rw-r--r-- | cppawk-include/iter.h | 47 |
1 files changed, 47 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 |