9 #include <xtypes/domain.h>
13 * originally by gtsouk@cslab.ece.ntua.gr
14 * -- kkourt@cslab.ece.ntua.gr
17 typedef unsigned long ul_t;
19 #define XHASH_ERESIZE 1
20 #define XHASH_EEXIST 2
36 typedef struct xhash xhash_t;
39 xhash_elements(xhash_t *xhash)
45 xhash_size(xhash_t *xhash)
47 return 1UL<<(xhash->size_shift);
51 xhash_kvs(xhash_t *xhash)
53 return XPTR(&xhash->kvs);
57 xhash_vals(xhash_t *xhash)
59 return XPTR(&xhash->kvs) + xhash_size(xhash);
63 #define ZEROSTAT(stat) (stat) = 0
64 #define INCSTAT(stat) (stat) ++
65 #define DECSTAT(stat) (stat) --
66 #define REPSTAT(stat) fprintf(stderr, "" # stat " = %lu \n" , stat)
68 #define ZEROSTAT(stat)
71 #define REPSTAT(stat) do { } while (0)
74 #define REPSTATS(x) do { \
75 REPSTAT(x->inserts); \
76 REPSTAT(x->deletes); \
77 REPSTAT(x->lookups); \
78 REPSTAT(x->bounces); \
84 * hash functions (dict)
87 ul_t grow_size_shift(xhash_t *xhash);
88 ul_t shrink_size_shift(xhash_t *xhash);
89 ssize_t xhash_get_alloc_size(ul_t size_shift);
91 xhash_t *xhash_new(ul_t minsize_shift);
92 void xhash_free(xhash_t *xhash); // pairs with _new()
93 void xhash_init(struct xhash *xhash, ul_t minsize_shift);
95 int xhash_resize(xhash_t *xhash, ul_t new_size_shift, xhash_t *newxhash);
96 int xhash_insert(xhash_t *xhash, ul_t key, ul_t val);
97 int xhash_update(xhash_t *xhash, ul_t key, ul_t val);
98 int xhash_freql_update(xhash_t *xhash, ul_t key, ul_t val);
99 int xhash_delete(struct xhash *xhash, ul_t key);
100 int xhash_lookup(xhash_t *xhash, ul_t key, ul_t *val);
103 ul_t loc; /* location on the array */
104 ul_t cnt; /* returned items */
106 typedef struct xhash_iter xhash_iter_t;
108 /* The iterators are read-only */
109 void xhash_iter_init(xhash_t *xhash, xhash_iter_t *pi);
110 int xhash_iterate(xhash_t *xhash, xhash_iter_t *pi, ul_t *key, ul_t *val);
112 void xhash_print(xhash_t *xhash);
114 /* no set functionality for now */
122 typedef struct pset pset_t;
125 pset_elements(pset_t *pset)
127 return pset->ph_.used;
131 pset_size(pset_t *pset)
133 return 1UL<<(pset->ph_.size_shift);
136 pset_t *pset_new(ul_t minsize_shift); // returns an initialized pset
137 void pset_free(pset_t *pset); // goes with _new()
139 void pset_init(pset_t *pset, ul_t minsize_shift);
140 void pset_tfree(pset_t *pset); // goes with _init()
142 void pset_insert(pset_t *pset, ul_t key);
143 int pset_delete(pset_t *pset, ul_t key);
144 bool pset_lookup(pset_t *pset, ul_t key);
145 int pset_iterate(pset_t *pset, xhash_iter_t *pi, ul_t *key);
146 void pset_print(pset_t *pset);
148 typedef xhash_iter_t pset_iter_t;
151 pset_iter_init(pset_t *pset, pset_iter_t *pi)
153 xhash_iter_init(&pset->ph_, pi);
160 // vim:expandtab:tabstop=8:shiftwidth=4:softtabstop=4