Add macro ALGO_TRANSFORM

This commit is contained in:
Patrick Pelissier committed 2020-03-28 17:41:04 +01:00
1 parent 3add6bb5bf
commit d77a235b2a
1 file changed
+36 -3
+36 -3
View File
@@ -44,6 +44,17 @@
ALGOI_FOR_EACH_ARG(container, M_GLOBAL_OPLIST(cont_oplist), __VA_ARGS__ ))
/* Map a function or a macro to all elements of a container
into another container.
USAGE:
ALGO_TRANSFORM(contDst, contDOplist, contSrc, contSrcOplist,
function[, extra arguments of function]) */
#define ALGO_TRANSFORM(contD, contDop, contS, contSop, ...) \
M_IF_NARGS_EQ1(__VA_ARGS__) \
(ALGOI_TRANSFORM(contD, M_GLOBAL_OPLIST(contDop), contS, M_GLOBAL_OPLIST(contSop), __VA_ARGS__), \
ALGOI_TRANSFORM_ARG(contD, M_GLOBAL_OPLIST(contDop), contS, M_GLOBAL_OPLIST(contSop), __VA_ARGS__ ))
/* Extract a subset of a container to copy into another container.
USAGE:
ALGO_EXTRACT(contDst, contDstOplist, contSrc, contSrcOplist
@@ -835,7 +846,6 @@
// _average
// _sort_uniq (_sort + _uniq)
// fast _uniq for array
// _map (like _for_each but returns the new container) How to do it in a function way? Already done as macro
// _flatten (takes a set of containers and returns a new container containing all flatten objects)
@@ -852,13 +862,36 @@
} while (0)
#define ALGOI_TRANSFORM(contD, contDop, contS, contSop, func) do { \
M_CALL_CLEAN(contDop, contD); \
for M_EACH(item, contS, contSop) { \
M_GET_SUBTYPE contDop m_tmp; \
M_CALL_INIT(M_GET_OPLIST contDop, m_tmp); \
func(m_tmp, *item); \
M_CALL_PUSH_MOVE(contDop, contD, &m_tmp); \
} \
M_IF_METHOD(REVERSE, contDop) (M_CALL_REVERSE(contDop, contD);, ) \
} while (0)
#define ALGOI_TRANSFORM_ARG(contD, contDop, contS, contSop, func, ...) do { \
M_CALL_CLEAN(contDop, contD); \
for M_EACH(item, contS, contSop) { \
M_GET_SUBTYPE contDop m_tmp; \
M_CALL_INIT(M_GET_OPLIST contDop, m_tmp); \
func(m_tmp, *item, __VA_ARGS__); \
M_CALL_PUSH_MOVE(contDop, contD, &m_tmp); \
} \
M_IF_METHOD(REVERSE, contDop) (M_CALL_REVERSE(contDop, contD);, ) \
} while (0)
#define ALGOI_EXTRACT(contDst, contDstOplist, \
contSrc, contSrcOplist) do { \
M_CALL_CLEAN(contDstOplist, contDst); \
for M_EACH(item, contSrc, contSrcOplist) { \
M_CALL_PUSH(contDstOplist, contDst, *item); \
} \
M_IF_METHOD(REVERSE, contDstOplist) (M_CALL_REVERSE(contDstOplist, contDstOplist);, ) \
M_IF_METHOD(REVERSE, contDstOplist) (M_CALL_REVERSE(contDstOplist, contDst);, ) \
} while (0)
#define ALGOI_EXTRACT_FUNC(contDst, contDstOplist, \
@@ -869,7 +902,7 @@
if (condFunc (*item)) \
M_CALL_PUSH(contDstOplist, contDst, *item); \
} \
M_IF_METHOD(REVERSE, contDstOplist) (M_CALL_REVERSE(contDstOplist, contDstOplist);, ) \
M_IF_METHOD(REVERSE, contDstOplist) (M_CALL_REVERSE(contDstOplist, contDst);, ) \
} while (0)
#define ALGOI_EXTRACT_ARG(contDst, contDstOplist, \