Commit: 3e499c1a3153619005e1e68acff01d1371cc971b
Author: Campbell Barton
Date:   Sun Nov 29 17:49:56 2015 +1100
Branches: master
https://developer.blender.org/rB3e499c1a3153619005e1e68acff01d1371cc971b

Cleanup: sync edgehash w/ ghash remove logic

===================================================================

M       source/blender/blenlib/intern/BLI_ghash.c
M       source/blender/blenlib/intern/edgehash.c

===================================================================

diff --git a/source/blender/blenlib/intern/BLI_ghash.c 
b/source/blender/blenlib/intern/BLI_ghash.c
index aa412fe..29b07b3 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 79fa776..d6eae34 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;
 }
 
 /**

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to