GHash: BLI_ghash_reinsert_key utility function
Useful when ghash keys are reallocated.
This commit is contained in:
@@ -90,6 +90,7 @@ void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfre
|
|||||||
void BLI_ghash_reserve(GHash *gh, const unsigned int nentries_reserve);
|
void BLI_ghash_reserve(GHash *gh, const unsigned int nentries_reserve);
|
||||||
void BLI_ghash_insert(GHash *gh, void *key, void *val);
|
void BLI_ghash_insert(GHash *gh, void *key, void *val);
|
||||||
bool BLI_ghash_reinsert(GHash *gh, void *key, void *val, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
|
bool BLI_ghash_reinsert(GHash *gh, void *key, void *val, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp);
|
||||||
|
void *BLI_ghash_replace_key(GHash *gh, void *key);
|
||||||
void *BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT;
|
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;
|
||||||
@@ -248,6 +249,7 @@ void BLI_gset_insert(GSet *gh, void *key);
|
|||||||
bool BLI_gset_add(GSet *gs, void *key);
|
bool BLI_gset_add(GSet *gs, void *key);
|
||||||
bool BLI_gset_ensure_p_ex(GSet *gs, const void *key, void ***r_key);
|
bool BLI_gset_ensure_p_ex(GSet *gs, const void *key, void ***r_key);
|
||||||
bool BLI_gset_reinsert(GSet *gh, void *key, GSetKeyFreeFP keyfreefp);
|
bool BLI_gset_reinsert(GSet *gh, void *key, GSetKeyFreeFP keyfreefp);
|
||||||
|
void *BLI_gset_replace_key(GSet *gs, void *key);
|
||||||
bool BLI_gset_haskey(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT;
|
bool BLI_gset_haskey(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT;
|
||||||
bool BLI_gset_pop(GSet *gs, GSetIterState *state, void **r_key) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
|
bool BLI_gset_pop(GSet *gs, GSetIterState *state, void **r_key) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
|
||||||
bool BLI_gset_remove(GSet *gs, const void *key, GSetKeyFreeFP keyfreefp);
|
bool BLI_gset_remove(GSet *gs, const void *key, GSetKeyFreeFP keyfreefp);
|
||||||
|
@@ -762,6 +762,28 @@ bool BLI_ghash_reinsert(GHash *gh, void *key, void *val, GHashKeyFreeFP keyfreef
|
|||||||
return ghash_insert_safe(gh, key, val, true, keyfreefp, valfreefp);
|
return ghash_insert_safe(gh, key, val, true, keyfreefp, valfreefp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces the key of an item in the \a gh.
|
||||||
|
*
|
||||||
|
* Use when a key is re-allocated or it's memory location is changed.
|
||||||
|
*
|
||||||
|
* \returns The previous key or NULL if not found, the caller may free if it's needed.
|
||||||
|
*/
|
||||||
|
void *BLI_ghash_replace_key(GHash *gh, void *key)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
if (e != NULL) {
|
||||||
|
void *key_prev = e->e.key;
|
||||||
|
e->e.key = key;
|
||||||
|
return key_prev;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lookup the value of \a key in \a gh.
|
* Lookup the value of \a key in \a gh.
|
||||||
*
|
*
|
||||||
@@ -1434,6 +1456,18 @@ bool BLI_gset_reinsert(GSet *gs, void *key, GSetKeyFreeFP keyfreefp)
|
|||||||
return ghash_insert_safe_keyonly((GHash *)gs, key, true, keyfreefp);
|
return ghash_insert_safe_keyonly((GHash *)gs, key, true, keyfreefp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces the key to the set if it's found.
|
||||||
|
* Matching #BLI_ghash_replace_key
|
||||||
|
*
|
||||||
|
* \returns The old key or NULL if not found.
|
||||||
|
*/
|
||||||
|
void *BLI_gset_replace_key(GSet *gs, void *key)
|
||||||
|
{
|
||||||
|
return BLI_ghash_replace_key((GHash *)gs, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool BLI_gset_remove(GSet *gs, const void *key, GSetKeyFreeFP keyfreefp)
|
bool BLI_gset_remove(GSet *gs, const void *key, GSetKeyFreeFP keyfreefp)
|
||||||
{
|
{
|
||||||
return BLI_ghash_remove((GHash *)gs, key, keyfreefp, NULL);
|
return BLI_ghash_remove((GHash *)gs, key, keyfreefp, NULL);
|
||||||
|
Reference in New Issue
Block a user