1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #ifndef UTHASH_H
25 #define UTHASH_H
26
27 #include <string.h>
28 #include <stddef.h>
29 #include <stdlib.h>
30
31
32
33
34
35 #ifdef _MSC_VER
36 #if _MSC_VER >= 1600 && defined(__cplusplus)
37 #define DECLTYPE(x) (decltype(x))
38 #else
39 #define NO_DECLTYPE
40 #define DECLTYPE(x)
41 #endif
42 #else
43 #define DECLTYPE(x) (__typeof(x))
44 #endif
45
46 #ifdef NO_DECLTYPE
47 #define DECLTYPE_ASSIGN(dst,src) \
48 do { \
49 char **_da_dst = (char**)(&(dst)); \
50 *_da_dst = (char*)(src); \
51 } while(0)
52 #else
53 #define DECLTYPE_ASSIGN(dst,src) \
54 do { \
55 (dst) = DECLTYPE(dst)(src); \
56 } while(0)
57 #endif
58
59
60 #ifdef _MSC_VER
61 typedef unsigned int uint32_t;
62 typedef unsigned char uint8_t;
63 #else
64 #include <inttypes.h>
65 #endif
66
67 #define UTHASH_VERSION 1.9.4
68
69 #define uthash_fatal(msg) exit(-1)
70 #define uthash_malloc(sz) malloc(sz)
71 #define uthash_free(ptr,sz) free(ptr)
72
73 #define uthash_noexpand_fyi(tbl)
74 #define uthash_expand_fyi(tbl)
75
76
77 #define HASH_INITIAL_NUM_BUCKETS 32
78 #define HASH_INITIAL_NUM_BUCKETS_LOG2 5
79 #define HASH_BKT_CAPACITY_THRESH 10
80
81
82 #define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho)))
83
84 #define HASH_FIND(hh,head,keyptr,keylen,out) \
85 do { \
86 unsigned _hf_bkt,_hf_hashv; \
87 out=NULL; \
88 if (head) { \
89 HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \
90 if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv)) { \
91 HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \
92 keyptr,keylen,out); \
93 } \
94 } \
95 } while (0)
96
97 #ifdef HASH_BLOOM
98 #define HASH_BLOOM_BITLEN (1ULL << HASH_BLOOM)
99 #define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8) + ((HASH_BLOOM_BITLEN%8) ? 1:0)
100 #define HASH_BLOOM_MAKE(tbl) \
101 do { \
102 (tbl)->bloom_nbits = HASH_BLOOM; \
103 (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \
104 if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \
105 memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \
106 (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \
107 } while (0);
108
109 #define HASH_BLOOM_FREE(tbl) \
110 do { \
111 uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \
112 } while (0);
113
114 #define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8] |= (1U << ((idx)%8)))
115 #define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8] & (1U << ((idx)%8)))
116
117 #define HASH_BLOOM_ADD(tbl,hashv) \
118 HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1)))
119
120 #define HASH_BLOOM_TEST(tbl,hashv) \
121 HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1)))
122
123 #else
124 #define HASH_BLOOM_MAKE(tbl)
125 #define HASH_BLOOM_FREE(tbl)
126 #define HASH_BLOOM_ADD(tbl,hashv)
127 #define HASH_BLOOM_TEST(tbl,hashv) (1)
128 #endif
129
130 #define HASH_MAKE_TABLE(hh,head) \
131 do { \
132 (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \
133 sizeof(UT_hash_table)); \
134 if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \
135 memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \
136 (head)->hh.tbl->tail = &((head)->hh); \
137 (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \
138 (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \
139 (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \
140 (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \
141 HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \
142 if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \
143 memset((head)->hh.tbl->buckets, 0, \
144 HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \
145 HASH_BLOOM_MAKE((head)->hh.tbl); \
146 (head)->hh.tbl->signature = HASH_SIGNATURE; \
147 } while(0)
148
149 #define HASH_ADD(hh,head,fieldname,keylen_in,add) \
150 HASH_ADD_KEYPTR(hh,head,&((add)->fieldname),keylen_in,add)
151
152 #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \
153 do { \
154 unsigned _ha_bkt; \
155 (add)->hh.next = NULL; \
156 (add)->hh.key = (char*)keyptr; \
157 (add)->hh.keylen = keylen_in; \
158 if (!(head)) { \
159 head = (add); \
160 (head)->hh.prev = NULL; \
161 HASH_MAKE_TABLE(hh,head); \
162 } else { \
163 (head)->hh.tbl->tail->next = (add); \
164 (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \
165 (head)->hh.tbl->tail = &((add)->hh); \
166 } \
167 (head)->hh.tbl->num_items++; \
168 (add)->hh.tbl = (head)->hh.tbl; \
169 HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \
170 (add)->hh.hashv, _ha_bkt); \
171 HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \
172 HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \
173 HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \
174 HASH_FSCK(hh,head); \
175 } while(0)
176
177 #define HASH_TO_BKT( hashv, num_bkts, bkt ) \
178 do { \
179 bkt = ((hashv) & ((num_bkts) - 1)); \
180 } while(0)
181
182
183
184
185
186
187
188
189
190
191
192
193
194 #define HASH_DELETE(hh,head,delptr) \
195 do { \
196 unsigned _hd_bkt; \
197 struct UT_hash_handle *_hd_hh_del; \
198 if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) ) { \
199 uthash_free((head)->hh.tbl->buckets, \
200 (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \
201 HASH_BLOOM_FREE((head)->hh.tbl); \
202 uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
203 head = NULL; \
204 } else { \
205 _hd_hh_del = &((delptr)->hh); \
206 if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) { \
207 (head)->hh.tbl->tail = \
208 (UT_hash_handle*)((char*)((delptr)->hh.prev) + \
209 (head)->hh.tbl->hho); \
210 } \
211 if ((delptr)->hh.prev) { \
212 ((UT_hash_handle*)((char*)((delptr)->hh.prev) + \
213 (head)->hh.tbl->hho))->next = (delptr)->hh.next; \
214 } else { \
215 DECLTYPE_ASSIGN(head,(delptr)->hh.next); \
216 } \
217 if (_hd_hh_del->next) { \
218 ((UT_hash_handle*)((char*)_hd_hh_del->next + \
219 (head)->hh.tbl->hho))->prev = \
220 _hd_hh_del->prev; \
221 } \
222 HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \
223 HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \
224 (head)->hh.tbl->num_items--; \
225 } \
226 HASH_FSCK(hh,head); \
227 } while (0)
228
229
230
231 #define HASH_FIND_STR(head,findstr,out) \
232 HASH_FIND(hh,head,findstr,strlen(findstr),out)
233 #define HASH_ADD_STR(head,strfield,add) \
234 HASH_ADD(hh,head,strfield,strlen(add->strfield),add)
235 #define HASH_FIND_INT(head,findint,out) \
236 HASH_FIND(hh,head,findint,sizeof(int),out)
237 #define HASH_ADD_INT(head,intfield,add) \
238 HASH_ADD(hh,head,intfield,sizeof(int),add)
239 #define HASH_FIND_PTR(head,findptr,out) \
240 HASH_FIND(hh,head,findptr,sizeof(void *),out)
241 #define HASH_ADD_PTR(head,ptrfield,add) \
242 HASH_ADD(hh,head,ptrfield,sizeof(void *),add)
243 #define HASH_DEL(head,delptr) \
244 HASH_DELETE(hh,head,delptr)
245
246
247
248
249 #ifdef HASH_DEBUG
250 #define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0)
251 #define HASH_FSCK(hh,head) \
252 do { \
253 unsigned _bkt_i; \
254 unsigned _count, _bkt_count; \
255 char *_prev; \
256 struct UT_hash_handle *_thh; \
257 if (head) { \
258 _count = 0; \
259 for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \
260 _bkt_count = 0; \
261 _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \
262 _prev = NULL; \
263 while (_thh) { \
264 if (_prev != (char*)(_thh->hh_prev)) { \
265 HASH_OOPS("invalid hh_prev %p, actual %p\n", \
266 _thh->hh_prev, _prev ); \
267 } \
268 _bkt_count++; \
269 _prev = (char*)(_thh); \
270 _thh = _thh->hh_next; \
271 } \
272 _count += _bkt_count; \
273 if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \
274 HASH_OOPS("invalid bucket count %d, actual %d\n", \
275 (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \
276 } \
277 } \
278 if (_count != (head)->hh.tbl->num_items) { \
279 HASH_OOPS("invalid hh item count %d, actual %d\n", \
280 (head)->hh.tbl->num_items, _count ); \
281 } \
282 \
283 _count = 0; \
284 _prev = NULL; \
285 _thh = &(head)->hh; \
286 while (_thh) { \
287 _count++; \
288 if (_prev !=(char*)(_thh->prev)) { \
289 HASH_OOPS("invalid prev %p, actual %p\n", \
290 _thh->prev, _prev ); \
291 } \
292 _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \
293 _thh = ( _thh->next ? (UT_hash_handle*)((char*)(_thh->next) + \
294 (head)->hh.tbl->hho) : NULL ); \
295 } \
296 if (_count != (head)->hh.tbl->num_items) { \
297 HASH_OOPS("invalid app item count %d, actual %d\n", \
298 (head)->hh.tbl->num_items, _count ); \
299 } \
300 } \
301 } while (0)
302 #else
303 #define HASH_FSCK(hh,head)
304 #endif
305
306
307
308
309 #ifdef HASH_EMIT_KEYS
310 #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \
311 do { \
312 unsigned _klen = fieldlen; \
313 write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \
314 write(HASH_EMIT_KEYS, keyptr, fieldlen); \
315 } while (0)
316 #else
317 #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)
318 #endif
319
320
321 #ifdef HASH_FUNCTION
322 #define HASH_FCN HASH_FUNCTION
323 #else
324 #define HASH_FCN HASH_JEN
325 #endif
326
327
328 #define HASH_BER(key,keylen,num_bkts,hashv,bkt) \
329 do { \
330 unsigned _hb_keylen=keylen; \
331 char *_hb_key=(char*)(key); \
332 (hashv) = 0; \
333 while (_hb_keylen--) { (hashv) = ((hashv) * 33) + *_hb_key++; } \
334 bkt = (hashv) & (num_bkts-1); \
335 } while (0)
336
337
338
339
340 #define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \
341 do { \
342 unsigned _sx_i; \
343 char *_hs_key=(char*)(key); \
344 hashv = 0; \
345 for(_sx_i=0; _sx_i < keylen; _sx_i++) \
346 hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \
347 bkt = hashv & (num_bkts-1); \
348 } while (0)
349
350 #define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \
351 do { \
352 unsigned _fn_i; \
353 char *_hf_key=(char*)(key); \
354 hashv = 2166136261UL; \
355 for(_fn_i=0; _fn_i < keylen; _fn_i++) \
356 hashv = (hashv * 16777619) ^ _hf_key[_fn_i]; \
357 bkt = hashv & (num_bkts-1); \
358 } while(0);
359
360 #define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \
361 do { \
362 unsigned _ho_i; \
363 char *_ho_key=(char*)(key); \
364 hashv = 0; \
365 for(_ho_i=0; _ho_i < keylen; _ho_i++) { \
366 hashv += _ho_key[_ho_i]; \
367 hashv += (hashv << 10); \
368 hashv ^= (hashv >> 6); \
369 } \
370 hashv += (hashv << 3); \
371 hashv ^= (hashv >> 11); \
372 hashv += (hashv << 15); \
373 bkt = hashv & (num_bkts-1); \
374 } while(0)
375
376 #define HASH_JEN_MIX(a,b,c) \
377 do { \
378 a -= b; a -= c; a ^= ( c >> 13 ); \
379 b -= c; b -= a; b ^= ( a << 8 ); \
380 c -= a; c -= b; c ^= ( b >> 13 ); \
381 a -= b; a -= c; a ^= ( c >> 12 ); \
382 b -= c; b -= a; b ^= ( a << 16 ); \
383 c -= a; c -= b; c ^= ( b >> 5 ); \
384 a -= b; a -= c; a ^= ( c >> 3 ); \
385 b -= c; b -= a; b ^= ( a << 10 ); \
386 c -= a; c -= b; c ^= ( b >> 15 ); \
387 } while (0)
388
389 #define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \
390 do { \
391 unsigned _hj_i,_hj_j,_hj_k; \
392 char *_hj_key=(char*)(key); \
393 hashv = 0xfeedbeef; \
394 _hj_i = _hj_j = 0x9e3779b9; \
395 _hj_k = keylen; \
396 while (_hj_k >= 12) { \
397 _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \
398 + ( (unsigned)_hj_key[2] << 16 ) \
399 + ( (unsigned)_hj_key[3] << 24 ) ); \
400 _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \
401 + ( (unsigned)_hj_key[6] << 16 ) \
402 + ( (unsigned)_hj_key[7] << 24 ) ); \
403 hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \
404 + ( (unsigned)_hj_key[10] << 16 ) \
405 + ( (unsigned)_hj_key[11] << 24 ) ); \
406 \
407 HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
408 \
409 _hj_key += 12; \
410 _hj_k -= 12; \
411 } \
412 hashv += keylen; \
413 switch ( _hj_k ) { \
414 case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \
415 case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \
416 case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \
417 case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \
418 case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \
419 case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \
420 case 5: _hj_j += _hj_key[4]; \
421 case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \
422 case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \
423 case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \
424 case 1: _hj_i += _hj_key[0]; \
425 } \
426 HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
427 bkt = hashv & (num_bkts-1); \
428 } while(0)
429
430
431 #undef get16bits
432 #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
433 || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
434 #define get16bits(d) (*((const uint16_t *) (d)))
435 #endif
436
437 #if !defined (get16bits)
438 #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \
439 +(uint32_t)(((const uint8_t *)(d))[0]) )
440 #endif
441 #define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \
442 do { \
443 char *_sfh_key=(char*)(key); \
444 uint32_t _sfh_tmp, _sfh_len = keylen; \
445 \
446 int _sfh_rem = _sfh_len & 3; \
447 _sfh_len >>= 2; \
448 hashv = 0xcafebabe; \
449 \
450 \
451 for (;_sfh_len > 0; _sfh_len--) { \
452 hashv += get16bits (_sfh_key); \
453 _sfh_tmp = (get16bits (_sfh_key+2) << 11) ^ hashv; \
454 hashv = (hashv << 16) ^ _sfh_tmp; \
455 _sfh_key += 2*sizeof (uint16_t); \
456 hashv += hashv >> 11; \
457 } \
458 \
459 \
460 switch (_sfh_rem) { \
461 case 3: hashv += get16bits (_sfh_key); \
462 hashv ^= hashv << 16; \
463 hashv ^= _sfh_key[sizeof (uint16_t)] << 18; \
464 hashv += hashv >> 11; \
465 break; \
466 case 2: hashv += get16bits (_sfh_key); \
467 hashv ^= hashv << 11; \
468 hashv += hashv >> 17; \
469 break; \
470 case 1: hashv += *_sfh_key; \
471 hashv ^= hashv << 10; \
472 hashv += hashv >> 1; \
473 } \
474 \
475 \
476 hashv ^= hashv << 3; \
477 hashv += hashv >> 5; \
478 hashv ^= hashv << 4; \
479 hashv += hashv >> 17; \
480 hashv ^= hashv << 25; \
481 hashv += hashv >> 6; \
482 bkt = hashv & (num_bkts-1); \
483 } while(0);
484
485 #ifdef HASH_USING_NO_STRICT_ALIASING
486
487
488
489
490
491
492
493
494
495 #if (defined(__i386__) || defined(__x86_64__))
496 #define MUR_GETBLOCK(p,i) p[i]
497 #else
498 #define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 0x3) == 0)
499 #define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 0x3) == 1)
500 #define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 0x3) == 2)
501 #define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 0x3) == 3)
502 #define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL))
503 #if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__))
504 #define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24))
505 #define MUR_TWO_TWO(p) ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16))
506 #define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >> 8))
507 #else
508 #define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24))
509 #define MUR_TWO_TWO(p) ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16))
510 #define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) << 8))
511 #endif
512 #define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) : \
513 (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \
514 (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) : \
515 MUR_ONE_THREE(p))))
516 #endif
517 #define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))
518 #define MUR_FMIX(_h) \
519 do { \
520 _h ^= _h >> 16; \
521 _h *= 0x85ebca6b; \
522 _h ^= _h >> 13; \
523 _h *= 0xc2b2ae35l; \
524 _h ^= _h >> 16; \
525 } while(0)
526
527 #define HASH_MUR(key,keylen,num_bkts,hashv,bkt) \
528 do { \
529 const uint8_t *_mur_data = (const uint8_t*)(key); \
530 const int _mur_nblocks = (keylen) / 4; \
531 uint32_t _mur_h1 = 0xf88D5353; \
532 uint32_t _mur_c1 = 0xcc9e2d51; \
533 uint32_t _mur_c2 = 0x1b873593; \
534 const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+_mur_nblocks*4); \
535 int _mur_i; \
536 for(_mur_i = -_mur_nblocks; _mur_i; _mur_i++) { \
537 uint32_t _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i); \
538 _mur_k1 *= _mur_c1; \
539 _mur_k1 = MUR_ROTL32(_mur_k1,15); \
540 _mur_k1 *= _mur_c2; \
541 \
542 _mur_h1 ^= _mur_k1; \
543 _mur_h1 = MUR_ROTL32(_mur_h1,13); \
544 _mur_h1 = _mur_h1*5+0xe6546b64; \
545 } \
546 const uint8_t *_mur_tail = (const uint8_t*)(_mur_data + _mur_nblocks*4); \
547 uint32_t _mur_k1=0; \
548 switch((keylen) & 3) { \
549 case 3: _mur_k1 ^= _mur_tail[2] << 16; \
550 case 2: _mur_k1 ^= _mur_tail[1] << 8; \
551 case 1: _mur_k1 ^= _mur_tail[0]; \
552 _mur_k1 *= _mur_c1; \
553 _mur_k1 = MUR_ROTL32(_mur_k1,15); \
554 _mur_k1 *= _mur_c2; \
555 _mur_h1 ^= _mur_k1; \
556 } \
557 _mur_h1 ^= (keylen); \
558 MUR_FMIX(_mur_h1); \
559 hashv = _mur_h1; \
560 bkt = hashv & (num_bkts-1); \
561 } while(0)
562 #endif
563
564
565 #define HASH_KEYCMP(a,b,len) memcmp(a,b,len)
566
567
568 #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \
569 do { \
570 if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \
571 else out=NULL; \
572 while (out) { \
573 if (out->hh.keylen == keylen_in) { \
574 if ((HASH_KEYCMP(out->hh.key,keyptr,keylen_in)) == 0) break; \
575 } \
576 if (out->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,out->hh.hh_next)); \
577 else out = NULL; \
578 } \
579 } while(0)
580
581
582 #define HASH_ADD_TO_BKT(head,addhh) \
583 do { \
584 head.count++; \
585 (addhh)->hh_next = head.hh_head; \
586 (addhh)->hh_prev = NULL; \
587 if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \
588 (head).hh_head=addhh; \
589 if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \
590 && (addhh)->tbl->noexpand != 1) { \
591 HASH_EXPAND_BUCKETS((addhh)->tbl); \
592 } \
593 } while(0)
594
595
596 #define HASH_DEL_IN_BKT(hh,head,hh_del) \
597 (head).count--; \
598 if ((head).hh_head == hh_del) { \
599 (head).hh_head = hh_del->hh_next; \
600 } \
601 if (hh_del->hh_prev) { \
602 hh_del->hh_prev->hh_next = hh_del->hh_next; \
603 } \
604 if (hh_del->hh_next) { \
605 hh_del->hh_next->hh_prev = hh_del->hh_prev; \
606 }
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637 #define HASH_EXPAND_BUCKETS(tbl) \
638 do { \
639 unsigned _he_bkt; \
640 unsigned _he_bkt_i; \
641 struct UT_hash_handle *_he_thh, *_he_hh_nxt; \
642 UT_hash_bucket *_he_new_buckets, *_he_newbkt; \
643 _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \
644 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \
645 if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \
646 memset(_he_new_buckets, 0, \
647 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \
648 tbl->ideal_chain_maxlen = \
649 (tbl->num_items >> (tbl->log2_num_buckets+1)) + \
650 ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \
651 tbl->nonideal_items = 0; \
652 for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \
653 { \
654 _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \
655 while (_he_thh) { \
656 _he_hh_nxt = _he_thh->hh_next; \
657 HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \
658 _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \
659 if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \
660 tbl->nonideal_items++; \
661 _he_newbkt->expand_mult = _he_newbkt->count / \
662 tbl->ideal_chain_maxlen; \
663 } \
664 _he_thh->hh_prev = NULL; \
665 _he_thh->hh_next = _he_newbkt->hh_head; \
666 if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \
667 _he_thh; \
668 _he_newbkt->hh_head = _he_thh; \
669 _he_thh = _he_hh_nxt; \
670 } \
671 } \
672 uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \
673 tbl->num_buckets *= 2; \
674 tbl->log2_num_buckets++; \
675 tbl->buckets = _he_new_buckets; \
676 tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \
677 (tbl->ineff_expands+1) : 0; \
678 if (tbl->ineff_expands > 1) { \
679 tbl->noexpand=1; \
680 uthash_noexpand_fyi(tbl); \
681 } \
682 uthash_expand_fyi(tbl); \
683 } while(0)
684
685
686
687
688
689 #define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)
690 #define HASH_SRT(hh,head,cmpfcn) \
691 do { \
692 unsigned _hs_i; \
693 unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \
694 struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \
695 if (head) { \
696 _hs_insize = 1; \
697 _hs_looping = 1; \
698 _hs_list = &((head)->hh); \
699 while (_hs_looping) { \
700 _hs_p = _hs_list; \
701 _hs_list = NULL; \
702 _hs_tail = NULL; \
703 _hs_nmerges = 0; \
704 while (_hs_p) { \
705 _hs_nmerges++; \
706 _hs_q = _hs_p; \
707 _hs_psize = 0; \
708 for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \
709 _hs_psize++; \
710 _hs_q = (UT_hash_handle*)((_hs_q->next) ? \
711 ((void*)((char*)(_hs_q->next) + \
712 (head)->hh.tbl->hho)) : NULL); \
713 if (! (_hs_q) ) break; \
714 } \
715 _hs_qsize = _hs_insize; \
716 while ((_hs_psize > 0) || ((_hs_qsize > 0) && _hs_q )) { \
717 if (_hs_psize == 0) { \
718 _hs_e = _hs_q; \
719 _hs_q = (UT_hash_handle*)((_hs_q->next) ? \
720 ((void*)((char*)(_hs_q->next) + \
721 (head)->hh.tbl->hho)) : NULL); \
722 _hs_qsize--; \
723 } else if ( (_hs_qsize == 0) || !(_hs_q) ) { \
724 _hs_e = _hs_p; \
725 _hs_p = (UT_hash_handle*)((_hs_p->next) ? \
726 ((void*)((char*)(_hs_p->next) + \
727 (head)->hh.tbl->hho)) : NULL); \
728 _hs_psize--; \
729 } else if (( \
730 cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \
731 DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \
732 ) <= 0) { \
733 _hs_e = _hs_p; \
734 _hs_p = (UT_hash_handle*)((_hs_p->next) ? \
735 ((void*)((char*)(_hs_p->next) + \
736 (head)->hh.tbl->hho)) : NULL); \
737 _hs_psize--; \
738 } else { \
739 _hs_e = _hs_q; \
740 _hs_q = (UT_hash_handle*)((_hs_q->next) ? \
741 ((void*)((char*)(_hs_q->next) + \
742 (head)->hh.tbl->hho)) : NULL); \
743 _hs_qsize--; \
744 } \
745 if ( _hs_tail ) { \
746 _hs_tail->next = ((_hs_e) ? \
747 ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \
748 } else { \
749 _hs_list = _hs_e; \
750 } \
751 _hs_e->prev = ((_hs_tail) ? \
752 ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \
753 _hs_tail = _hs_e; \
754 } \
755 _hs_p = _hs_q; \
756 } \
757 _hs_tail->next = NULL; \
758 if ( _hs_nmerges <= 1 ) { \
759 _hs_looping=0; \
760 (head)->hh.tbl->tail = _hs_tail; \
761 DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \
762 } \
763 _hs_insize *= 2; \
764 } \
765 HASH_FSCK(hh,head); \
766 } \
767 } while (0)
768
769
770
771
772
773
774 #define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \
775 do { \
776 unsigned _src_bkt, _dst_bkt; \
777 void *_last_elt=NULL, *_elt; \
778 UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \
779 ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \
780 if (src) { \
781 for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \
782 for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \
783 _src_hh; \
784 _src_hh = _src_hh->hh_next) { \
785 _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \
786 if (cond(_elt)) { \
787 _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \
788 _dst_hh->key = _src_hh->key; \
789 _dst_hh->keylen = _src_hh->keylen; \
790 _dst_hh->hashv = _src_hh->hashv; \
791 _dst_hh->prev = _last_elt; \
792 _dst_hh->next = NULL; \
793 if (_last_elt_hh) { _last_elt_hh->next = _elt; } \
794 if (!dst) { \
795 DECLTYPE_ASSIGN(dst,_elt); \
796 HASH_MAKE_TABLE(hh_dst,dst); \
797 } else { \
798 _dst_hh->tbl = (dst)->hh_dst.tbl; \
799 } \
800 HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \
801 HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \
802 (dst)->hh_dst.tbl->num_items++; \
803 _last_elt = _elt; \
804 _last_elt_hh = _dst_hh; \
805 } \
806 } \
807 } \
808 } \
809 HASH_FSCK(hh_dst,dst); \
810 } while (0)
811
812 #define HASH_CLEAR(hh,head) \
813 do { \
814 if (head) { \
815 uthash_free((head)->hh.tbl->buckets, \
816 (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \
817 HASH_BLOOM_FREE((head)->hh.tbl); \
818 uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
819 (head)=NULL; \
820 } \
821 } while(0)
822
823 #ifdef NO_DECLTYPE
824 #define HASH_ITER(hh,head,el,tmp) \
825 for((el)=(head), (*(char**)(&(tmp)))=(char*)((head)?(head)->hh.next:NULL); \
826 el; (el)=(tmp),(*(char**)(&(tmp)))=(char*)((tmp)?(tmp)->hh.next:NULL))
827 #else
828 #define HASH_ITER(hh,head,el,tmp) \
829 for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL); \
830 el; (el)=(tmp),(tmp)=DECLTYPE(el)((tmp)?(tmp)->hh.next:NULL))
831 #endif
832
833
834 #define HASH_COUNT(head) HASH_CNT(hh,head)
835 #define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0)
836
837 typedef struct UT_hash_bucket {
838 struct UT_hash_handle *hh_head;
839 unsigned count;
840
841
842
843
844
845
846
847
848
849
850
851
852
853 unsigned expand_mult;
854
855 } UT_hash_bucket;
856
857
858 #define HASH_SIGNATURE 0xa0111fe1
859 #define HASH_BLOOM_SIGNATURE 0xb12220f2
860
861 typedef struct UT_hash_table {
862 UT_hash_bucket *buckets;
863 unsigned num_buckets, log2_num_buckets;
864 unsigned num_items;
865 struct UT_hash_handle *tail;
866 ptrdiff_t hho;
867
868
869
870 unsigned ideal_chain_maxlen;
871
872
873
874
875 unsigned nonideal_items;
876
877
878
879
880
881
882
883 unsigned ineff_expands, noexpand;
884
885 uint32_t signature;
886 #ifdef HASH_BLOOM
887 uint32_t bloom_sig;
888 uint8_t *bloom_bv;
889 char bloom_nbits;
890 #endif
891
892 } UT_hash_table;
893
894 typedef struct UT_hash_handle {
895 struct UT_hash_table *tbl;
896 void *prev;
897 void *next;
898 struct UT_hash_handle *hh_prev;
899 struct UT_hash_handle *hh_next;
900 void *key;
901 unsigned keylen;
902 unsigned hashv;
903 } UT_hash_handle;
904
905 #endif