diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-11-29 09:49:56 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-11-29 09:51:12 +0300 |
commit | 3e499c1a3153619005e1e68acff01d1371cc971b (patch) | |
tree | abc876269e34c0cc3f7cb43eeb7d43af0e9be65b | |
parent | 09c2bff32f411e1c9f100526d04de6430fa8cc43 (diff) |
Cleanup: sync edgehash w/ ghash remove logic
-rw-r--r-- | source/blender/blenlib/intern/BLI_ghash.c | 7 | ||||
-rw-r--r-- | source/blender/blenlib/intern/edgehash.c | 58 |
2 files changed, 41 insertions, 24 deletions
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c index aa412fe005d..29b07b37932 100644 --- a/source/blender/blenlib/intern/BLI_ghash.c +++ b/source/blender/blenlib/intern/BLI_ghash.c @@ -378,13 +378,12 @@ BLI_INLINE Entry *ghash_lookup_entry_ex( * Useful when modifying buckets somehow (like removing an entry...). */ BLI_INLINE Entry *ghash_lookup_entry_prev_ex( - GHash *gh, const void *key, Entry **r_e_prev, const unsigned int bucket_index) + GHash *gh, const void *key, + Entry **r_e_prev, const unsigned int bucket_index) { - Entry *e, *e_prev = NULL; - /* If we do not store GHash, not worth computing it for each entry here! * Typically, comparison function will be quicker, and since it's needed in the end anyway... */ - for (e = gh->buckets[bucket_index]; e; e_prev = e, e = e->next) { + for (Entry *e_prev = NULL, *e = gh->buckets[bucket_index]; e; e_prev = e, e = e->next) { if (UNLIKELY(gh->cmpfp(key, e->key) == false)) { *r_e_prev = e_prev; return e; diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c index 79fa776eb74..d6eae348d52 100644 --- a/source/blender/blenlib/intern/edgehash.c +++ b/source/blender/blenlib/intern/edgehash.c @@ -162,6 +162,27 @@ BLI_INLINE EdgeEntry *edgehash_lookup_entry_ex( } /** + * Internal lookup function, returns previous entry of target one too. + * Takes bucket_index argument to avoid calling #edgehash_bucket_index multiple times. + * Useful when modifying buckets somehow (like removing an entry...). + */ +BLI_INLINE EdgeEntry *edgehash_lookup_entry_prev_ex( + EdgeHash *eh, unsigned int v0, unsigned int v1, + EdgeEntry **r_e_prev, const unsigned int bucket_index) +{ + BLI_assert(v0 < v1); + for (EdgeEntry *e_prev = NULL, *e = eh->buckets[bucket_index]; e; e = e->next) { + if (UNLIKELY(v0 == e->v0 && v1 == e->v1)) { + *r_e_prev = e_prev; + return e; + } + } + + *r_e_prev = NULL; + return NULL; +} + +/** * Internal lookup function. Only wraps #edgehash_lookup_entry_ex */ BLI_INLINE EdgeEntry *edgehash_lookup_entry(EdgeHash *eh, unsigned int v0, unsigned int v1) @@ -282,38 +303,35 @@ BLI_INLINE void edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1, /** * Remove the entry and return it, caller must free from eh->epool. */ -static EdgeEntry *edgehash_remove_ex( +BLI_INLINE EdgeEntry *edgehash_remove_ex( EdgeHash *eh, unsigned int v0, unsigned int v1, EdgeHashFreeFP valfreefp, const unsigned int bucket_index) { - EdgeEntry *e; - EdgeEntry *e_prev = NULL; + EdgeEntry *e_prev; + EdgeEntry *e = edgehash_lookup_entry_prev_ex(eh, v0, v1, &e_prev, bucket_index); BLI_assert(v0 < v1); - for (e = eh->buckets[bucket_index]; e; e = e->next) { - if (UNLIKELY(v0 == e->v0 && v1 == e->v1)) { - EdgeEntry *e_next = e->next; - - if (valfreefp) { - valfreefp(e->val); - } + if (e) { + EdgeEntry *e_next = e->next; - if (e_prev) { - e_prev->next = e_next; - } - else { - eh->buckets[bucket_index] = e_next; - } + if (valfreefp) { + valfreefp(e->val); + } - eh->nentries--; - return e; + if (e_prev) { + e_prev->next = e_next; } - e_prev = e; + else { + eh->buckets[bucket_index] = e_next; + } + + eh->nentries--; + return e; } - return NULL; + return e; } /** |