From a1fe978bb806693d814d2b79038dda7eecabb260 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 18 Mar 2009 15:00:52 +0000 Subject: [PATCH] * eina_list: Add a eina_list_search_sorted_near_list. Usefull if you want to build a sorted list. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@39550 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/include/eina_list.h | 1 + src/lib/eina_list.c | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/include/eina_list.h b/src/include/eina_list.h index c8e4242..a1006b0 100644 --- a/src/include/eina_list.h +++ b/src/include/eina_list.h @@ -100,6 +100,7 @@ EAPI Eina_List *eina_list_sort (Eina_List *list, unsigned int size, Eina_Compare 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_near_list(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); diff --git a/src/lib/eina_list.c b/src/lib/eina_list.c index c274609..696cfde 100644 --- a/src/lib/eina_list.c +++ b/src/lib/eina_list.c @@ -1591,7 +1591,7 @@ eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func) } EAPI Eina_List * -eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data) +eina_list_search_sorted_near_list(const Eina_List *list, Eina_Compare_Cb func, const void *data) { const Eina_List *ct; void *d; @@ -1606,8 +1606,10 @@ eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const while ((part = func(d, data))) { - if (inf == sup) - return NULL; + if (inf == sup + || (part < 0 && inf == cur) + || (part > 0 && sup == cur)) + return (Eina_List*) ct; if (part < 0) inf = (sup + inf) >> 1; else @@ -1626,6 +1628,20 @@ eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const return (Eina_List*) ct; } +EAPI Eina_List * +eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data) +{ + Eina_List *near; + void *d; + + near = eina_list_search_sorted_near_list(list, func, data); + if (!near) return NULL; + d = eina_list_data_get(near); + if (!func(d, data)) + return near; + return NULL; +} + EAPI void * eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void *data) { -- 2.7.4