From 75db40a4ff5528234f977ead191eef4c401205e6 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Wed, 26 Apr 2017 23:46:49 +0200 Subject: [PATCH] Fix prototype of _reduce : dest may not be an array. It is therefore needed to pass a pointer. Add _map_reduce method. --- m-algo.h | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/m-algo.h b/m-algo.h index db6a0a67..62ca5f15 100644 --- a/m-algo.h +++ b/m-algo.h @@ -127,21 +127,41 @@ } \ } \ \ - static inline void M_C(name, _reduce) (type_t dest, \ + static inline void M_C(name, _reduce) (type_t *dest, \ container_t l, \ void (*f)(type_t, type_t const) ) \ { \ bool initDone = false; \ for M_EACH(item, l, cont_oplist) { \ if (initDone) \ - f(dest, *item); \ + f(*dest, *item); \ else { \ - M_GET_SET type_oplist (dest, *item); \ + M_GET_SET type_oplist (*dest, *item); \ initDone = true; \ } \ } \ } \ \ + static inline void M_C(name, _map_reduce) (type_t *dest, \ + container_t l, \ + void (*r)(type_t, type_t const), \ + void (*m)(type_t, type_t const) ) \ + { \ + bool initDone = false; \ + type_t tmp; \ + M_GET_INIT type_oplist (tmp); \ + for M_EACH(item, l, cont_oplist) { \ + m(tmp, *item); \ + if (initDone) \ + r(*dest, tmp); \ + else { \ + M_GET_SET type_oplist (*dest, tmp); \ + initDone = true; \ + } \ + } \ + M_GET_CLEAR type_oplist (tmp); \ + } \ + \ M_IF_METHOD(CMP, type_oplist)( \ static inline type_t *M_C(name, _min) (/*const*/ container_t l) \ { \