From e027bb8a6ecff2c16272e64f0cceb3417327f2b6 Mon Sep 17 00:00:00 2001 From: Cedric BAIL 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. SVN revision: 39550 --- legacy/eina/src/include/eina_list.h | 1 + legacy/eina/src/lib/eina_list.c | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/legacy/eina/src/include/eina_list.h b/legacy/eina/src/include/eina_list.h index c8e4242516..a1006b0fa1 100644 --- a/legacy/eina/src/include/eina_list.h +++ b/legacy/eina/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/legacy/eina/src/lib/eina_list.c b/legacy/eina/src/lib/eina_list.c index c274609978..696cfdeef0 100644 --- a/legacy/eina/src/lib/eina_list.c +++ b/legacy/eina/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) {