ListBase: add BLI_sortlist_r api function, remove check for NULL callback

This commit is contained in:
Campbell Barton
2014-02-13 13:08:05 +11:00
parent fdcdd5e52e
commit f27acb5b56
2 changed files with 23 additions and 2 deletions

View File

@@ -67,6 +67,7 @@ void BLI_addhead(struct ListBase *listbase, void *vlink);
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink);
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink);
void BLI_sortlist(struct ListBase *listbase, int (*cmp)(void *, void *));
void BLI_sortlist_r(ListBase *listbase, void *thunk, int (*cmp)(void *, void *, void *));
void BLI_freelist(struct ListBase *listbase);
int BLI_countlist(const struct ListBase *listbase);
void BLI_freelinkN(struct ListBase *listbase, void *vlink);

View File

@@ -178,8 +178,6 @@ void BLI_sortlist(ListBase *listbase, int (*cmp)(void *, void *))
Link *current = NULL;
Link *previous = NULL;
Link *next = NULL;
if (cmp == NULL) return;
if (listbase->first != listbase->last) {
for (previous = listbase->first, current = previous->next; current; current = next) {
@@ -197,6 +195,28 @@ void BLI_sortlist(ListBase *listbase, int (*cmp)(void *, void *))
}
}
void BLI_sortlist_r(ListBase *listbase, void *thunk, int (*cmp)(void *, void *, void *))
{
Link *current = NULL;
Link *previous = NULL;
Link *next = NULL;
if (listbase->first != listbase->last) {
for (previous = listbase->first, current = previous->next; current; current = next) {
next = current->next;
previous = current->prev;
BLI_remlink(listbase, current);
while (previous && cmp(thunk, previous, current) == 1) {
previous = previous->prev;
}
BLI_insertlinkafter(listbase, previous, current);
}
}
}
/**
* Inserts \a vnewlink immediately following \a vprevlink in \a listbase.
* Or, if \a vprevlink is NULL, puts \a vnewlink at the front of the list.