[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