Add specialisation of _find_last if the container has the IT_PREVIOUS & IT_LAST operators.

This commit is contained in:
Patrick Pelissier committed 2017-05-11 00:18:26 +02:00
1 parent f56657c972
commit 856fd4fd78
1 file changed
+16 -2
+16 -2
View File
@@ -39,7 +39,7 @@
M_GET_SUBTYPE cont_oplist, M_GET_OPLIST cont_oplist, M_GET_IT_TYPE cont_oplist) M_GET_SUBTYPE cont_oplist, M_GET_OPLIST cont_oplist, M_GET_IT_TYPE cont_oplist)
/* MAP a function into all elements of a container. /* Map a function or a macro to all elements of a container.
USAGE: ALGO_MAP(container, containerOplist, func[, extra arguments of function]) */ USAGE: ALGO_MAP(container, containerOplist, func[, extra arguments of function]) */
#define ALGO_MAP(container, cont_oplist, ...) \ #define ALGO_MAP(container, cont_oplist, ...) \
M_IF_NARGS_EQ1(__VA_ARGS__) \ M_IF_NARGS_EQ1(__VA_ARGS__) \
@@ -95,11 +95,24 @@
return !M_GET_IT_END_P cont_oplist (it); \ return !M_GET_IT_END_P cont_oplist (it); \
} \ } \
\ \
M_IF(M_AND(M_TEST_METHOD_P(PREVIOUS, cont_oplist), M_TEST_METHOD_P(IT_LAST, cont_oplist))) \
( \
static inline void M_C(name, _find_last) (it_t it, container_t l, const type_t data) \
{ \
M_GET_IT_END cont_oplist (it, l); \
it_t it2; \
for (M_GET_IT_LAST cont_oplist (it2, l); \
!M_GET_IT_END_P cont_oplist (it2) ; \
M_GET_IT_PREVIOUS cont_oplist (it2)) { \
if (M_GET_EQUAL type_oplist (*M_GET_IT_CREF cont_oplist (it2), data)) \
return; \
} \
} \
, \
static inline void M_C(name, _find_last) (it_t it, container_t l, const type_t data) \ static inline void M_C(name, _find_last) (it_t it, container_t l, const type_t data) \
{ \ { \
M_GET_IT_END cont_oplist (it, l); \ M_GET_IT_END cont_oplist (it, l); \
it_t it2; \ it_t it2; \
/* TODO: If PREVIOUS & LAST, we can go backward (faster) */ \
for (M_GET_IT_FIRST cont_oplist (it2, l); \ for (M_GET_IT_FIRST cont_oplist (it2, l); \
!M_GET_IT_END_P cont_oplist (it2) ; \ !M_GET_IT_END_P cont_oplist (it2) ; \
M_GET_IT_NEXT cont_oplist (it2)) { \ M_GET_IT_NEXT cont_oplist (it2)) { \
@@ -107,6 +120,7 @@
M_GET_IT_SET cont_oplist (it, it2) ; \ M_GET_IT_SET cont_oplist (it, it2) ; \
} \ } \
} \ } \
) \
\ \
static inline size_t M_C(name, _count) (container_t l, const type_t data) \ static inline size_t M_C(name, _count) (container_t l, const type_t data) \
{ \ { \