From 8423b1b33a51ecc45480d664e4bba7e488eac704 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 27 Nov 2011 01:20:08 +0000 Subject: mempool utility function to get the element at an index BLI_mempool_findelem(), not used yet. --- source/blender/blenlib/BLI_mempool.h | 1 + source/blender/blenlib/intern/BLI_mempool.c | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/blenlib/BLI_mempool.h b/source/blender/blenlib/BLI_mempool.h index f98919fadd3..a46ba78aef0 100644 --- a/source/blender/blenlib/BLI_mempool.h +++ b/source/blender/blenlib/BLI_mempool.h @@ -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*/ diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c index 19ae89da8ea..f8da524d097 100644 --- a/source/blender/blenlib/intern/BLI_mempool.c +++ b/source/blender/blenlib/intern/BLI_mempool.c @@ -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) { -- cgit v1.2.3