Git init
[framework/multimedia/pulseaudio.git] / src / pulsecore / hashmap.h
1 #ifndef foopulsecorehashmaphfoo
2 #define foopulsecorehashmaphfoo
3
4 /***
5   This file is part of PulseAudio.
6
7   Copyright 2004-2008 Lennart Poettering
8
9   PulseAudio is free software; you can redistribute it and/or modify
10   it under the terms of the GNU Lesser General Public License as published
11   by the Free Software Foundation; either version 2.1 of the License,
12   or (at your option) any later version.
13
14   PulseAudio is distributed in the hope that it will be useful, but
15   WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   General Public License for more details.
18
19   You should have received a copy of the GNU Lesser General Public License
20   along with PulseAudio; if not, write to the Free Software
21   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22   USA.
23 ***/
24
25 #include <pulsecore/idxset.h>
26
27 /* Simple Implementation of a hash table. Memory management is the
28  * user's job. It's a good idea to have the key pointer point to a
29  * string in the value data. The insertion order is preserved when
30  * iterating. */
31
32 typedef struct pa_hashmap pa_hashmap;
33
34 /* Create a new hashmap. Use the specified functions for hashing and comparing objects in the map */
35 pa_hashmap *pa_hashmap_new(pa_hash_func_t hash_func, pa_compare_func_t compare_func);
36
37 /* Free the hash table. Calls the specified function for every value in the table. The function may be NULL */
38 void pa_hashmap_free(pa_hashmap*, pa_free2_cb_t free_cb, void *userdata);
39
40 /* Add an entry to the hashmap. Returns non-zero when the entry already exists */
41 int pa_hashmap_put(pa_hashmap *h, const void *key, void *value);
42
43 /* Return an entry from the hashmap */
44 void* pa_hashmap_get(pa_hashmap *h, const void *key);
45
46 /* Returns the data of the entry while removing */
47 void* pa_hashmap_remove(pa_hashmap *h, const void *key);
48
49 /* Return the current number of entries of the hashmap */
50 unsigned pa_hashmap_size(pa_hashmap *h);
51
52 /* Return TRUE if the hashmap is empty */
53 pa_bool_t pa_hashmap_isempty(pa_hashmap *h);
54
55 /* May be used to iterate through the hashmap. Initially the opaque
56    pointer *state has to be set to NULL. The hashmap may not be
57    modified during iteration -- except for deleting the current entry
58    via pa_hashmap_remove(). The key of the entry is returned in *key,
59    if key is non-NULL. After the last entry in the hashmap NULL is
60    returned. */
61 void *pa_hashmap_iterate(pa_hashmap *h, void **state, const void**key);
62
63 /* Same as pa_hashmap_iterate() but goes backwards */
64 void *pa_hashmap_iterate_backwards(pa_hashmap *h, void **state, const void**key);
65
66 /* Remove the oldest entry in the hashmap and return it */
67 void *pa_hashmap_steal_first(pa_hashmap *h);
68
69 /* Return the oldest entry in the hashmap */
70 void* pa_hashmap_first(pa_hashmap *h);
71
72 /* Return the newest entry in the hashmap */
73 void* pa_hashmap_last(pa_hashmap *h);
74
75 /* A macro to ease iteration through all entries */
76 #define PA_HASHMAP_FOREACH(e, h, state) \
77     for ((state) = NULL, (e) = pa_hashmap_iterate((h), &(state), NULL); (e); (e) = pa_hashmap_iterate((h), &(state), NULL))
78
79 /* A macro to ease iteration through all entries, backwards */
80 #define PA_HASHMAP_FOREACH_BACKWARDS(e, h, state) \
81     for ((state) = NULL, (e) = pa_hashmap_iterate_backwards((h), &(state), NULL); (e); (e) = pa_hashmap_iterate_backwards((h), &(state), NULL))
82
83 #endif