diff options
Diffstat (limited to 'source/blender/blenlib/intern/edgehash.c')
-rw-r--r-- | source/blender/blenlib/intern/edgehash.c | 101 |
1 files changed, 60 insertions, 41 deletions
diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c index c191d8b5b55..51a22cc46ab 100644 --- a/source/blender/blenlib/intern/edgehash.c +++ b/source/blender/blenlib/intern/edgehash.c @@ -190,7 +190,7 @@ static EdgeHash *edgehash_new(const char *info, } eh->buckets = MEM_callocN(eh->nbuckets * sizeof(*eh->buckets), "eh buckets"); - eh->epool = BLI_mempool_create(entry_size, 512, 512, BLI_MEMPOOL_NOP); + eh->epool = BLI_mempool_create(entry_size, nentries_reserve, 512, BLI_MEMPOOL_NOP); return eh; } @@ -356,6 +356,16 @@ void *BLI_edgehash_lookup(EdgeHash *eh, unsigned int v0, unsigned int v1) } /** + * A version of #BLI_edgehash_lookup which accepts a fallback argument. + */ +void *BLI_edgehash_lookup_default(EdgeHash *eh, unsigned int v0, unsigned int v1, void *val_default) +{ + EdgeEntry *e = edgehash_lookup_entry(eh, v0, v1); + IS_EDGEHASH_ASSERT(eh); + return e ? e->val : val_default; +} + +/** * Return boolean true/false if edge (v0,v1) in hash. */ bool BLI_edgehash_haskey(EdgeHash *eh, unsigned int v0, unsigned int v1) @@ -427,13 +437,6 @@ void BLI_edgehash_flag_clear(EdgeHash *eh, unsigned int flag) /** \name Iterator API * \{ */ -struct EdgeHashIterator { - EdgeHash *eh; - unsigned int curBucket; - EdgeEntry *curEntry; -}; - - /** * Create a new EdgeHashIterator. The hash table must not be mutated * while the iterator is in use, and the iterator will step exactly @@ -442,16 +445,51 @@ struct EdgeHashIterator { EdgeHashIterator *BLI_edgehashIterator_new(EdgeHash *eh) { EdgeHashIterator *ehi = MEM_mallocN(sizeof(*ehi), "eh iter"); + BLI_edgehashIterator_init(ehi, eh); + return ehi; +} + +/** + * Init an already allocated EdgeHashIterator. The hash table must not + * be mutated while the iterator is in use, and the iterator will + * step exactly BLI_edgehash_size(eh) times before becoming done. + * + * \param ehi The EdgeHashIterator to initialize. + * \param eh The EdgeHash to iterate over. + */ +void BLI_edgehashIterator_init(EdgeHashIterator *ehi, EdgeHash *eh) +{ ehi->eh = eh; ehi->curEntry = NULL; ehi->curBucket = UINT_MAX; /* wraps to zero */ - while (!ehi->curEntry) { - ehi->curBucket++; - if (ehi->curBucket == ehi->eh->nbuckets) - break; - ehi->curEntry = ehi->eh->buckets[ehi->curBucket]; + if (eh->nentries) { + while (!ehi->curEntry) { + ehi->curBucket++; + if (UNLIKELY(ehi->curBucket == ehi->eh->nbuckets)) { + break; + } + + ehi->curEntry = ehi->eh->buckets[ehi->curBucket]; + } + } +} + +/** + * Steps the iterator to the next index. + */ +void BLI_edgehashIterator_step(EdgeHashIterator *ehi) +{ + if (ehi->curEntry) { + ehi->curEntry = ehi->curEntry->next; + while (!ehi->curEntry) { + ehi->curBucket++; + if (UNLIKELY(ehi->curBucket == ehi->eh->nbuckets)) { + break; + } + + ehi->curEntry = ehi->eh->buckets[ehi->curBucket]; + } } - return ehi; } /** @@ -462,15 +500,15 @@ void BLI_edgehashIterator_free(EdgeHashIterator *ehi) MEM_freeN(ehi); } +/* inline functions now */ +#if 0 /** * Retrieve the key from an iterator. */ void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi, unsigned int *r_v0, unsigned int *r_v1) { - if (ehi->curEntry) { - *r_v0 = ehi->curEntry->v0; - *r_v1 = ehi->curEntry->v1; - } + *r_v0 = ehi->curEntry->v0; + *r_v1 = ehi->curEntry->v1; } /** @@ -478,7 +516,7 @@ void BLI_edgehashIterator_getKey(EdgeHashIterator *ehi, unsigned int *r_v0, unsi */ void *BLI_edgehashIterator_getValue(EdgeHashIterator *ehi) { - return ehi->curEntry ? ehi->curEntry->val : NULL; + return ehi->curEntry->val; } /** @@ -486,7 +524,7 @@ void *BLI_edgehashIterator_getValue(EdgeHashIterator *ehi) */ void **BLI_edgehashIterator_getValue_p(EdgeHashIterator *ehi) { - return ehi->curEntry ? &ehi->curEntry->val : NULL; + return &ehi->curEntry->val; } /** @@ -494,27 +532,7 @@ void **BLI_edgehashIterator_getValue_p(EdgeHashIterator *ehi) */ void BLI_edgehashIterator_setValue(EdgeHashIterator *ehi, void *val) { - if (ehi->curEntry) { - ehi->curEntry->val = val; - } -} - -/** - * Steps the iterator to the next index. - */ -void BLI_edgehashIterator_step(EdgeHashIterator *ehi) -{ - if (ehi->curEntry) { - ehi->curEntry = ehi->curEntry->next; - while (!ehi->curEntry) { - ehi->curBucket++; - if (ehi->curBucket == ehi->eh->nbuckets) { - break; - } - - ehi->curEntry = ehi->eh->buckets[ehi->curBucket]; - } - } + ehi->curEntry->val = val; } /** @@ -524,6 +542,7 @@ bool BLI_edgehashIterator_isDone(EdgeHashIterator *ehi) { return (ehi->curEntry == NULL); } +#endif /** \} */ |