forked from enlightenment/efl
eina: fix eina_inlist_sorted_insert and improve its tests.
SVN revision: 59669
This commit is contained in:
parent
701601b4bc
commit
5b62f47079
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue