mempool utility function to get the element at an index BLI_mempool_findelem(), not...
authorCampbell Barton <ideasman42@gmail.com>
Sun, 27 Nov 2011 01:20:08 +0000 (01:20 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 27 Nov 2011 01:20:08 +0000 (01:20 +0000)
source/blender/blenlib/BLI_mempool.h
source/blender/blenlib/intern/BLI_mempool.c

index f98919fadd3a0f850e4c5535a83116fe9c44f968..a46ba78aef0728a7cfe8292d357cac61fd255e80 100644 (file)
@@ -55,6 +55,7 @@ void *BLI_mempool_calloc(BLI_mempool *pool);
 void BLI_mempool_free(BLI_mempool *pool, void *addr);
 void BLI_mempool_destroy(BLI_mempool *pool);
 int BLI_mempool_count(BLI_mempool *pool);
+void *BLI_mempool_findelem(BLI_mempool *pool, const int index);
 
 /** iteration stuff.  note: this may easy to produce bugs with **/
 /*private structure*/
index 19ae89da8ea2bb276338be056b2f95ecd2d8c18b..f8da524d0975c6dac3f26888aa5c1d3d22389c91 100644 (file)
@@ -68,8 +68,9 @@ typedef struct BLI_mempool_chunk {
 
 struct BLI_mempool {
        struct ListBase chunks;
-       int esize, csize, pchunk;        /* size of elements and chunks in bytes
-                                         * and number of elements per chunk*/
+       int esize;         /* element size in bytes */
+       int csize;         /* chunk size in bytes */
+       int pchunk;        /* number of elements per chunk */
        short use_sysmalloc, allow_iter;
        /* keeps aligned to 16 bits */
 
@@ -240,6 +241,23 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr)
        }
 }
 
+void *BLI_mempool_findelem(BLI_mempool *pool, const int index)
+{
+       if ((index >= 0) && (index < pool->totused)) {
+               BLI_mempool_chunk *mpchunk;
+               int i= 0;
+
+               for (mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) {
+                       if (index < i + pool->pchunk) {
+                               return ((char *)mpchunk->data) + (pool->esize * (index - i));
+                       }
+                       i += pool->pchunk;
+               }
+       }
+
+       return NULL;
+}
+
 void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter)
 {
        if (!pool->allow_iter) {