Add test case for htable_traverse
[eleutheria.git] / genstructs / htable / htable.h
blob34e1bfde67692a519f9a7ccced8cac88aa63f0d3
1 #ifndef HTABLE_H
2 #define HTABLE_H
4 #include <sys/queue.h>
5 #include <stddef.h> /* for size_t type */
7 typedef struct hnode {
8 void *hn_key;
9 void *hn_data;
10 TAILQ_ENTRY(hnode) hn_next;
11 } hnode_t;
13 typedef struct htable {
14 size_t ht_size; /* size must be a power of 2 */
15 unsigned int ht_used;
16 unsigned int ht_factor;
17 unsigned int ht_limit;
18 unsigned int (*ht_hashf)(const void *key);
19 int (*ht_cmpf)(const void *arg1, const void *arg2);
20 void (*ht_printf)(const void *key, const void *data);
21 TAILQ_HEAD(htablehead, hnode) *ht_table;
22 } htable_t;
24 typedef struct htablehead hhead_t;
26 typedef enum {
27 HT_OK,
28 HT_EXISTS,
29 HT_NOMEM,
30 HT_NOTFOUND
31 } htret_t;
33 typedef enum {
34 HT_FREEKEY = 1,
35 HT_FREEDATA = 2
36 } htfree_t;
38 /* Function prototypes */
39 htret_t htable_init(htable_t *htable, size_t size, unsigned int factor,
40 unsigned int (*myhashf)(const void *key),
41 int (*mycmpf)(const void *arg1, const void *arg2),
42 void (*myprintf)(const void *key, const void *data));
43 void htable_free(htable_t *htable);
44 htret_t htable_free_obj(htable_t *htable, void *key, htfree_t htfree);
45 void htable_free_all_obj(htable_t *htable, htfree_t htfree);
46 htret_t htable_grow(htable_t *htable);
47 htret_t htable_insert(htable_t *htable, void *key, void *data);
48 htret_t htable_remove(htable_t *htable, const void *key);
49 void *htable_search(const htable_t *htable, const void *key);
50 void htable_print(const htable_t *htable);
51 size_t htable_get_size(const htable_t *htable);
52 unsigned int htable_get_used(const htable_t *htable);
53 void htable_traverse(const htable_t *htable, void (*pfunc)(void *data));
55 #endif /* HTABLE_H */