eina: fix eina_inlist_sorted_insert and improve its tests.

SVN revision: 59669
This commit is contained in:
Cedric BAIL 2011-05-25 13:18:21 +00:00
parent 701601b4bc
commit 5b62f47079
2 changed files with 45 additions and 41 deletions

View File

@ -454,7 +454,7 @@ eina_inlist_sorted_insert(Eina_Inlist *list,
* prepare a jump table to avoid doing unecessary rewalk
* of the inlist as much as possible.
*/
for (ct = list->next; ct; ct = ct->next, jump_count++, count++)
for (ct = list; ct; ct = ct->next, jump_count++, count++)
{
if (jump_count == jump_div)
{
@ -485,6 +485,7 @@ eina_inlist_sorted_insert(Eina_Inlist *list,
sup = jump_limit - 1;
cur = 0;
ct = jump_table[cur];
cmp = func(ct, item);
while (inf <= sup)
{
@ -509,22 +510,23 @@ eina_inlist_sorted_insert(Eina_Inlist *list,
/* If at the beginning of the table and cmp < 0,
* insert just after the head */
if (cur == 0 && cmp < 0)
return eina_inlist_append_relative(list, item, list->next);
if (cur == 0 && cmp > 0)
return eina_inlist_prepend_relative(list, item, ct);
/* If at the end of the table and cmp >= 0,
* just append the item to the list */
if (cmp >= 0 && ct == list->last)
if (cmp < 0 && ct == list->last)
return eina_inlist_append(list, item);
/*
* Now do a dychotomic search between two entries inside the jump_table
*/
cur *= jump_div;
inf = cur;
sup = inf + jump_div;
inf = cur - jump_div;
sup = cur + jump_div;
if (sup > count - 1) sup = count - 1;
if (inf < 0) inf = 0;
while (inf <= sup)
{

View File

@ -167,16 +167,15 @@ _eina_test_inlist_check(const Eina_Inlist *list)
START_TEST(eina_inlist_sorted)
{
Eina_Test_Inlist_Sorted *tmp;
Eina_Inlist *list = NULL;
Eina_Inlist *sorted = NULL;
int i;
srand(time(NULL));
for (i = 0; i < 5000; ++i)
for (i = 0; i < 1000; ++i)
{
Eina_Test_Inlist_Sorted *tmp;
tmp = malloc(sizeof (Eina_Test_Inlist_Sorted));
if (!tmp) continue ;
@ -189,14 +188,17 @@ START_TEST(eina_inlist_sorted)
_eina_test_inlist_check(list);
EINA_INLIST_FOREACH(list, tmp)
tmp->value = rand();
i = 0;
while (list)
{
Eina_Inlist *tmp = list;
Eina_Inlist *p = list;
list = eina_inlist_remove(list, list);
sorted = eina_inlist_sorted_insert(sorted, tmp, _eina_test_inlist_cmp);
sorted = eina_inlist_sorted_insert(sorted, p, _eina_test_inlist_cmp);
_eina_test_inlist_check(sorted);
}