Lines Matching refs:head

139 #define HASH_ROLLBACK_BKT(hh, head, itemptrhh)                                   \
143 HASH_TO_BKT(_hd_hh_item->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \
144 (head)->hh.tbl->buckets[_hd_bkt].count++; \
154 #define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out) \
157 if (head) { \
159 HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt); \
160 if (HASH_BLOOM_TEST((head)->hh.tbl, hashval) != 0) { \
161 HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \
166 #define HASH_FIND(hh,head,keyptr,keylen,out) \
169 if (head) { \
172 HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out); \
213 #define HASH_MAKE_TABLE(hh,head,oomed) \
215 (head)->hh.tbl = (UT_hash_table*)uthash_malloc(sizeof(UT_hash_table)); \
216 if (!(head)->hh.tbl) { \
219 uthash_bzero((head)->hh.tbl, sizeof(UT_hash_table)); \
220 (head)->hh.tbl->tail = &((head)->hh); \
221 (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \
222 (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \
223 (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \
224 (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \
226 (head)->hh.tbl->signature = HASH_SIGNATURE; \
227 if (!(head)->hh.tbl->buckets) { \
229 uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
231 uthash_bzero((head)->hh.tbl->buckets, \
233 HASH_BLOOM_MAKE((head)->hh.tbl, oomed); \
236 uthash_free((head)->hh.tbl->buckets, \
238 uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
245 #define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \
248 HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \
250 HASH_DELETE(hh, head, replaced); \
252 HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \
255 #define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \
258 HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \
260 HASH_DELETE(hh, head, replaced); \
262 HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \
265 #define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \
269 HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \
272 #define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn) \
276 HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \
279 #define HASH_APPEND_LIST(hh, head, add) \
282 (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \
283 (head)->hh.tbl->tail->next = (add); \
284 (head)->hh.tbl->tail = &((add)->hh); \
287 #define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \
290 if (cmpfcn(DECLTYPE(head)(_hs_iter), add) > 0) { \
293 } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \
298 #define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \
300 char *_hs_saved_head = (char*)(head); \
302 DECLTYPE_ASSIGN(head, _hs_iter); \
303 if (cmpfcn(head, add) > 0) { \
304 DECLTYPE_ASSIGN(head, _hs_saved_head); \
307 DECLTYPE_ASSIGN(head, _hs_saved_head); \
308 } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \
314 #define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed) \
318 (head)->hh.tbl->num_items++; \
319 HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \
320 HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed); \
322 HASH_ROLLBACK_BKT(hh, head, &(add)->hh); \
323 HASH_DELETE_HH(hh, head, &(add)->hh); \
327 HASH_BLOOM_ADD((head)->hh.tbl, hashval); \
328 HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \
338 #define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed) \
341 (head)->hh.tbl->num_items++; \
342 HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \
343 HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed); \
344 HASH_BLOOM_ADD((head)->hh.tbl, hashval); \
345 HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \
351 #define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \
357 if (!(head)) { \
362 (head) = (add); \
365 void *_hs_iter = (head); \
366 (add)->hh.tbl = (head)->hh.tbl; \
367 HASH_AKBI_INNER_LOOP(hh, head, add, cmpfcn); \
370 if (((add)->hh.prev = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev)) { \
371 HH_FROM_ELMT((head)->hh.tbl, (add)->hh.prev)->next = (add); \
373 (head) = (add); \
375 HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev = (add); \
377 HASH_APPEND_LIST(hh, head, add); \
380 HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed); \
381 HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE_INORDER"); \
384 #define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn) \
388 HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \
391 #define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \
392 HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn)
394 #define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn) \
395 HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn)
397 #define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add) \
403 if (!(head)) { \
408 (head) = (add); \
411 (add)->hh.tbl = (head)->hh.tbl; \
412 HASH_APPEND_LIST(hh, head, add); \
414 HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed); \
415 HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE"); \
418 #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \
422 HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add); \
425 #define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add) \
426 HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add)
428 #define HASH_ADD(hh,head,fieldname,keylen_in,add) \
429 HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add)
440 * if someone used the same symbol for the head and deletee, like
442 * We want that to work, but by changing the head (users) below
448 #define HASH_DELETE(hh,head,delptr) \
449 HASH_DELETE_HH(hh, head, &(delptr)->hh)
451 #define HASH_DELETE_HH(hh,head,delptrhh) \
455 HASH_BLOOM_FREE((head)->hh.tbl); \
456 uthash_free((head)->hh.tbl->buckets, \
457 (head)->hh.tbl->num_buckets * sizeof(struct UT_hash_bucket)); \
458 uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
459 (head) = NULL; \
462 if (_hd_hh_del == (head)->hh.tbl->tail) { \
463 (head)->hh.tbl->tail = HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev); \
466 HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev)->next = _hd_hh_del->next; \
468 DECLTYPE_ASSIGN(head, _hd_hh_del->next); \
471 HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->next)->prev = _hd_hh_del->prev; \
473 HASH_TO_BKT(_hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \
474 HASH_DEL_IN_BKT((head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \
475 (head)->hh.tbl->num_items--; \
477 HASH_FSCK(hh, head, "HASH_DELETE_HH"); \
481 #define HASH_FIND_STR(head,findstr,out) \
484 HASH_FIND(hh, head, findstr, _uthash_hfstr_keylen, out); \
486 #define HASH_ADD_STR(head,strfield,add) \
489 HASH_ADD(hh, head, strfield[0], _uthash_hastr_keylen, add); \
491 #define HASH_REPLACE_STR(head,strfield,add,replaced) \
494 HASH_REPLACE(hh, head, strfield[0], _uthash_hrstr_keylen, add, replaced); \
496 #define HASH_FIND_INT(head,findint,out) \
497 HASH_FIND(hh,head,findint,sizeof(int),out)
498 #define HASH_ADD_INT(head,intfield,add) \
499 HASH_ADD(hh,head,intfield,sizeof(int),add)
500 #define HASH_REPLACE_INT(head,intfield,add,replaced) \
501 HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced)
502 #define HASH_FIND_PTR(head,findptr,out) \
503 HASH_FIND(hh,head,findptr,sizeof(void *),out)
504 #define HASH_ADD_PTR(head,ptrfield,add) \
505 HASH_ADD(hh,head,ptrfield,sizeof(void *),add)
506 #define HASH_REPLACE_PTR(head,ptrfield,add,replaced) \
507 HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced)
508 #define HASH_DEL(head,delptr) \
509 HASH_DELETE(hh,head,delptr)
517 #define HASH_FSCK(hh,head,where) \
520 if (head) { \
524 for (_bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; ++_bkt_i) { \
526 _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \
538 if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \
540 (where), (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \
543 if (_count != (head)->hh.tbl->num_items) { \
545 (where), (head)->hh.tbl->num_items, _count); \
549 _thh = &(head)->hh; \
556 _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \
557 _thh = (_thh->next ? HH_FROM_ELMT((head)->hh.tbl, _thh->next) : NULL); \
559 if (_count != (head)->hh.tbl->num_items) { \
561 (where), (head)->hh.tbl->num_items, _count); \
566 #define HASH_FSCK(hh,head,where)
573 #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \
580 #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)
744 #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out) \
746 if ((head).hh_head != NULL) { \
747 DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (head).hh_head)); \
766 #define HASH_ADD_TO_BKT(head,hh,addhh,oomed) \
768 UT_hash_bucket *_ha_head = &(head); \
781 HASH_DEL_IN_BKT(head,addhh); \
788 #define HASH_DEL_IN_BKT(head,delhh) \
790 UT_hash_bucket *_hd_head = &(head); \
888 #define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)
889 #define HASH_SRT(hh,head,cmpfcn) \
894 if (head != NULL) { \
897 _hs_list = &((head)->hh); \
910 HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \
920 HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \
926 HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \
930 DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_p)), \
931 DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_q)) \
936 HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \
942 HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \
947 ELMT_FROM_HH((head)->hh.tbl, _hs_e) : NULL); \
953 ELMT_FROM_HH((head)->hh.tbl, _hs_tail) : NULL); \
964 (head)->hh.tbl->tail = _hs_tail; \
965 DECLTYPE_ASSIGN(head, ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \
969 HASH_FSCK(hh, head, "HASH_SRT"); \
1036 #define HASH_CLEAR(hh,head) \
1038 if ((head) != NULL) { \
1039 HASH_BLOOM_FREE((head)->hh.tbl); \
1040 uthash_free((head)->hh.tbl->buckets, \
1041 (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \
1042 uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
1043 (head) = NULL; \
1047 #define HASH_OVERHEAD(hh,head) \
1048 (((head) != NULL) ? ( \
1049 (size_t)(((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \
1050 ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \
1055 #define HASH_ITER(hh,head,el,tmp) \
1056 for(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \
1059 #define HASH_ITER(hh,head,el,tmp) \
1060 for(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL)); \
1065 #define HASH_COUNT(head) HASH_CNT(hh,head)
1066 #define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U)