allow on-the-fly deleting of hashmap entries wile we iterate through them

git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@2491 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2008-05-29 15:16:58 +00:00
parent c4f60d5960
commit 8431fb17c2
2 changed files with 27 additions and 14 deletions

View file

@ -191,24 +191,36 @@ unsigned pa_hashmap_size(pa_hashmap *h) {
} }
void *pa_hashmap_iterate(pa_hashmap *h, void **state, const void **key) { void *pa_hashmap_iterate(pa_hashmap *h, void **state, const void **key) {
struct hashmap_entry *e;
pa_assert(h); pa_assert(h);
pa_assert(state); pa_assert(state);
if (!*state) if (*state == (void*) -1)
*state = h->first_entry; goto at_end;
else
*state = ((struct hashmap_entry*) *state)->next; if ((!*state && !h->first_entry))
goto at_end;
e = *state ? *state : h->first_entry;
if (e->next)
*state = e->next;
else
*state = (void*) -1;
if (key)
*key = e->key;
return e->value;
at_end:
*state = (void *) -1;
if (!*state) {
if (key) if (key)
*key = NULL; *key = NULL;
return NULL; return NULL;
}
if (key)
*key = ((struct hashmap_entry*) *state)->key;
return ((struct hashmap_entry*) *state)->value;
} }
void* pa_hashmap_steal_first(pa_hashmap *h) { void* pa_hashmap_steal_first(pa_hashmap *h) {

View file

@ -51,9 +51,10 @@ unsigned pa_hashmap_size(pa_hashmap *h);
/* May be used to iterate through the hashmap. Initially the opaque /* May be used to iterate through the hashmap. Initially the opaque
pointer *state has to be set to NULL. The hashmap may not be pointer *state has to be set to NULL. The hashmap may not be
modified during iteration. The key of the entry is returned in modified during iteration -- except for deleting the current entry
*key, if key is non-NULL. After the last entry in the hashmap NULL via pa_hashmap_remove(). The key of the entry is returned in *key,
is returned. */ if key is non-NULL. After the last entry in the hashmap NULL is
returned. */
void *pa_hashmap_iterate(pa_hashmap *h, void **state, const void**key); void *pa_hashmap_iterate(pa_hashmap *h, void **state, const void**key);
void *pa_hashmap_steal_first(pa_hashmap *h); void *pa_hashmap_steal_first(pa_hashmap *h);