Fix _sort_union bug
This commit is contained in:
1 parent
784c42d850
commit
d5dc5d083d
1 file changed
+18
-4
@@ -181,6 +181,7 @@
|
|||||||
typedef void (*M_C(name, _transform_cb_t))(type_t *, type_t const); \
|
typedef void (*M_C(name, _transform_cb_t))(type_t *, type_t const); \
|
||||||
typedef void (*M_C(name, _apply_cb_t))(type_t); \
|
typedef void (*M_C(name, _apply_cb_t))(type_t); \
|
||||||
|
|
||||||
|
|
||||||
/* Define the function objects associated to the algorithms */
|
/* Define the function objects associated to the algorithms */
|
||||||
#define ALGOI_FUNCOBJ_P5(name, container_t, cont_oplist, type_t, type_oplist, it_t) \
|
#define ALGOI_FUNCOBJ_P5(name, container_t, cont_oplist, type_t, type_oplist, it_t) \
|
||||||
\
|
\
|
||||||
@@ -190,6 +191,7 @@
|
|||||||
FUNC_OBJ_ITF_DEF(M_C(name, _transform_obj), void, type_t *, type_t const ) \
|
FUNC_OBJ_ITF_DEF(M_C(name, _transform_obj), void, type_t *, type_t const ) \
|
||||||
FUNC_OBJ_ITF_DEF(M_C(name, _apply_obj), void, type_t * ) \
|
FUNC_OBJ_ITF_DEF(M_C(name, _apply_obj), void, type_t * ) \
|
||||||
|
|
||||||
|
|
||||||
/* Define the sort functions with the CMP operator using the order selected */
|
/* Define the sort functions with the CMP operator using the order selected */
|
||||||
#define ALGOI_SORT_DEF_P5(name, container_t, cont_oplist, type_t, type_oplist, it_t, order, sort_name) \
|
#define ALGOI_SORT_DEF_P5(name, container_t, cont_oplist, type_t, type_oplist, it_t, order, sort_name) \
|
||||||
\
|
\
|
||||||
@@ -205,6 +207,7 @@
|
|||||||
#define ALGOI_SORT_CALL_CMP_P4(name, sort_name, ref1, ref2) \
|
#define ALGOI_SORT_CALL_CMP_P4(name, sort_name, ref1, ref2) \
|
||||||
M_C3(name, sort_name,_cmp)(ref1, ref2)
|
M_C3(name, sort_name,_cmp)(ref1, ref2)
|
||||||
|
|
||||||
|
|
||||||
// Call the created function object
|
// Call the created function object
|
||||||
#define ALGOI_SORT_CALL_OBJ_P4(name, sort_name, ref1, ref2) \
|
#define ALGOI_SORT_CALL_OBJ_P4(name, sort_name, ref1, ref2) \
|
||||||
M_C(name, _cmp_obj_call)(funcobj, *ref1, *ref2)
|
M_C(name, _cmp_obj_call)(funcobj, *ref1, *ref2)
|
||||||
@@ -212,6 +215,7 @@
|
|||||||
#define ALGOI_SORT_PARAM_OBJ_P4(name) M_DEFERRED_COMMA M_C(name, _cmp_obj_t) funcobj
|
#define ALGOI_SORT_PARAM_OBJ_P4(name) M_DEFERRED_COMMA M_C(name, _cmp_obj_t) funcobj
|
||||||
#define ALGOI_SORT_ARG_OBJ_P4 M_DEFERRED_COMMA funcobj
|
#define ALGOI_SORT_ARG_OBJ_P4 M_DEFERRED_COMMA funcobj
|
||||||
|
|
||||||
|
|
||||||
/* Define the sort funtions using either the CMP operator or a function object
|
/* Define the sort funtions using either the CMP operator or a function object
|
||||||
- name: prefix of algorithms
|
- name: prefix of algorithms
|
||||||
- container_t: type of the container
|
- container_t: type of the container
|
||||||
@@ -233,6 +237,7 @@
|
|||||||
{ \
|
{ \
|
||||||
it_t it1; \
|
it_t it1; \
|
||||||
it_t it2; \
|
it_t it2; \
|
||||||
|
/* Linear comparaison of TAB[N] & TAB[N+1] to test if the order is correct */ \
|
||||||
M_CALL_IT_FIRST(cont_oplist, it1, l); \
|
M_CALL_IT_FIRST(cont_oplist, it1, l); \
|
||||||
M_CALL_IT_SET(cont_oplist, it2, it1); \
|
M_CALL_IT_SET(cont_oplist, it2, it1); \
|
||||||
M_CALL_IT_NEXT(cont_oplist, it2); \
|
M_CALL_IT_NEXT(cont_oplist, it2); \
|
||||||
@@ -440,30 +445,40 @@
|
|||||||
{ \
|
{ \
|
||||||
it_t itSrc; \
|
it_t itSrc; \
|
||||||
it_t itDst; \
|
it_t itDst; \
|
||||||
|
it_t itIns; \
|
||||||
assert(M_C3(name,sort_name,_p)(dst cmp_arg)); \
|
assert(M_C3(name,sort_name,_p)(dst cmp_arg)); \
|
||||||
assert(M_C3(name,sort_name,_p)(src cmp_arg)); \
|
assert(M_C3(name,sort_name,_p)(src cmp_arg)); \
|
||||||
|
/* Iterate over both dst & src containers */ \
|
||||||
M_CALL_IT_FIRST(cont_oplist, itSrc, src); \
|
M_CALL_IT_FIRST(cont_oplist, itSrc, src); \
|
||||||
M_CALL_IT_FIRST(cont_oplist, itDst, dst); \
|
M_CALL_IT_FIRST(cont_oplist, itDst, dst); \
|
||||||
|
M_CALL_IT_END(cont_oplist, itIns, dst); \
|
||||||
while (!M_CALL_IT_END_P(cont_oplist, itSrc) \
|
while (!M_CALL_IT_END_P(cont_oplist, itSrc) \
|
||||||
&& !M_CALL_IT_END_P(cont_oplist, itDst)) { \
|
&& !M_CALL_IT_END_P(cont_oplist, itDst)) { \
|
||||||
type_t const *objSrc = M_CALL_IT_CREF(cont_oplist, itSrc); \
|
type_t const *objSrc = M_CALL_IT_CREF(cont_oplist, itSrc); \
|
||||||
type_t const *objDst = M_CALL_IT_CREF(cont_oplist, itDst); \
|
type_t const *objDst = M_CALL_IT_CREF(cont_oplist, itDst); \
|
||||||
|
/* Compare the current element of src and dst */ \
|
||||||
int cmp = cmp_func(name, sort_name, objDst, objSrc); \
|
int cmp = cmp_func(name, sort_name, objDst, objSrc); \
|
||||||
if (cmp == 0) { \
|
if (cmp == 0) { \
|
||||||
|
/* Skip same arguments in both lists */ \
|
||||||
|
M_CALL_IT_SET(cont_oplist, itIns, itDst); \
|
||||||
M_CALL_IT_NEXT(cont_oplist, itSrc); \
|
M_CALL_IT_NEXT(cont_oplist, itSrc); \
|
||||||
M_CALL_IT_NEXT(cont_oplist, itDst); \
|
M_CALL_IT_NEXT(cont_oplist, itDst); \
|
||||||
} else if (cmp < 0) { \
|
} else if (cmp < 0) { \
|
||||||
|
/* The element of dst is before. Go to next element of dst */ \
|
||||||
|
M_CALL_IT_SET(cont_oplist, itIns, itDst); \
|
||||||
M_CALL_IT_NEXT(cont_oplist, itDst); \
|
M_CALL_IT_NEXT(cont_oplist, itDst); \
|
||||||
} else { \
|
} else { \
|
||||||
|
/* The element of src is before. */ \
|
||||||
/* insert objSrc before */ \
|
/* insert objSrc before */ \
|
||||||
/* current implementations insert after... */ \
|
/* NOTE: IT_INSERT insert after ==> Need of another iterator */ \
|
||||||
M_CALL_IT_INSERT(cont_oplist, dst, itDst, *objSrc); \
|
M_CALL_IT_INSERT(cont_oplist, dst, itIns, *objSrc); \
|
||||||
M_CALL_IT_NEXT(cont_oplist, itSrc); \
|
M_CALL_IT_NEXT(cont_oplist, itSrc); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
while (!M_CALL_IT_END_P(cont_oplist, itSrc)) { \
|
while (!M_CALL_IT_END_P(cont_oplist, itSrc)) { \
|
||||||
|
/* Finish inserting the element of src in dst */ \
|
||||||
type_t *objSrc = M_CALL_IT_REF(cont_oplist, itSrc); \
|
type_t *objSrc = M_CALL_IT_REF(cont_oplist, itSrc); \
|
||||||
M_CALL_PUSH(cont_oplist, dst, *objSrc); \
|
M_CALL_IT_INSERT(cont_oplist, dst, itIns, *objSrc); \
|
||||||
M_CALL_IT_NEXT(cont_oplist, itSrc); \
|
M_CALL_IT_NEXT(cont_oplist, itSrc); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@@ -1216,7 +1231,6 @@
|
|||||||
M_CALL_IT_NEXT(contSrcOp, _itSrc) ) { \
|
M_CALL_IT_NEXT(contSrcOp, _itSrc) ) { \
|
||||||
M_CALL_IT_INSERT(contDstOp, contDst, _itDst, \
|
M_CALL_IT_INSERT(contDstOp, contDst, _itDst, \
|
||||||
*M_CALL_IT_CREF(contSrcOp, _itSrc)); \
|
*M_CALL_IT_CREF(contSrcOp, _itSrc)); \
|
||||||
M_CALL_IT_NEXT(contDstOp, _itDst); \
|
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user