* eina_list: Add eina_list_search_sorted_list and eina_list_search_unsorted_list.

SVN revision: 39546
This commit is contained in:
Cedric BAIL 2009-03-18 13:29:36 +00:00
parent 2849d938ff
commit 9fab9595b5
2 changed files with 27 additions and 10 deletions

View File

@ -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_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_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_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_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_next (const Eina_List *list) EINA_PURE EINA_WARN_UNUSED_RESULT;

View File

@ -1590,9 +1590,10 @@ eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func)
return ret; return ret;
} }
EAPI void * EAPI Eina_List *
eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void *data) eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data)
{ {
const Eina_List *ct;
void *d; void *d;
unsigned int inf, sup, cur, tmp; unsigned int inf, sup, cur, tmp;
int part; int part;
@ -1600,7 +1601,8 @@ eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void
inf = 0; inf = 0;
sup = eina_list_count(list) ; sup = eina_list_count(list) ;
cur = sup >> 1; 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))) 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. */ /* Faster to move directly from where we are to the new position than using eina_list_nth_list. */
tmp = (sup + inf) >> 1; tmp = (sup + inf) >> 1;
if (tmp < cur) if (tmp < cur)
for (; cur != tmp; cur--, d = eina_list_prev(d)) for (; cur != tmp; cur--, ct = eina_list_prev(ct))
; ;
else 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 * 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; const Eina_List *l;
void *d; 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) EINA_LIST_FOREACH(list, l, d)
{ {
if (!func(d, data)) if (!func(d, data))
return d; return (Eina_List*) l;
} }
return NULL; 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. * @brief Returned a new iterator asociated to a list.