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
|
* 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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue