Add ALGO ALGO_INSERT that allows inserting a container into another one.

This commit is contained in:
Patrick Pelissier committed 2018-08-08 22:44:17 +02:00
1 parent df8306c721
commit ede57a20be
2 files changed
+40 -3

No files matched your search

+20 -3
View File
@@ -75,13 +75,30 @@
/* Define, initialize, set & clear a container with a variable array list.
USAGE:
ALGO_LET_INIT_VA(container, containerOplist, param1[, param2[, ...]]) {
// Stuff with container
ALGO_LET_INIT_VA(container, containerOplist|type, param1[, param2[, ...]]) {
// Stuff with container
} */
#define ALGO_LET_INIT_VA(dest, contOp, ...) \
ALGO_LET_INIT_VAI(dest, M_GLOBAL_OPLIST(contOp), __VA_ARGS__)
#define ALGO_INSERT_AT(contDst, contDstOp, position, contSrc, contSrcOp) \
ALGOI_INSERT_AT(contDst, M_GLOBAL_OPLIST(contDstOp), position, contSrc, M_GLOBAL_OPLIST(contSrcOp) )
#define ALGOI_INSERT_AT(contDst, contDstOp, position, contSrc, contSrcOp) do { \
M_GET_IT_TYPE contSrcOp itSrc; \
M_GET_IT_TYPE contDstOp itDst; \
M_GET_IT_SET contDstOp (itDst, position); \
for (M_GET_IT_FIRST contSrcOp (itSrc, contSrc) ; \
!M_GET_IT_END_P contSrcOp (itSrc) ; \
M_GET_IT_NEXT contSrcOp (itSrc) ) { \
M_GET_IT_INSERT contDstOp (contDst, itDst, \
*M_GET_IT_CREF contSrcOp (itSrc)); \
M_GET_IT_NEXT contDstOp (itDst); \
} \
} while (0)
/********************************** INTERNAL ************************************/
#define ALGOI_DEF(name, cont_oplist) \
@@ -668,7 +685,7 @@
} \
} \
while (!M_GET_IT_END_P cont_oplist (itSrc)) { \
type *objSrc = M_GET_REF cont_oplist (itSrc); \
type_t *objSrc = M_GET_IT_REF cont_oplist (itSrc); \
M_GET_PUSH cont_oplist (dst, *objSrc); \
M_GET_IT_NEXT cont_oplist (itSrc); \
} \
+20
View File
@@ -386,11 +386,31 @@ static void test_extract(void)
list_int_clear(l);
}
ARRAY_DEF(aint, int)
LIST_DEF(lint, int)
#define M_OPL_aint_t() ARRAY_OPLIST(aint)
#define M_OPL_lint_t() LIST_OPLIST(lint)
static void test_insert(void)
{
ALGO_LET_INIT_VA(a, lint_t, 1, 2, 3, 4)
ALGO_LET_INIT_VA(b, aint_t, -1, -2, -3) {
lint_it_t i;
lint_it(i, a);
ALGO_INSERT_AT(a, lint_t, i, b, aint_t);
// TBC: order ok for the list (the reverse is confusing...)?
ALGO_LET_INIT_VA(c, lint_t, 1, 2, 3, -3, -2, -1, 4) {
assert (lint_equal_p (c, a));
}
}
}
int main(void)
{
test_list();
test_array();
test_string();
test_extract();
test_insert();
exit(0);
}