9 #include <xtypes/domain.h>
13 * originally by gtsouk@cslab.ece.ntua.gr
14 * -- kkourt@cslab.ece.ntua.gr
17 typedef uint64_t xhashidx;
18 #define Noxhashidx ((xhashidx) -1)
20 #define XHASH_ERESIZE 1
21 #define XHASH_EEXIST 2
24 INTEGER = 0, /* signed/unsigned integers, pointers, etc */
25 STRING = 1 /* NULL terminated strings */
26 //OBJECT = 2, to be used later with objects
28 #define NR_XHASH_TYPES 2
32 xhashidx minsize_shift;
43 XPTR_TYPE(xhashidx) kvs;
45 typedef struct xhash xhash_t;
47 static inline xhashidx
48 xhash_elements(xhash_t *xhash)
53 static inline xhashidx
54 xhash_size(xhash_t *xhash)
56 return 1UL<<(xhash->size_shift);
59 static inline xhashidx *
60 xhash_kvs(xhash_t *xhash)
62 return XPTR(&xhash->kvs);
65 static inline xhashidx *
66 xhash_vals(xhash_t *xhash)
68 return XPTR(&xhash->kvs) + xhash_size(xhash);
72 #define ZEROSTAT(stat) (stat) = 0
73 #define INCSTAT(stat) (stat) ++
74 #define DECSTAT(stat) (stat) --
75 #define REPSTAT(stat) fprintf(stderr, "" # stat " = %lu \n" , stat)
77 #define ZEROSTAT(stat)
80 #define REPSTAT(stat) do { } while (0)
83 #define REPSTATS(x) do { \
84 REPSTAT(x->inserts); \
85 REPSTAT(x->deletes); \
86 REPSTAT(x->lookups); \
87 REPSTAT(x->bounces); \
93 * hash functions (dict)
96 xhashidx xhash_grow_size_shift(xhash_t *xhash);
97 xhashidx xhash_shrink_size_shift(xhash_t *xhash);
98 ssize_t xhash_get_alloc_size(xhashidx size_shift);
100 xhash_t *xhash_new(xhashidx minsize_shift, enum xhash_type type);
101 void xhash_free(xhash_t *xhash); // pairs with _new()
102 void xhash_init(struct xhash *xhash, xhashidx minsize_shift, enum xhash_type type);
104 xhash_t * xhash_resize(xhash_t *xhash, xhashidx new_size_shift, xhash_t *newxhash);
105 int xhash_insert(xhash_t *xhash, xhashidx key, xhashidx val);
106 int xhash_update(xhash_t *xhash, xhashidx key, xhashidx val);
107 int xhash_freql_update(xhash_t *xhash, xhashidx key, xhashidx val);
108 int xhash_delete(struct xhash *xhash, xhashidx key);
109 int xhash_lookup(xhash_t *xhash, xhashidx key, xhashidx *val);
112 xhashidx loc; /* location on the array */
113 xhashidx cnt; /* returned items */
115 typedef struct xhash_iter xhash_iter_t;
117 /* The iterators are read-only */
118 void xhash_iter_init(xhash_t *xhash, xhash_iter_t *pi);
119 int xhash_iterate(xhash_t *xhash, xhash_iter_t *pi, xhashidx *key, xhashidx *val);
121 void xhash_print(xhash_t *xhash);
123 /* no set functionality for now */
131 typedef struct pset pset_t;
133 static inline xhashidx
134 pset_elements(pset_t *pset)
136 return pset->ph_.used;
139 static inline xhashidx
140 pset_size(pset_t *pset)
142 return 1UL<<(pset->ph_.size_shift);
145 pset_t *pset_new(xhashidx minsize_shift); // returns an initialized pset
146 void pset_free(pset_t *pset); // goes with _new()
148 void pset_init(pset_t *pset, xhashidx minsize_shift);
149 void pset_tfree(pset_t *pset); // goes with _init()
151 void pset_insert(pset_t *pset, xhashidx key);
152 int pset_delete(pset_t *pset, xhashidx key);
153 bool pset_lookup(pset_t *pset, xhashidx key);
154 int pset_iterate(pset_t *pset, xhash_iter_t *pi, xhashidx *key);
155 void pset_print(pset_t *pset);
157 typedef xhash_iter_t pset_iter_t;
160 pset_iter_init(pset_t *pset, pset_iter_t *pi)
162 xhash_iter_init(&pset->ph_, pi);
169 // vim:expandtab:tabstop=8:shiftwidth=4:softtabstop=4