Add items in sorted order instead of adding then sorting.

This commit is contained in:
Steveice10 2016-12-19 19:58:02 -08:00
parent 48c997d793
commit ea4ea253a7
4 changed files with 23 additions and 10 deletions

View File

@ -141,6 +141,24 @@ bool linked_list_add_at(linked_list* list, unsigned int index, void* value) {
return true;
}
void linked_list_add_sorted(linked_list* list, void* value, void* userData, int (*compare)(void* userData, const void* p1, const void* p2)) {
if(compare != NULL) {
unsigned int i = 0;
linked_list_node* node = list->first;
while(node != NULL) {
if(compare(userData, value, node->value) < 0) {
linked_list_add_at(list, i, value);
return;
}
i++;
node = node->next;
}
}
linked_list_add(list, value);
}
static void linked_list_remove_node(linked_list* list, linked_list_node* node) {
if(node->prev != NULL) {
node->prev->next = node->next;

View File

@ -30,6 +30,7 @@ int linked_list_index_of(linked_list* list, void* value);
void* linked_list_get(linked_list* list, unsigned int index);
bool linked_list_add(linked_list* list, void* value);
bool linked_list_add_at(linked_list* list, unsigned int index, void* value);
void linked_list_add_sorted(linked_list* list, void* value, void* userData, int (*compare)(void* userData, const void* p1, const void* p2));
bool linked_list_remove(linked_list* list, void* value);
bool linked_list_remove_at(linked_list* list, unsigned int index);
void linked_list_sort(linked_list* list, void* userData, int (*compare)(void* userData, const void* p1, const void* p2));

View File

@ -81,11 +81,7 @@ static Result task_populate_ext_save_data_from(populate_ext_save_data_data* data
item->data = extSaveDataInfo;
linked_list_add(data->items, item);
if(data->compare != NULL) {
linked_list_sort(data->items, data->userData, data->compare);
}
linked_list_add_sorted(data->items, item, data->userData, data->compare);
} else {
free(item);

View File

@ -75,7 +75,7 @@ static Result task_populate_titles_add_ctr(populate_titles_data* data, FS_MediaT
item->data = titleInfo;
linked_list_add(data->items, item);
linked_list_add_sorted(data->items, item, data->userData, data->compare);
} else {
free(item);
@ -206,7 +206,7 @@ static Result task_populate_titles_add_twl(populate_titles_data* data, FS_MediaT
item->color = COLOR_DS_TITLE;
item->data = titleInfo;
linked_list_add(data->items, item);
linked_list_add_sorted(data->items, item, data->userData, data->compare);
} else {
free(item);
@ -256,9 +256,7 @@ static Result task_populate_titles_from(populate_titles_data* data, FS_MediaType
continue;
}
if(R_SUCCEEDED(res = dsiWare ? task_populate_titles_add_twl(data, mediaType, titleIds[i]) : task_populate_titles_add_ctr(data, mediaType, titleIds[i])) && data->compare != NULL) {
linked_list_sort(data->items, data->userData, data->compare);
}
res = dsiWare ? task_populate_titles_add_twl(data, mediaType, titleIds[i]) : task_populate_titles_add_ctr(data, mediaType, titleIds[i]);
}
}
}