10 * originally by gtsouk@cslab.ece.ntua.gr
11 * -- kkourt@cslab.ece.ntua.gr
14 typedef unsigned long ul_t;
16 #define XHASH_ERESIZE 1
17 #define XHASH_EEXIST 2
33 typedef struct xhash xhash_t;
36 xhash_elements(xhash_t *xhash)
42 xhash_size(xhash_t *xhash)
44 return 1UL<<(xhash->size_shift);
48 xhash_kvs(xhash_t *xhash)
50 return XPTR(&xhash->kvs);
54 xhash_vals(xhash_t *xhash)
56 return XPTR(&xhash->kvs) + xhash_size(xhash);
60 #define ZEROSTAT(stat) (stat) = 0
61 #define INCSTAT(stat) (stat) ++
62 #define DECSTAT(stat) (stat) --
63 #define REPSTAT(stat) fprintf(stderr, "" # stat " = %lu \n" , stat)
65 #define ZEROSTAT(stat)
68 #define REPSTAT(stat) do { } while (0)
71 #define REPSTATS(x) do { \
72 REPSTAT(x->inserts); \
73 REPSTAT(x->deletes); \
74 REPSTAT(x->lookups); \
75 REPSTAT(x->bounces); \
81 * hash functions (dict)
84 ul_t grow_size_shift(xhash_t *xhash);
85 ul_t shrink_size_shift(xhash_t *xhash);
86 ssize_t xhash_get_alloc_size(ul_t size_shift);
88 xhash_t *xhash_new(ul_t minsize_shift);
89 void xhash_free(xhash_t *xhash); // pairs with _new()
90 void xhash_init(struct xhash *xhash, ul_t minsize_shift);
92 int xhash_resize(xhash_t *xhash, ul_t new_size_shift, xhash_t *new);
93 int xhash_insert(xhash_t *xhash, ul_t key, ul_t val);
94 int xhash_update(xhash_t *xhash, ul_t key, ul_t val);
95 int xhash_freql_update(xhash_t *xhash, ul_t key, ul_t val);
96 int xhash_delete(struct xhash *xhash, ul_t key);
97 int xhash_lookup(xhash_t *xhash, ul_t key, ul_t *val);
100 ul_t loc; /* location on the array */
101 ul_t cnt; /* returned items */
103 typedef struct xhash_iter xhash_iter_t;
105 /* The iterators are read-only */
106 void xhash_iter_init(xhash_t *xhash, xhash_iter_t *pi);
107 int xhash_iterate(xhash_t *xhash, xhash_iter_t *pi, ul_t *key, ul_t *val);
109 void xhash_print(xhash_t *xhash);
111 /* no set functionality for now */
119 typedef struct pset pset_t;
122 pset_elements(pset_t *pset)
124 return pset->ph_.used;
128 pset_size(pset_t *pset)
130 return 1UL<<(pset->ph_.size_shift);
133 pset_t *pset_new(ul_t minsize_shift); // returns an initialized pset
134 void pset_free(pset_t *pset); // goes with _new()
136 void pset_init(pset_t *pset, ul_t minsize_shift);
137 void pset_tfree(pset_t *pset); // goes with _init()
139 void pset_insert(pset_t *pset, ul_t key);
140 int pset_delete(pset_t *pset, ul_t key);
141 bool pset_lookup(pset_t *pset, ul_t key);
142 int pset_iterate(pset_t *pset, xhash_iter_t *pi, ul_t *key);
143 void pset_print(pset_t *pset);
145 typedef xhash_iter_t pset_iter_t;
148 pset_iter_init(pset_t *pset, pset_iter_t *pi)
150 xhash_iter_init(&pset->ph_, pi);
157 // vim:expandtab:tabstop=8:shiftwidth=4:softtabstop=4