forked from bartvdbraak/blender
GHash: Add BLI_ghash_ensure_p_ex to copy the key
Needed in cases where the memory from each key is owned by the GHash.
This commit is contained in:
parent
d55868c3b2
commit
9e2e85a367
@ -44,8 +44,8 @@ typedef unsigned int (*GHashHashFP) (const void *key);
|
|||||||
typedef bool (*GHashCmpFP) (const void *a, const void *b);
|
typedef bool (*GHashCmpFP) (const void *a, const void *b);
|
||||||
typedef void (*GHashKeyFreeFP) (void *key);
|
typedef void (*GHashKeyFreeFP) (void *key);
|
||||||
typedef void (*GHashValFreeFP) (void *val);
|
typedef void (*GHashValFreeFP) (void *val);
|
||||||
typedef void *(*GHashKeyCopyFP) (void *key);
|
typedef void *(*GHashKeyCopyFP) (const void *key);
|
||||||
typedef void *(*GHashValCopyFP) (void *val);
|
typedef void *(*GHashValCopyFP) (const void *val);
|
||||||
|
|
||||||
typedef struct GHash GHash;
|
typedef struct GHash GHash;
|
||||||
|
|
||||||
@ -80,6 +80,7 @@ void *BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT;
|
|||||||
void *BLI_ghash_lookup_default(GHash *gh, const void *key, void *val_default) ATTR_WARN_UNUSED_RESULT;
|
void *BLI_ghash_lookup_default(GHash *gh, const void *key, void *val_default) ATTR_WARN_UNUSED_RESULT;
|
||||||
void **BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT;
|
void **BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT;
|
||||||
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT;
|
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT;
|
||||||
|
bool BLI_ghash_ensure_p_ex(GHash *gh, const void *key, void ***r_val, GHashKeyCopyFP keycopyfp) ATTR_WARN_UNUSED_RESULT;
|
||||||
bool BLI_ghash_remove(GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
|
bool BLI_ghash_remove(GHash *gh, void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
|
||||||
void BLI_ghash_clear(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
|
void BLI_ghash_clear(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
|
||||||
void BLI_ghash_clear_ex(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp,
|
void BLI_ghash_clear_ex(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp,
|
||||||
|
@ -766,6 +766,28 @@ bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val)
|
|||||||
return haskey;
|
return haskey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A version of #BLI_ghash_ensure_p copies the key on insertion.
|
||||||
|
*/
|
||||||
|
bool BLI_ghash_ensure_p_ex(
|
||||||
|
GHash *gh, const void *key, void ***r_val,
|
||||||
|
GHashKeyCopyFP keycopyfp)
|
||||||
|
{
|
||||||
|
const unsigned int hash = ghash_keyhash(gh, key);
|
||||||
|
const unsigned int bucket_index = ghash_bucket_index(gh, hash);
|
||||||
|
GHashEntry *e = (GHashEntry *)ghash_lookup_entry_ex(gh, key, bucket_index);
|
||||||
|
const bool haskey = (e != NULL);
|
||||||
|
|
||||||
|
if (!haskey) {
|
||||||
|
/* keycopyfp(key) is the only difference to BLI_ghash_ensure_p */
|
||||||
|
e = BLI_mempool_alloc(gh->entrypool);
|
||||||
|
ghash_insert_ex_keyonly_entry(gh, keycopyfp(key), bucket_index, (Entry *)e);
|
||||||
|
}
|
||||||
|
|
||||||
|
*r_val = &e->val;
|
||||||
|
return haskey;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove \a key from \a gh, or return false if the key wasn't found.
|
* Remove \a key from \a gh, or return false if the key wasn't found.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user