Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2015-11-29 09:49:56 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-11-29 09:51:12 +0300
commit3e499c1a3153619005e1e68acff01d1371cc971b (patch)
treeabc876269e34c0cc3f7cb43eeb7d43af0e9be65b /source
parent09c2bff32f411e1c9f100526d04de6430fa8cc43 (diff)
Cleanup: sync edgehash w/ ghash remove logic
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c7
-rw-r--r--source/blender/blenlib/intern/edgehash.c58
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;
}
/**