Cleanup: sync edgehash w/ ghash remove logic
This commit is contained in:
parent
09c2bff32f
commit
3e499c1a31
Notes:
blender-bot
2023-02-14 08:24:06 +01:00
Referenced by commitf117f45d86
, Correct own mistake in3e499c1a
Referenced by issue #46898, OpenCL Fails to Compile (AMD)
|
@ -378,13 +378,12 @@ BLI_INLINE Entry *ghash_lookup_entry_ex(
|
|||
* Useful when modifying buckets somehow (like removing an entry...).
|
||||
*/
|
||||
BLI_INLINE Entry *ghash_lookup_entry_prev_ex(
|
||||
GHash *gh, const void *key, Entry **r_e_prev, const unsigned int bucket_index)
|
||||
GHash *gh, const void *key,
|
||||
Entry **r_e_prev, const unsigned int bucket_index)
|
||||
{
|
||||
Entry *e, *e_prev = NULL;
|
||||
|
||||
/* If we do not store GHash, not worth computing it for each entry here!
|
||||
* Typically, comparison function will be quicker, and since it's needed in the end anyway... */
|
||||
for (e = gh->buckets[bucket_index]; e; e_prev = e, e = e->next) {
|
||||
for (Entry *e_prev = NULL, *e = gh->buckets[bucket_index]; e; e_prev = e, e = e->next) {
|
||||
if (UNLIKELY(gh->cmpfp(key, e->key) == false)) {
|
||||
*r_e_prev = e_prev;
|
||||
return e;
|
||||
|
|
|
@ -161,6 +161,27 @@ BLI_INLINE EdgeEntry *edgehash_lookup_entry_ex(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal lookup function, returns previous entry of target one too.
|
||||
* Takes bucket_index argument to avoid calling #edgehash_bucket_index multiple times.
|
||||
* Useful when modifying buckets somehow (like removing an entry...).
|
||||
*/
|
||||
BLI_INLINE EdgeEntry *edgehash_lookup_entry_prev_ex(
|
||||
EdgeHash *eh, unsigned int v0, unsigned int v1,
|
||||
EdgeEntry **r_e_prev, const unsigned int bucket_index)
|
||||
{
|
||||
BLI_assert(v0 < v1);
|
||||
for (EdgeEntry *e_prev = NULL, *e = eh->buckets[bucket_index]; e; e = e->next) {
|
||||
if (UNLIKELY(v0 == e->v0 && v1 == e->v1)) {
|
||||
*r_e_prev = e_prev;
|
||||
return e;
|
||||
}
|
||||
}
|
||||
|
||||
*r_e_prev = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal lookup function. Only wraps #edgehash_lookup_entry_ex
|
||||
*/
|
||||
|
@ -282,38 +303,35 @@ BLI_INLINE void edgehash_insert(EdgeHash *eh, unsigned int v0, unsigned int v1,
|
|||
/**
|
||||
* Remove the entry and return it, caller must free from eh->epool.
|
||||
*/
|
||||
static EdgeEntry *edgehash_remove_ex(
|
||||
BLI_INLINE EdgeEntry *edgehash_remove_ex(
|
||||
EdgeHash *eh, unsigned int v0, unsigned int v1,
|
||||
EdgeHashFreeFP valfreefp,
|
||||
const unsigned int bucket_index)
|
||||
{
|
||||
EdgeEntry *e;
|
||||
EdgeEntry *e_prev = NULL;
|
||||
EdgeEntry *e_prev;
|
||||
EdgeEntry *e = edgehash_lookup_entry_prev_ex(eh, v0, v1, &e_prev, bucket_index);
|
||||
|
||||
BLI_assert(v0 < v1);
|
||||
|
||||
for (e = eh->buckets[bucket_index]; e; e = e->next) {
|
||||
if (UNLIKELY(v0 == e->v0 && v1 == e->v1)) {
|
||||
EdgeEntry *e_next = e->next;
|
||||
if (e) {
|
||||
EdgeEntry *e_next = e->next;
|
||||
|
||||
if (valfreefp) {
|
||||
valfreefp(e->val);
|
||||
}
|
||||
|
||||
if (e_prev) {
|
||||
e_prev->next = e_next;
|
||||
}
|
||||
else {
|
||||
eh->buckets[bucket_index] = e_next;
|
||||
}
|
||||
|
||||
eh->nentries--;
|
||||
return e;
|
||||
if (valfreefp) {
|
||||
valfreefp(e->val);
|
||||
}
|
||||
e_prev = e;
|
||||
|
||||
if (e_prev) {
|
||||
e_prev->next = e_next;
|
||||
}
|
||||
else {
|
||||
eh->buckets[bucket_index] = e_next;
|
||||
}
|
||||
|
||||
eh->nentries--;
|
||||
return e;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return e;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue