From 3528b08fa71d43b9541a6c56fb79bc9f95d97dd6 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 23 Apr 2022 17:57:11 -0700 Subject: iter: argmax, argmin: argument need not be variable! --- cppawk-include/base.h | 1 + cppawk-include/iter.h | 48 ++++++++++++++++++++++++------------------------ 2 files changed, 25 insertions(+), 24 deletions(-) (limited to 'cppawk-include') diff --git a/cppawk-include/base.h b/cppawk-include/base.h index 751da86..4012d95 100644 --- a/cppawk-include/base.h +++ b/cppawk-include/base.h @@ -37,6 +37,7 @@ #define __str(x) # x #define __xstr(x) __str(x) #define __g(name) __xcat(__, __xcat(name, __LINE__)) +#define __gx(name, ext) __xcat(__, __xcat(name, __xcat(ext, __LINE__))) #define __error(...) { printf(__VA_ARGS__); print; exit 1 } diff --git a/cppawk-include/iter.h b/cppawk-include/iter.h index 1ac3ac2..f73fbea 100644 --- a/cppawk-include/iter.h +++ b/cppawk-include/iter.h @@ -244,40 +244,40 @@ function __loop_argmax(a, arga, b, argb) return a > b ? arga : argb; } -#define __am_max __g(amx) -#define __am_min __g(ami) -#define __am_old __g(arg) - -#define __temp_argmax(amx, arg, expr) __am_max, __am_old, -#define __init_argmax(amx, arg, expr) (__am_max = __nil) || (amx = __nil) -#define __test_argmax(amx, arg, expr) 1 -#define __prep_argmax(amx, arg, expr) ((__am_old = __am_max) || 1) && \ - ((__am_max = \ - (__null(__am_max) \ +#define __ami(v) __gx(v, _max) +#define __amx(v) __gx(v, _min) +#define __amo(v) __gx(v, _old) + +#define __temp_argmax(am, arg, expr) __amx(am), __amo(am), +#define __init_argmax(am, arg, expr) (__amx(am) = __nil) || (am = __nil) +#define __test_argmax(am, arg, expr) 1 +#define __prep_argmax(am, arg, expr) ((__amo(am) = __amx(am)) || 1) && \ + ((__amx(am) = \ + (__null(__amx(am)) \ ? expr \ - : __loop_max(__am_max, \ + : __loop_max(__amx(am), \ expr))) || 1) && \ - ((__am_old != __am_max) ? amx = arg : 1) -#define __fini_argmax(amx, arg, expr) 1 -#define __step_argmax(amx, arg, expr) 1 + ((__amo(am) != __amx(am)) ? am = arg : 1) +#define __fini_argmax(am, arg, expr) 1 +#define __step_argmax(am, arg, expr) 1 function __loop_argmin(a, arga, b, argb) { return a < b ? arga : argb; } -#define __temp_argmin(ami, arg, expr) __am_min, __am_old, -#define __init_argmin(ami, arg, expr) (__am_min = __nil) || (ami = __nil) -#define __test_argmin(ami, arg, expr) 1 -#define __prep_argmin(ami, arg, expr) ((__am_old = __am_min) || 1) && \ - ((__am_min = \ - (__null(__am_min) \ +#define __temp_argmin(am, arg, expr) __ami(am), __amo(am), +#define __init_argmin(am, arg, expr) (__ami(am) = __nil) || (am = __nil) +#define __test_argmin(am, arg, expr) 1 +#define __prep_argmin(am, arg, expr) ((__amo(am) = __ami(am)) || 1) && \ + ((__ami(am) = \ + (__null(__ami(am)) \ ? expr \ - : __loop_min(__am_min, \ + : __loop_min(__ami(am), \ expr))) || 1) && \ - ((__am_old != __am_min) ? ami = arg : 1) -#define __fini_argmin(ami, arg, expr) 1 -#define __step_argmin(ami, arg, expr) 1 + ((__amo(am) != __ami(am)) ? am = arg : 1) +#define __fini_argmin(am, arg, expr) 1 +#define __step_argmin(am, arg, expr) 1 #define __temp_while(expr) #define __init_while(expr) 1 -- cgit v1.2.3