ListBase: Add insert-replace function
[blender.git] / source / blender / blenlib / intern / listbase.c
index c9bf4976ae86edf4f01fd4a529e046e476bb3686..6cb7b7d8e3ef5a9e8e91da439ce1ddd2a30b3b72 100644 (file)
@@ -342,6 +342,40 @@ void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink)
        }
 }
 
+
+/**
+ * Insert a link in place of another, without changing it's position in the list.
+ *
+ * Puts `vnewlink` in the position of `vreplacelink`, removing `vreplacelink`.
+ * - `vreplacelink` *must* be in the list.
+ * - `vnewlink` *must not* be in the list.
+ */
+void BLI_insertlinkreplace(ListBase *listbase, void *vreplacelink, void *vnewlink)
+{
+       Link *l_old = vreplacelink;
+       Link *l_new = vnewlink;
+
+       /* update adjacent links */
+       if (l_old->next != NULL) {
+               l_old->next->prev = l_new;
+       }
+       if (l_old->prev != NULL) {
+               l_old->prev->next = l_new;
+       }
+
+       /* set direct links */
+       l_new->next = l_old->next;
+       l_new->prev = l_old->prev;
+
+        /* update list */
+       if (listbase->first == l_old) {
+               listbase->first = l_new;
+       }
+       if (listbase->last == l_old) {
+               listbase->last = l_new;
+       }
+}
+
 /**
  * Reinsert \a vlink relative to its current position but offset by \a step. Doesn't move
  * item if new position would exceed list (could optionally move to head/tail).