Lines Matching refs:hh
119 #define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out) \
124 HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt); \
125 if (HASH_BLOOM_TEST((head)->hh.tbl, hashval) != 0) { \
126 HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \
131 #define HASH_FIND(hh,head,keyptr,keylen,out) \
135 HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out); \
172 #define HASH_MAKE_TABLE(hh,head) \
174 (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \
176 if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \
177 memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \
178 (head)->hh.tbl->tail = &((head)->hh); \
179 (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \
180 (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \
181 (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \
182 (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \
184 if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \
185 memset((head)->hh.tbl->buckets, 0, \
187 HASH_BLOOM_MAKE((head)->hh.tbl); \
188 (head)->hh.tbl->signature = HASH_SIGNATURE; \
191 #define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \
194 HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \
196 HASH_DELETE(hh, head, replaced); \
198 HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \
201 #define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \
204 HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \
206 HASH_DELETE(hh, head, replaced); \
208 HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \
211 #define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \
215 HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \
218 #define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn) \
222 HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \
225 #define HASH_APPEND_LIST(hh, head, add) \
227 (add)->hh.next = NULL; \
228 (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \
229 (head)->hh.tbl->tail->next = (add); \
230 (head)->hh.tbl->tail = &((add)->hh); \
233 #define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \
236 (add)->hh.hashv = (hashval); \
237 (add)->hh.key = (char*) (keyptr); \
238 (add)->hh.keylen = (unsigned) (keylen_in); \
240 (add)->hh.next = NULL; \
241 (add)->hh.prev = NULL; \
243 HASH_MAKE_TABLE(hh, head); \
245 struct UT_hash_handle *_hs_iter = &(head)->hh; \
246 (add)->hh.tbl = (head)->hh.tbl; \
248 if (cmpfcn(DECLTYPE(head) ELMT_FROM_HH((head)->hh.tbl, _hs_iter), add) > 0) \
252 (add)->hh.next = _hs_iter; \
253 if (((add)->hh.prev = _hs_iter->prev)) { \
254 HH_FROM_ELMT((head)->hh.tbl, _hs_iter->prev)->next = (add); \
260 HASH_APPEND_LIST(hh, head, add); \
263 (head)->hh.tbl->num_items++; \
264 HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \
265 HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh); \
266 HASH_BLOOM_ADD((head)->hh.tbl, hashval); \
267 HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \
268 HASH_FSCK(hh, head); \
271 #define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn) \
275 HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \
278 #define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \
279 HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn)
281 #define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn) \
282 HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn)
284 #define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add) \
287 (add)->hh.hashv = (hashval); \
288 (add)->hh.key = (char*) (keyptr); \
289 (add)->hh.keylen = (unsigned) (keylen_in); \
291 (add)->hh.next = NULL; \
292 (add)->hh.prev = NULL; \
294 HASH_MAKE_TABLE(hh, head); \
296 (add)->hh.tbl = (head)->hh.tbl; \
297 HASH_APPEND_LIST(hh, head, add); \
299 (head)->hh.tbl->num_items++; \
300 HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \
301 HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh); \
302 HASH_BLOOM_ADD((head)->hh.tbl, hashval); \
303 HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \
304 HASH_FSCK(hh, head); \
307 #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \
311 HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add); \
314 #define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add) \
315 HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add)
317 #define HASH_ADD(hh,head,fieldname,keylen_in,add) \
318 HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add)
330 * HASH_DELETE(hh,users,users);
337 #define HASH_DELETE(hh,head,delptr) \
340 if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \
341 uthash_free((head)->hh.tbl->buckets, \
342 (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \
343 HASH_BLOOM_FREE((head)->hh.tbl); \
344 uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
348 _hd_hh_del = &((delptr)->hh); \
349 if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \
350 (head)->hh.tbl->tail = \
351 (UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) + \
352 (head)->hh.tbl->hho); \
354 if ((delptr)->hh.prev != NULL) { \
355 ((UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) + \
356 (head)->hh.tbl->hho))->next = (delptr)->hh.next; \
358 DECLTYPE_ASSIGN(head,(delptr)->hh.next); \
362 (head)->hh.tbl->hho))->prev = \
365 HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \
366 HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \
367 (head)->hh.tbl->num_items--; \
369 HASH_FSCK(hh,head); \
375 HASH_FIND(hh,head,findstr,(unsigned)uthash_strlen(findstr),out)
377 HASH_ADD(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add)
379 HASH_REPLACE(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add,replaced)
381 HASH_FIND(hh,head,findint,sizeof(int),out)
383 HASH_ADD(hh,head,intfield,sizeof(int),add)
385 HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced)
387 HASH_FIND(hh,head,findptr,sizeof(void *),out)
389 HASH_ADD(hh,head,ptrfield,sizeof(void *),add)
391 HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced)
393 HASH_DELETE(hh,head,delptr)
400 #define HASH_FSCK(hh,head) \
408 for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \
410 _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \
422 if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \
424 (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \
427 if (_count != (head)->hh.tbl->num_items) { \
428 HASH_OOPS("invalid hh item count %u, actual %u\n", \
429 (head)->hh.tbl->num_items, _count ); \
431 /* traverse hh in app order; check next/prev integrity, count */ \
434 _thh = &(head)->hh; \
441 _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \
443 (head)->hh.tbl->hho) : NULL ); \
445 if (_count != (head)->hh.tbl->num_items) { \
447 (head)->hh.tbl->num_items, _count ); \
452 #define HASH_FSCK(hh,head)
459 #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \
466 #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)
714 #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out) \
722 if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) { \
723 if (uthash_memcmp((out)->hh.key, keyptr, keylen_in) == 0) { \
727 if ((out)->hh.hh_next != NULL) { \
728 DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (out)->hh.hh_next)); \
750 #define HASH_DEL_IN_BKT(hh,head,hh_del) \
841 /* Note that HASH_SORT assumes the hash handle name to be hh.
843 #define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)
844 #define HASH_SRT(hh,head,cmpfcn) \
852 _hs_list = &((head)->hh); \
866 (head)->hh.tbl->hho)) : NULL); \
875 (head)->hh.tbl->hho)) : NULL); \
882 (head)->hh.tbl->hho)) : NULL); \
886 cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \
887 DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \
893 (head)->hh.tbl->hho)) : NULL); \
900 (head)->hh.tbl->hho)) : NULL); \
905 ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \
911 ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \
922 (head)->hh.tbl->tail = _hs_tail; \
923 DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \
927 HASH_FSCK(hh,head); \
974 #define HASH_CLEAR(hh,head) \
977 uthash_free((head)->hh.tbl->buckets, \
978 (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \
979 HASH_BLOOM_FREE((head)->hh.tbl); \
980 uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
985 #define HASH_OVERHEAD(hh,head) \
987 (size_t)(((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \
988 ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \
993 #define HASH_ITER(hh,head,el,tmp) \
994 for(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \
995 (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL)))
997 #define HASH_ITER(hh,head,el,tmp) \
998 for(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL)); \
999 (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL)))
1003 #define HASH_COUNT(head) HASH_CNT(hh,head)
1004 #define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U)
1034 struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
1067 struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
1068 struct UT_hash_handle *hh_next; /* next hh in bucket order */