add support for mempool/linklist functions.
authorCampbell Barton <ideasman42@gmail.com>
Fri, 16 Aug 2013 05:50:00 +0000 (05:50 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 16 Aug 2013 05:50:00 +0000 (05:50 +0000)
source/blender/blenlib/BLI_linklist.h
source/blender/blenlib/intern/BLI_linklist.c

index 3e7fdc8bf751bf1c166b0c7605c25c6b7ab4968c..9c1e1f88bab1395012830556806bccd0c3ed199d 100644 (file)
@@ -36,6 +36,7 @@
  */
 
 struct MemArena;
+struct BLI_mempool;
 
 typedef void (*LinkNodeFreeFP)(void *link);
 typedef void (*LinkNodeApplyFP)(void *link, void *userdata);
@@ -56,10 +57,14 @@ void    BLI_linklist_reverse(struct LinkNode **listp);
 void    BLI_linklist_prepend(struct LinkNode **listp, void *ptr);
 void    BLI_linklist_append(struct LinkNode **listp, void *ptr);
 void    BLI_linklist_prepend_arena(struct LinkNode **listp, void *ptr, struct MemArena *ma);
+void    BLI_linklist_prepend_pool(struct LinkNode **listp, void *ptr, struct BLI_mempool *mempool);
+void   *BLI_linklist_pop(struct LinkNode **listp);
+void   *BLI_linklist_pop_pool(struct LinkNode **listp, struct BLI_mempool *mempool);
 void    BLI_linklist_insert_after(struct LinkNode **listp, void *ptr);
 
 void    BLI_linklist_free(struct LinkNode *list, LinkNodeFreeFP freefunc);
 void    BLI_linklist_freeN(struct LinkNode *list);
+void    BLI_linklist_free_pool(LinkNode *list, LinkNodeFreeFP freefunc, struct BLI_mempool *mempool);
 void    BLI_linklist_apply(struct LinkNode *list, LinkNodeApplyFP applyfunc, void *userdata);
 
 #endif
index b08fbe17a43d9d71e83cc36621bd835213a69bdd..99fc5f27726139b9c903afc301c8a9dd71fe0fdb 100644 (file)
@@ -34,6 +34,7 @@
 #include "MEM_guardedalloc.h"
 #include "BLI_linklist.h"
 #include "BLI_memarena.h"
+#include "BLI_mempool.h"
 
 int BLI_linklist_length(LinkNode *list)
 {
@@ -125,6 +126,39 @@ void BLI_linklist_prepend_arena(LinkNode **listp, void *ptr, MemArena *ma)
        *listp = nlink;
 }
 
+void BLI_linklist_prepend_pool(LinkNode **listp, void *ptr, BLI_mempool *mempool)
+{
+       LinkNode *nlink = BLI_mempool_alloc(mempool);
+       nlink->link = ptr;
+
+       nlink->next = *listp;
+       *listp = nlink;
+}
+
+void *BLI_linklist_pop(struct LinkNode **listp)
+{
+       /* intentionally no NULL check */
+       void *link = (*listp)->link;
+       void *next = (*listp)->next;
+
+       MEM_freeN((*listp));
+
+       *listp = next;
+       return link;
+}
+
+void *BLI_linklist_pop_pool(struct LinkNode **listp, struct BLI_mempool *mempool)
+{
+       /* intentionally no NULL check */
+       void *link = (*listp)->link;
+       void *next = (*listp)->next;
+
+       BLI_mempool_free(mempool, (*listp));
+
+       *listp = next;
+       return link;
+}
+
 void BLI_linklist_insert_after(LinkNode **listp, void *ptr)
 {
        LinkNode *nlink = MEM_mallocN(sizeof(*nlink), "nlink");
@@ -155,6 +189,19 @@ void BLI_linklist_free(LinkNode *list, LinkNodeFreeFP freefunc)
        }
 }
 
+void BLI_linklist_free_pool(LinkNode *list, LinkNodeFreeFP freefunc, struct BLI_mempool *mempool)
+{
+       while (list) {
+               LinkNode *next = list->next;
+
+               if (freefunc)
+                       freefunc(list->link);
+               BLI_mempool_free(mempool, list);
+
+               list = next;
+       }
+}
+
 void BLI_linklist_freeN(LinkNode *list)
 {
        while (list) {