Commit: a47e4258f813de200b923ae10c4790d81962a2b3
Author: Bastien Montagne
Date:   Thu Mar 19 17:21:38 2015 +0100
Branches: temp-ghash-basis
https://developer.blender.org/rBa47e4258f813de200b923ae10c4790d81962a2b3

Make ghash_copy do actual exact copy (same number of buckets).

Simplifies copy code (no need to re-compute compute hash of entries).

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

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 2819005..e9d0061 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -118,7 +118,7 @@ struct GHash {
 
 BLI_INLINE void ghash_entry_copy(
         GHash *gh_dst, Entry *dst, GHash *gh_src, Entry *src,
-        const unsigned int UNUSED(hash), GHashKeyCopyFP keycopyfp, 
GHashValCopyFP valcopyfp)
+        GHashKeyCopyFP keycopyfp, GHashValCopyFP valcopyfp)
 {
        dst->key = (keycopyfp) ? keycopyfp(src->key) : src->key;
 
@@ -567,30 +567,30 @@ static GHash *ghash_copy(GHash *gh, GHashKeyCopyFP 
keycopyfp, GHashValCopyFP val
 {
        GHash *gh_new;
        unsigned int i;
+       /* This allows us to be sure to get the same number of buckets in 
gh_new as in ghash. */
+       const unsigned int reserve_nentries_new = 
MAX2(GHASH_LIMIT_GROW(gh->nbuckets) - 1, gh->nentries);
 
        BLI_assert(!valcopyfp || !(gh->flag & GHASH_FLAG_IS_GSET));
 
-       gh_new = ghash_new(gh->hashfp, gh->cmpfp, __func__, 0, gh->flag & 
GHASH_FLAG_IS_GSET);
-       ghash_buckets_expand(gh_new, gh->nentries, false);
+       gh_new = ghash_new(gh->hashfp, gh->cmpfp, __func__, 0, gh->flag);
+       ghash_buckets_expand(gh_new, reserve_nentries_new, false);
+
+       BLI_assert(gh_new->nbuckets == gh->nbuckets);
 
        for (i = 0; i < gh->nbuckets; i++) {
                Entry *e;
 
                for (e = gh->buckets[i]; e; e = e->next) {
                        Entry *e_new = BLI_mempool_alloc(gh_new->entrypool);
-                       const unsigned int hash = ghash_entryhash(gh, e);
-                       const unsigned int gh_new_bucket_hash = 
ghash_bucket_hash(gh_new, hash);
-
-                       ghash_entry_copy(gh_new, e_new, gh, e, hash, keycopyfp, 
valcopyfp);
+                       ghash_entry_copy(gh_new, e_new, gh, e, keycopyfp, 
valcopyfp);
 
                        /* Warning!
                         * This means entries in buckets in new copy will be in 
reversed order!
                         * This shall not be an issue though, since order 
should never be assumed in ghash. */
 
-                       /* Note: We can't use 'i' here, since there is no 
guaranty that 'gh' and 'gh_new'
-                        * have the same number of buckets! */
-                       e_new->next = gh_new->buckets[gh_new_bucket_hash];
-                       gh_new->buckets[gh_new_bucket_hash] = e_new;
+                       /* Note: We can use 'i' here, since we are sure that 
'gh' and 'gh_new' have the same number of buckets! */
+                       e_new->next = gh_new->buckets[i];
+                       gh_new->buckets[i] = e_new;
                }
        }
        gh_new->nentries = gh->nentries;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to