diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pulsecore/hashmap.c | 33 | ||||
| -rw-r--r-- | src/pulsecore/hashmap.h | 10 | 
2 files changed, 42 insertions, 1 deletions
diff --git a/src/pulsecore/hashmap.c b/src/pulsecore/hashmap.c index e957c5ba..b549cb1c 100644 --- a/src/pulsecore/hashmap.c +++ b/src/pulsecore/hashmap.c @@ -237,6 +237,39 @@ at_end:      return NULL;  } +void *pa_hashmap_iterate_backwards(pa_hashmap *h, void **state, const void **key) { +    struct hashmap_entry *e; + +    pa_assert(h); +    pa_assert(state); + +    if (*state == (void*) -1) +        goto at_beginning; + +    if (!*state && !h->iterate_list_tail) +        goto at_beginning; + +    e = *state ? *state : h->iterate_list_tail; + +    if (e->iterate_previous) +        *state = e->iterate_previous; +    else +        *state = (void*) -1; + +    if (key) +        *key = e->key; + +    return e->value; + +at_beginning: +    *state = (void *) -1; + +    if (key) +        *key = NULL; + +    return NULL; +} +  void* pa_hashmap_first(pa_hashmap *h) {      pa_assert(h); diff --git a/src/pulsecore/hashmap.h b/src/pulsecore/hashmap.h index 828e2448..f379fe3c 100644 --- a/src/pulsecore/hashmap.h +++ b/src/pulsecore/hashmap.h @@ -26,7 +26,8 @@  /* Simple Implementation of a hash table. Memory management is the   * user's job. It's a good idea to have the key pointer point to a - * string in the value data. */ + * string in the value data. The insertion order is preserved when + * iterating. */  typedef struct pa_hashmap pa_hashmap; @@ -59,6 +60,9 @@ pa_bool_t pa_hashmap_isempty(pa_hashmap *h);     returned. */  void *pa_hashmap_iterate(pa_hashmap *h, void **state, const void**key); +/* Same as pa_hashmap_iterate() but goes backwards */ +void *pa_hashmap_iterate_backwards(pa_hashmap *h, void **state, const void**key); +  /* Remove the oldest entry in the hashmap and return it */  void *pa_hashmap_steal_first(pa_hashmap *h); @@ -69,4 +73,8 @@ void* pa_hashmap_first(pa_hashmap *h);  #define PA_HASHMAP_FOREACH(e, h, state) \      for ((state) = NULL, (e) = pa_hashmap_iterate((h), &(state), NULL); (e); (e) = pa_hashmap_iterate((h), &(state), NULL)) +/* A macro to ease iteration through all entries, backwards */ +#define PA_HASHMAP_FOREACH_BACKWARDS(e, h, state) \ +    for ((state) = NULL, (e) = pa_hashmap_iterate_backwards((h), &(state), NULL); (e); (e) = pa_hashmap_iterate_backwards((h), &(state), NULL)) +  #endif  | 
