From 3d8bef138886c520bf791ac3710a2469ee27f613 Mon Sep 17 00:00:00 2001 From: cedric 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. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@39546 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/include/eina_list.h | 4 +++- src/lib/eina_list.c | 31 +++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/include/eina_list.h b/src/include/eina_list.h index 9e2cf47..c8e4242 100644 --- a/src/include/eina_list.h +++ b/src/include/eina_list.h @@ -99,10 +99,12 @@ 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 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; static inline Eina_List *eina_list_prev (const Eina_List *list) EINA_PURE EINA_WARN_UNUSED_RESULT; diff --git a/src/lib/eina_list.c b/src/lib/eina_list.c index d3122e2..c274609 100644 --- a/src/lib/eina_list.c +++ b/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. -- 2.7.4