Commit: bc218cf4d24f1cb4653950be84129ff9039b4e65
Author: Bastien Montagne
Date:   Tue Feb 10 17:28:55 2015 +0100
Branches: master
https://developer.blender.org/rBbc218cf4d24f1cb4653950be84129ff9039b4e65

BLI_linklist: Add a new helper to move an item (identified by its current 
index) to a new position in the list.

===================================================================

M       source/blender/blenlib/BLI_linklist.h
M       source/blender/blenlib/intern/BLI_linklist.c

===================================================================

diff --git a/source/blender/blenlib/BLI_linklist.h 
b/source/blender/blenlib/BLI_linklist.h
index 2ca363e..8dbf7b4 100644
--- a/source/blender/blenlib/BLI_linklist.h
+++ b/source/blender/blenlib/BLI_linklist.h
@@ -54,6 +54,8 @@ struct LinkNode *BLI_linklist_find(struct LinkNode *list, int 
index);
 
 void    BLI_linklist_reverse(struct LinkNode **listp);
 
+void    BLI_linklist_move_item(struct LinkNode **listp, int curr_index, int 
new_index);
+
 void    BLI_linklist_prepend_nlink(struct LinkNode **listp, void *ptr, struct 
LinkNode *nlink);
 void    BLI_linklist_prepend(struct LinkNode **listp, void *ptr);
 void    BLI_linklist_prepend_arena(struct LinkNode **listp, void *ptr, struct 
MemArena *ma);
diff --git a/source/blender/blenlib/intern/BLI_linklist.c 
b/source/blender/blenlib/intern/BLI_linklist.c
index 6b79cf9..391f3ef 100644
--- a/source/blender/blenlib/intern/BLI_linklist.c
+++ b/source/blender/blenlib/intern/BLI_linklist.c
@@ -87,6 +87,77 @@ void BLI_linklist_reverse(LinkNode **listp)
 }
 
 /**
+ * Move an item from its current position to a new one inside a single-linked 
list.
+ * Note *listp may be modified.
+ */
+void BLI_linklist_move_item(LinkNode **listp, int curr_index, int new_index)
+{
+       LinkNode *lnk, *lnk_psrc = NULL, *lnk_pdst = NULL;
+       int i;
+
+       if (new_index == curr_index) {
+               return;
+       }
+
+       if (new_index < curr_index) {
+               for (lnk = *listp, i = 0; lnk; lnk = lnk->next, i++) {
+                       if (i == new_index - 1) {
+                               lnk_pdst = lnk;
+                       }
+                       else if (i == curr_index - 1) {
+                               lnk_psrc = lnk;
+                               break;
+                       }
+               }
+
+               if (!(lnk_psrc && lnk_psrc->next && (!lnk_pdst || 
lnk_pdst->next))) {
+                       /* Invalid indices, abort. */
+                       return;
+               }
+
+               lnk = lnk_psrc->next;
+               lnk_psrc->next = lnk->next;
+               if (lnk_pdst) {
+                       lnk->next = lnk_pdst->next;
+                       lnk_pdst->next = lnk;
+               }
+               else {
+                       /* destination is first element of the list... */
+                       lnk->next = *listp;
+                       *listp = lnk;
+               }
+       }
+       else {
+               for (lnk = *listp, i = 0; lnk; lnk = lnk->next, i++) {
+                       if (i == new_index) {
+                               lnk_pdst = lnk;
+                               break;
+                       }
+                       else if (i == curr_index - 1) {
+                               lnk_psrc = lnk;
+                       }
+               }
+
+               if (!(lnk_pdst && (!lnk_psrc || lnk_psrc->next))) {
+                       /* Invalid indices, abort. */
+                       return;
+               }
+
+               if (lnk_psrc) {
+                       lnk = lnk_psrc->next;
+                       lnk_psrc->next = lnk->next;
+               }
+               else {
+                       /* source is first element of the list... */
+                       lnk = *listp;
+                       *listp = lnk->next;
+               }
+               lnk->next = lnk_pdst->next;
+               lnk_pdst->next = lnk;
+       }
+}
+
+/**
  * A version of prepend that takes the allocated link.
  */
 void BLI_linklist_prepend_nlink(LinkNode **listp, void *ptr, LinkNode *nlink)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to