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

View File

@ -138,69 +138,71 @@ END_TEST
typedef struct _Eina_Test_Inlist_Sorted Eina_Test_Inlist_Sorted; typedef struct _Eina_Test_Inlist_Sorted Eina_Test_Inlist_Sorted;
struct _Eina_Test_Inlist_Sorted struct _Eina_Test_Inlist_Sorted
{ {
EINA_INLIST; EINA_INLIST;
int value; int value;
}; };
static int static int
_eina_test_inlist_cmp(const void *d1, const void *d2) _eina_test_inlist_cmp(const void *d1, const void *d2)
{ {
const Eina_Test_Inlist_Sorted *t1 = d1; const Eina_Test_Inlist_Sorted *t1 = d1;
const Eina_Test_Inlist_Sorted *t2 = d2; const Eina_Test_Inlist_Sorted *t2 = d2;
return t1->value - t2->value; return t1->value - t2->value;
} }
static void static void
_eina_test_inlist_check(const Eina_Inlist *list) _eina_test_inlist_check(const Eina_Inlist *list)
{ {
const Eina_Test_Inlist_Sorted *t; const Eina_Test_Inlist_Sorted *t;
int last_value = 0; int last_value = 0;
EINA_INLIST_FOREACH(list, t) EINA_INLIST_FOREACH(list, t)
{ {
fail_if(t->value < last_value); fail_if(t->value < last_value);
last_value = t->value; last_value = t->value;
} }
} }
START_TEST(eina_inlist_sorted) START_TEST(eina_inlist_sorted)
{ {
Eina_Inlist *list = NULL; Eina_Test_Inlist_Sorted *tmp;
Eina_Inlist *sorted = NULL; Eina_Inlist *list = NULL;
int i; Eina_Inlist *sorted = NULL;
int i;
srand(time(NULL)); 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 ;
tmp = malloc(sizeof (Eina_Test_Inlist_Sorted)); tmp->value = rand();
if (!tmp) continue ;
tmp->value = rand(); list = eina_inlist_prepend(list, EINA_INLIST_GET(tmp));
}
list = eina_inlist_prepend(list, EINA_INLIST_GET(tmp)); list = eina_inlist_sort(list, _eina_test_inlist_cmp);
}
list = eina_inlist_sort(list, _eina_test_inlist_cmp); _eina_test_inlist_check(list);
_eina_test_inlist_check(list); EINA_INLIST_FOREACH(list, tmp)
tmp->value = rand();
i = 0; i = 0;
while (list) while (list)
{ {
Eina_Inlist *tmp = list; Eina_Inlist *p = list;
list = eina_inlist_remove(list, 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); _eina_test_inlist_check(sorted);
} }
_eina_test_inlist_check(sorted); _eina_test_inlist_check(sorted);
} }
END_TEST END_TEST