Faster sort initialisation.

SVN revision: 36359
This commit is contained in:
Cedric BAIL 2008-09-30 14:16:18 +00:00
parent 3315d29c7f
commit 9ffada517d
2 changed files with 21 additions and 11 deletions

View File

@ -1200,7 +1200,7 @@ eina_list_sort(Eina_List *list, unsigned int size, Eina_Compare_Cb func)
unsigned int i = 0;
unsigned int n = 0;
Eina_List *tail = list;
Eina_List *unsort = list;
Eina_List *unsort = NULL;
Eina_List *stack[EINA_LIST_SORT_STACK_SIZE];
if (!list || !func) return NULL;
@ -1212,19 +1212,17 @@ eina_list_sort(Eina_List *list, unsigned int size, Eina_Compare_Cb func)
(size > list->accounting->count))
size = list->accounting->count;
for (; size; size--)
if (size != list->accounting->count)
{
unsort = unsort->next;
unsort = eina_list_nth_list(list, size);
if (unsort)
unsort->prev->next = NULL;
}
if (unsort)
unsort->prev->next = NULL;
while (tail)
{
unsigned int idx, tmp;
Eina_List *a = tail;
Eina_List *b = tail->next;
@ -1235,7 +1233,7 @@ eina_list_sort(Eina_List *list, unsigned int size, Eina_Compare_Cb func)
}
tail = b->next;
if (func(a->data, b->data) < 0)
((stack[i++] = a)->next = b)->next = 0;
else
@ -1248,10 +1246,10 @@ eina_list_sort(Eina_List *list, unsigned int size, Eina_Compare_Cb func)
while (i-- > 1)
stack[i-1] = eina_list_sort_merge(stack[i-1], stack[i], func);
list = stack[0];
eina_list_sort_rebuild_prev(list);
for (tail = list; tail->next; tail = tail->next)
;

View File

@ -119,6 +119,8 @@ START_TEST(eina_test_simple)
list = eina_list_sort(list, 2, eina_int_cmp);
list = eina_list_sort(list, 2, eina_int_cmp);
test1 = eina_list_nth(list, 0);
test2 = eina_list_nth(list, 1);
test3 = eina_list_nth(list, 2);
@ -127,6 +129,16 @@ START_TEST(eina_test_simple)
fail_if(*test1 > *test2);
fail_if(*test3 == *test2);
list = eina_list_sort(list, 5, eina_int_cmp);
test1 = eina_list_nth(list, 3);
test2 = eina_list_nth(list, 4);
test3 = eina_list_nth(list, 5);
fail_if(test1 == NULL || test2 == NULL || test3 == NULL);
fail_if(*test1 > *test2);
fail_if(*test3 > *test2);
list = eina_list_append(list, &data[8]);
fail_if(list == NULL);