[Bf-blender-cvs] [e87895e] temp-ghash-experiments: Factorize gset/ghash add/reinsert functions.

Bastien Montagne noreply at git.blender.org
Fri Mar 6 14:06:38 CET 2015


Commit: e87895e39e29d17bf34beb25d6cda573ba781af6
Author: Bastien Montagne
Date:   Thu Mar 5 14:10:11 2015 +0100
Branches: temp-ghash-experiments
https://developer.blender.org/rBe87895e39e29d17bf34beb25d6cda573ba781af6

Factorize gset/ghash add/reinsert functions.

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

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

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

diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index 7875631..97dd363 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -392,6 +392,47 @@ BLI_INLINE void ghash_insert(GHash *gh, void *key, void *val)
 	ghash_insert_ex(gh, key, val, hash, bucket_hash);
 }
 
+BLI_INLINE bool ghash_insert_safe(
+        GHash *gh, void *key, void *val, const bool override, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
+{
+	const unsigned int hash = ghash_keyhash(gh, key);
+	const unsigned int bucket_hash = ghash_bucket_hash(gh, hash);
+	Entry *e = ghash_lookup_entry_ex(gh, key, hash, bucket_hash);
+
+	if (e) {
+		if (override) {
+			if (keyfreefp) keyfreefp(e->key);
+			if (valfreefp) valfreefp(e->val);
+			e->key = key;
+			e->val = val;
+		}
+		return false;
+	}
+	else {
+		ghash_insert_ex(gh, key, val, hash, bucket_hash);
+		return true;
+	}
+}
+
+BLI_INLINE bool ghash_insert_safe_keyonly(GHash *gh, void *key, const bool override, GHashKeyFreeFP keyfreefp)
+{
+	const unsigned int hash = ghash_keyhash(gh, key);
+	const unsigned int bucket_hash = ghash_bucket_hash(gh, hash);
+	Entry *e = ghash_lookup_entry_ex(gh, key, hash, bucket_hash);
+
+	if (e) {
+		if (override) {
+			if (keyfreefp) keyfreefp(e->key);
+			e->key = key;
+		}
+		return false;
+	}
+	else {
+		ghash_insert_ex_keyonly(gh, key, hash, bucket_hash);
+		return true;
+	}
+}
+
 /**
  * Remove the entry and return it, caller must free from gh->entrypool.
  */
@@ -871,16 +912,7 @@ void BLI_ghash_insert(GHash *gh, void *key, void *val)
  */
 bool BLI_ghash_add(GHash *gh, void *key, void *val)
 {
-	const unsigned int hash = ghash_keyhash(gh, key);
-	const unsigned int bucket_hash = ghash_bucket_hash(gh, hash);
-	Entry *e = ghash_lookup_entry_ex(gh, key, hash, bucket_hash);
-	if (e) {
-		return false;
-	}
-	else {
-		ghash_insert_ex(gh, key, val, hash, bucket_hash);
-		return true;
-	}
+	return ghash_insert_safe(gh, key, val, false, NULL, NULL);
 }
 
 /**
@@ -892,20 +924,7 @@ bool BLI_ghash_add(GHash *gh, void *key, void *val)
  */
 bool BLI_ghash_reinsert(GHash *gh, void *key, void *val, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
 {
-	const unsigned int hash = ghash_keyhash(gh, key);
-	const unsigned int bucket_hash = ghash_bucket_hash(gh, hash);
-	Entry *e = ghash_lookup_entry_ex(gh, key, hash, bucket_hash);
-	if (e) {
-		if (keyfreefp) keyfreefp(e->key);
-		if (valfreefp) valfreefp(e->val);
-		e->key = key;
-		e->val = val;
-		return false;
-	}
-	else {
-		ghash_insert_ex(gh, key, val, hash, bucket_hash);
-		return true;
-	}
+	return ghash_insert_safe(gh, key, val, true, keyfreefp, valfreefp);
 }
 
 /**
@@ -1667,16 +1686,7 @@ void BLI_gset_insert(GSet *gs, void *key)
  */
 bool BLI_gset_add(GSet *gs, void *key)
 {
-	const unsigned int hash = ghash_keyhash((GHash *)gs, key);
-	const unsigned int bucket_hash = ghash_bucket_hash((GHash *)gs, hash);
-	Entry *e = ghash_lookup_entry_ex((GHash *)gs, key, hash, bucket_hash);
-	if (e) {
-		return false;
-	}
-	else {
-		ghash_insert_ex_keyonly((GHash *)gs, key, hash, bucket_hash);
-		return true;
-	}
+	return ghash_insert_safe_keyonly((GHash *)gs, key, false, NULL);
 }
 
 /**
@@ -1687,18 +1697,7 @@ bool BLI_gset_add(GSet *gs, void *key)
  */
 bool BLI_gset_reinsert(GSet *gs, void *key, GSetKeyFreeFP keyfreefp)
 {
-	const unsigned int hash = ghash_keyhash((GHash *)gs, key);
-	const unsigned int bucket_hash = ghash_bucket_hash((GHash *)gs, hash);
-	Entry *e = ghash_lookup_entry_ex((GHash *)gs, key, hash, bucket_hash);
-	if (e) {
-		if (keyfreefp) keyfreefp(e->key);
-		e->key = key;
-		return false;
-	}
-	else {
-		ghash_insert_ex_keyonly((GHash *)gs, key, hash, bucket_hash);
-		return true;
-	}
+	return ghash_insert_safe_keyonly((GHash *)gs, key, true, keyfreefp);
 }
 
 bool BLI_gset_remove(GSet *gs, void *key, GSetKeyFreeFP keyfreefp)




More information about the Bf-blender-cvs mailing list