ListBase: add BLI_sortlist_r api function, remove check for NULL callback
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user