[Bf-blender-cvs] [3e499c1] master: Cleanup: sync edgehash w/ ghash remove logic

Campbell Barton noreply at git.blender.org
Sun Nov 29 07:53:15 CET 2015


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;
 }
 
 /**




More information about the Bf-blender-cvs mailing list