/** * Insert function that doesn't set the value (use for EdgeSet) */ BLI_INLINE void edgehash_insert_ex_keyonly(EdgeHash *eh, unsigned int v0, unsigned int v1, unsigned int hash) { EdgeEntry *e = BLI_mempool_alloc(eh->epool); BLI_assert((eh->flag & EDGEHASH_FLAG_ALLOW_DUPES) || (BLI_edgehash_haskey(eh, v0, v1) == 0)); /* this helps to track down errors with bad edge data */ BLI_assert(v0 < v1); BLI_assert(v0 != v1); e->next = eh->buckets[hash]; e->v0 = v0; e->v1 = v1; /* intentionally leave value unset */ eh->buckets[hash] = e; if (UNLIKELY(edgehash_test_expand_buckets(++eh->nentries, eh->nbuckets))) { edgehash_resize_buckets(eh, _ehash_hashsizes[++eh->cursize]); } }
/** * Internal insert function. * Takes a \a bucket_index argument to avoid calling #edgehash_bucket_index multiple times. */ BLI_INLINE void edgehash_insert_ex( EdgeHash *eh, uint v0, uint v1, void *val, const uint bucket_index) { EdgeEntry *e = BLI_mempool_alloc(eh->epool); BLI_assert((eh->flag & EDGEHASH_FLAG_ALLOW_DUPES) || (BLI_edgehash_haskey(eh, v0, v1) == 0)); IS_EDGEHASH_ASSERT(eh); /* this helps to track down errors with bad edge data */ BLI_assert(v0 < v1); BLI_assert(v0 != v1); e->next = eh->buckets[bucket_index]; e->v0 = v0; e->v1 = v1; e->val = val; eh->buckets[bucket_index] = e; if (UNLIKELY(edgehash_test_expand_buckets(++eh->nentries, eh->nbuckets))) { edgehash_resize_buckets(eh, _ehash_hashsizes[++eh->cursize]); } }
/** * Increase initial bucket size to match a reserved amount. */ BLI_INLINE void edgehash_buckets_reserve(EdgeHash *eh, const unsigned int nentries_reserve) { while (edgehash_test_expand_buckets(nentries_reserve, eh->nbuckets)) { eh->nbuckets = _ehash_hashsizes[++eh->cursize]; } }