Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenlib / intern / listbase.c
index 6cb7b7d8e3ef5a9e8e91da439ce1ddd2a30b3b72..abc4a77332823596b741b4c24901c6d953d447f7 100644 (file)
@@ -169,6 +169,34 @@ void BLI_listbase_swaplinks(ListBase *listbase, void *vlinka, void *vlinkb)
        else if (listbase->first == linkb) listbase->first = linka;
 }
 
+/**
+ * Swaps \a vlinka and \a vlinkb from their respective lists. Assumes they are both already in their lista!
+ */
+void BLI_listbases_swaplinks(ListBase *listbasea, ListBase *listbaseb, void *vlinka, void *vlinkb)
+{
+       Link *linka = vlinka;
+       Link *linkb = vlinkb;
+       Link linkc = {NULL};
+
+       if (!linka || !linkb) {
+               return;
+       }
+
+       /* Temporary link to use as placeholder of the links positions */
+       BLI_insertlinkafter(listbasea, linka, &linkc);
+
+       /* Bring linka into linkb position */
+       BLI_remlink(listbasea, linka);
+       BLI_insertlinkafter(listbaseb, linkb, linka);
+
+       /* Bring linkb into linka position */
+       BLI_remlink(listbaseb, linkb);
+       BLI_insertlinkafter(listbasea, &linkc, linkb);
+
+       /* Remove temporary link */
+       BLI_remlink(listbasea, &linkc);
+}
+
 /**
  * Removes the head from \a listbase and returns it.
  */