ListBase: add BLI_sortlist_r api function, remove check for NULL callback
authorCampbell Barton <ideasman42@gmail.com>
Thu, 13 Feb 2014 02:08:05 +0000 (13:08 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 13 Feb 2014 02:21:16 +0000 (13:21 +1100)
source/blender/blenlib/BLI_listbase.h
source/blender/blenlib/intern/listbase.c

index a54fa15ef4ca5be9d4e55de1dd54288b7746e18b..6d96d4dfed646cccc356ccd36f1e3ee36524d8b4 100644 (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);
index 2c59b940f8cb7cb420deb8285d48b30f85539d95..17e7bf8a99b1b82c435ddf3c72bba8cdb6c8a220 100644 (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.