From 9fab9595b547e8dbc2445ad4fa2654f30e0217d1 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 18 Mar 2009 13:29:36 +0000 Subject: [PATCH] * eina_list: Add eina_list_search_sorted_list and eina_list_search_unsorted_list. SVN revision: 39546 --- legacy/eina/src/include/eina_list.h | 6 ++++-- legacy/eina/src/lib/eina_list.c | 31 +++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/legacy/eina/src/include/eina_list.h b/legacy/eina/src/include/eina_list.h index 9e2cf47cf9..c8e4242516 100644 --- a/legacy/eina/src/include/eina_list.h +++ b/legacy/eina/src/include/eina_list.h @@ -99,9 +99,11 @@ EAPI Eina_List *eina_list_clone(const Eina_List *list) EINA_WARN_UNUSED_RESULT; EAPI Eina_List *eina_list_sort (Eina_List *list, unsigned int size, Eina_Compare_Cb func) EINA_ARG_NONNULL(3) EINA_WARN_UNUSED_RESULT; EAPI Eina_List *eina_list_merge (Eina_List *left, Eina_List *right) EINA_WARN_UNUSED_RESULT; EAPI Eina_List *eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func) EINA_ARG_NONNULL(3) EINA_WARN_UNUSED_RESULT; -EAPI void *eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void *data); -EAPI void *eina_list_search_unsorted(const Eina_List *list, Eina_Compare_Cb func, const void *data); +EAPI Eina_List *eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data); +EAPI void *eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void *data); +EAPI Eina_List *eina_list_search_unsorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data); +EAPI void *eina_list_search_unsorted(const Eina_List *list, Eina_Compare_Cb func, const void *data); static inline Eina_List *eina_list_last (const Eina_List *list) EINA_PURE EINA_WARN_UNUSED_RESULT; static inline Eina_List *eina_list_next (const Eina_List *list) EINA_PURE EINA_WARN_UNUSED_RESULT; diff --git a/legacy/eina/src/lib/eina_list.c b/legacy/eina/src/lib/eina_list.c index d3122e29a9..c274609978 100644 --- a/legacy/eina/src/lib/eina_list.c +++ b/legacy/eina/src/lib/eina_list.c @@ -1590,9 +1590,10 @@ eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func) return ret; } -EAPI void * -eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void *data) +EAPI Eina_List * +eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data) { + const Eina_List *ct; void *d; unsigned int inf, sup, cur, tmp; int part; @@ -1600,7 +1601,8 @@ eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void inf = 0; sup = eina_list_count(list) ; cur = sup >> 1; - d = eina_list_nth(list, cur); + ct = eina_list_nth_list(list, cur); + d = eina_list_data_get(ct); while ((part = func(d, data))) { @@ -1613,18 +1615,25 @@ eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void /* Faster to move directly from where we are to the new position than using eina_list_nth_list. */ tmp = (sup + inf) >> 1; if (tmp < cur) - for (; cur != tmp; cur--, d = eina_list_prev(d)) + for (; cur != tmp; cur--, ct = eina_list_prev(ct)) ; else - for (; cur != tmp; cur++, d = eina_list_next(d)) + for (; cur != tmp; cur++, ct = eina_list_next(ct)) ; + d = eina_list_data_get(ct); } - return d; + return (Eina_List*) ct; } EAPI void * -eina_list_search_unsorted(const Eina_List *list, Eina_Compare_Cb func, const void *data) +eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void *data) +{ + return eina_list_data_get(eina_list_search_sorted_list(list, func, data)); +} + +EAPI Eina_List * +eina_list_search_unsorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data) { const Eina_List *l; void *d; @@ -1632,11 +1641,17 @@ eina_list_search_unsorted(const Eina_List *list, Eina_Compare_Cb func, const voi EINA_LIST_FOREACH(list, l, d) { if (!func(d, data)) - return d; + return (Eina_List*) l; } return NULL; } +EAPI void * +eina_list_search_unsorted(const Eina_List *list, Eina_Compare_Cb func, const void *data) +{ + return eina_list_data_get(eina_list_search_unsorted_list(list, func, data)); +} + /** * @brief Returned a new iterator asociated to a list.