-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhashtable_8h_source.html
More file actions
525 lines (525 loc) · 81.6 KB
/
hashtable_8h_source.html
File metadata and controls
525 lines (525 loc) · 81.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
<!-- HTML header for doxygen 1.8.10-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<title>librsync: hashtable.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<!-- ad -->
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- librsync -->
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-3547096055927362"
data-ad-slot="8322976738"
data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">librsync
 <span id="projectnumber">2.3.4</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */
</script>
<div id="main-nav"></div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">hashtable.h</div></div>
</div><!--header-->
<div class="contents">
<a href="hashtable_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/*= -*- c-basic-offset: 4; indent-tabs-mode: nil; -*-</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"> *</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment"> * hashtable.h -- a generic open addressing hashtable.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"> *</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment"> * Copyright (C) 2003 by Donovan Baarda <abo@minkirri.apana.org.au></span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"> *</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment"> * This program is free software; you can redistribute it and/or modify</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"> * it under the terms of the GNU Lesser General Public License as published by</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment"> * the Free Software Foundation; either version 2.1 of the License, or</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"> * (at your option) any later version.</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> *</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> * This program is distributed in the hope that it will be useful,</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment"> * GNU Lesser General Public License for more details.</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment"> *</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="comment"> * You should have received a copy of the GNU Lesser General Public License</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="comment"> * along with this program; if not, write to the Free Software</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="comment"> * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="comment"></span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="comment">/** \file hashtable.h</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="comment"> * A generic open addressing hashtable.</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="comment"> *</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="comment"> * This is a minimal hashtable containing pointers to arbitrary entries with</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="comment"> * configurable hashtable size and support for custom hash() and cmp() methods.</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="comment"> * The cmp() method can either be a simple comparison between two keys, or can</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="comment"> * be against a special match object containing additional mutable state. This</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="comment"> * allows for things like deferred and cached evaluation of costly comparison</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="comment"> * data. The hash() function doesn't need to avoid clustering behaviour.</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="comment"> *</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="comment"> * It uses open addressing with quadratic probing for collisions. The</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="comment"> * MurmurHash3 finalization function is optionally used on the hash() output to</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="comment"> * avoid clustering and can be disabled by setting HASHTABLE_NMIX32. There is</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="comment"> * no support for removing entries, only adding them. Multiple entries with the</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="comment"> * same key can be added, and you can use a fancy cmp() function to find</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="comment"> * particular entries by more than just their key. There is an iterator for</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="comment"> * iterating through all entries in the hashtable. There are optional</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="comment"> * NAME_find() find/match/hashcmp/entrycmp stats counters that can be disabled</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="comment"> * by defining HASHTABLE_NSTATS. There is an optional simple k=1 bloom filter</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="comment"> * for speed that can be disabled by defining HASHTABLE_NBLOOM.</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="comment"> *</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="comment"> * The types and methods of the hashtable and its contents are specified by</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="comment"> * using \#define parameters set to their basenames (the prefixes for the *_t</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="comment"> * type and *_func() methods) before doing \#include "hashtable.h". This</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="comment"> * produces static inline type-safe methods that are either application</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="comment"> * optimized for speed or wrappers around void* implementation methods for</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment"> * compactness.</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment"> *</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment"> * \param ENTRY - the entry type basename.</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="comment"> *</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="comment"> * \param KEY - optional key type basename (default: ENTRY).</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="comment"> *</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="comment"> * \param MATCH - optional match type basename (default: KEY).</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="comment"> *</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="comment"> * \param NAME - optional hashtable type basename (default: ENTRY_hashtable).</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="comment"> *</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="comment"> * Example: \code</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="comment"> * typedef ... mykey_t;</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="comment"> * int mykey_hash(mykey_t const *e);</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="comment"> * int mykey_cmp(mykey_t *e, mykey_t const *o);</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="comment"> *</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="comment"> * typedef struct myentry {</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="comment"> * mykey_t key; // Inherit from mykey_t.</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="comment"> * ...extra entry value data...</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="comment"> * } myentry_t;</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="comment"> * void myentry_init(myentry_t *e, ...);</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><span class="comment"> *</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="comment"> * #define ENTRY myentry</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="comment"> * #define KEY mykey</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span><span class="comment"> * #include "hashtable.h"</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span><span class="comment"> *</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span><span class="comment"> * hashtable_t *t;</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span><span class="comment"> * myentry_t entries[300];</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="comment"> * mykey_t k;</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span><span class="comment"> * myentry_t *e;</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="comment"> *</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="comment"> * t = myentry_hashtable_new(300);</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="comment"> * myentry_init(&entries[5], ...);</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span><span class="comment"> * myentry_hashtable_add(t, &entries[5]);</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span><span class="comment"> * k = ...;</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="comment"> * e = myentry_hashtable_find(t, &k);</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="comment"> *</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span><span class="comment"> * int i;</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span><span class="comment"> * for (e = myentry_hashtable_iter(t, &i); e != NULL;</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span><span class="comment"> * e = myentry_hashtable_next(t, &i))</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><span class="comment"> * ...</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span><span class="comment"> *</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="comment"> * myentry_hashtable_free(t);</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="comment"> * \endcode</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="comment"> *</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="comment"> * The mykey_hash() and mykey_cmp() fuctions will typically take pointers to</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><span class="comment"> * mykey/myentry instances the same as the pointers stored in the hashtable.</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span><span class="comment"> * However it is also possible for them to take "match objects" that are a</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="comment"> * "subclass" of the entry type that contain additional state for complicated</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="comment"> * comparision operations.</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span><span class="comment"> *</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span><span class="comment"> * Example: \code</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="comment"> * typedef struct mymatch {</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><span class="comment"> * mykey_t key; // Inherit from mykey_t;</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span><span class="comment"> * ...extra match criteria and state data...</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span><span class="comment"> * } mymatch_t;</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span><span class="comment"> * int mymatch_cmp(mymatch_t *m, myentry_t const *e);</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><span class="comment"> *</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span><span class="comment"> * #define ENTRY myentry</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span><span class="comment"> * #define KEY mykey</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span><span class="comment"> * #define MATCH mymatch</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="comment"> * #include "hashtable.h"</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="comment"> *</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="comment"> * ...</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span><span class="comment"> * mymatch_t m;</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="comment"> *</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span><span class="comment"> * t = myentry_hashtable_new(300);</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span><span class="comment"> * ...</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="comment"> * m = ...;</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span><span class="comment"> * e = myentry_hashtable_find(t, &m);</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span><span class="comment"> * \endcode</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span><span class="comment"> *</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span><span class="comment"> * The mymatch_cmp() function is only called for finding hashtable entries and</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span><span class="comment"> * can mutate the mymatch_t object for doing things like deferred and cached</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span><span class="comment"> * evaluation of expensive match data. It can also access the whole myentry_t</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span><span class="comment"> * object to match against more than just the key. */</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span><span class="preprocessor">#ifndef HASHTABLE_H</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span><span class="preprocessor"># define HASHTABLE_H</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> </div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span><span class="preprocessor"># include <stdbool.h></span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span><span class="comment"></span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span><span class="comment">/** The hashtable type. */</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"><a class="line" href="structhashtable.html"> 128</a></span><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code hl_struct" href="structhashtable.html">hashtable</a> {</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"><a class="line" href="structhashtable.html#ab62bd10297b090cfce7d728fd650e51d"> 129</a></span> <span class="keywordtype">int</span> <a class="code hl_variable" href="structhashtable.html#ab62bd10297b090cfce7d728fd650e51d">size</a>; <span class="comment">/**< Size of allocated hashtable. */</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"><a class="line" href="structhashtable.html#a849d7b9cab945feabe177cd5e61f46a7"> 130</a></span> <span class="keywordtype">int</span> <a class="code hl_variable" href="structhashtable.html#a849d7b9cab945feabe177cd5e61f46a7">count</a>; <span class="comment">/**< Number of entries in hashtable. */</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"><a class="line" href="structhashtable.html#ab89d13f1e21e46e4790780095e1f14a0"> 131</a></span> <span class="keywordtype">unsigned</span> <a class="code hl_variable" href="structhashtable.html#ab89d13f1e21e46e4790780095e1f14a0">tmask</a>; <span class="comment">/**< Mask to get the hashtable index. */</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span><span class="preprocessor"># ifndef HASHTABLE_NBLOOM</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"><a class="line" href="structhashtable.html#afe6082e065c17d152a5e00150edc9b40"> 133</a></span> <span class="keywordtype">unsigned</span> <a class="code hl_variable" href="structhashtable.html#afe6082e065c17d152a5e00150edc9b40">bshift</a>; <span class="comment">/**< Shift to get the bloomfilter index. */</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span><span class="preprocessor"># ifndef HASHTABLE_NSTATS</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="comment">/* The following are for accumulating NAME_find() stats. */</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"><a class="line" href="structhashtable.html#a2d26a02a9bc656f5acab82ee1f45c82e"> 137</a></span> <span class="keywordtype">long</span> <a class="code hl_variable" href="structhashtable.html#a2d26a02a9bc656f5acab82ee1f45c82e">find_count</a>; <span class="comment">/**< The count of finds tried. */</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"><a class="line" href="structhashtable.html#a560df9089435475d6ba5cbd2e0d0076d"> 138</a></span> <span class="keywordtype">long</span> <a class="code hl_variable" href="structhashtable.html#a560df9089435475d6ba5cbd2e0d0076d">match_count</a>; <span class="comment">/**< The count of matches found. */</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"><a class="line" href="structhashtable.html#ad2995922a4f5fb09e8c0dcc092be91bf"> 139</a></span> <span class="keywordtype">long</span> <a class="code hl_variable" href="structhashtable.html#ad2995922a4f5fb09e8c0dcc092be91bf">hashcmp_count</a>; <span class="comment">/**< The count of hash compares done. */</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"><a class="line" href="structhashtable.html#aa5ee8c97823281612f138de984dd46f3"> 140</a></span> <span class="keywordtype">long</span> <a class="code hl_variable" href="structhashtable.html#aa5ee8c97823281612f138de984dd46f3">entrycmp_count</a>; <span class="comment">/**< The count of entry compares done. */</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span><span class="preprocessor"># ifndef HASHTABLE_NBLOOM</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"><a class="line" href="structhashtable.html#aa4b5d6817ee43aae5cc08bff4c0b6b75"> 143</a></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *<a class="code hl_variable" href="structhashtable.html#aa4b5d6817ee43aae5cc08bff4c0b6b75">kbloom</a>; <span class="comment">/**< Bloom filter of hash keys with k=1. */</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"><a class="line" href="structhashtable.html#ac624838d2888397a8374fb2aabd330fe"> 145</a></span> <span class="keywordtype">void</span> **<a class="code hl_variable" href="structhashtable.html#ac624838d2888397a8374fb2aabd330fe">etable</a>; <span class="comment">/**< Table of pointers to entries. */</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"><a class="line" href="structhashtable.html#a325ead2dc00a7fa743f74f7d70af04d7"> 146</a></span> <span class="keywordtype">unsigned</span> <a class="code hl_variable" href="structhashtable.html#a325ead2dc00a7fa743f74f7d70af04d7">ktable</a>[]; <span class="comment">/**< Table of hash keys. */</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a73b7b0b1854d7b8336d3168aaa8fe755"> 147</a></span>} <a class="code hl_typedef" href="hashtable_8h.html#a73b7b0b1854d7b8336d3168aaa8fe755">hashtable_t</a>;</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> </div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span><span class="comment">/* void* implementations for the type-safe static inline wrappers below. */</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span><a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *_hashtable_new(<span class="keywordtype">int</span> size);</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span><span class="keywordtype">void</span> _hashtable_free(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t);</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> </div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span><span class="preprocessor"># ifndef HASHTABLE_NBLOOM</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span><span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> hashtable_setbloom(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t, <span class="keywordtype">unsigned</span> <span class="keyword">const</span> h)</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span>{</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="comment">/* Use upper bits for a "different hash". */</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keywordtype">unsigned</span> <span class="keyword">const</span> i = h >> t-><a class="code hl_variable" href="structhashtable.html#afe6082e065c17d152a5e00150edc9b40">bshift</a>;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> t-><a class="code hl_variable" href="structhashtable.html#aa4b5d6817ee43aae5cc08bff4c0b6b75">kbloom</a>[i / 8] |= (<span class="keywordtype">unsigned</span> char)(1 << (i % 8));</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span>}</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span><span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> hashtable_getbloom(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t, <span class="keywordtype">unsigned</span> <span class="keyword">const</span> h)</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span>{</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="comment">/* Use upper bits for a "different hash". */</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keywordtype">unsigned</span> <span class="keyword">const</span> i = h >> t-><a class="code hl_variable" href="structhashtable.html#afe6082e065c17d152a5e00150edc9b40">bshift</a>;</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="keywordflow">return</span> (t-><a class="code hl_variable" href="structhashtable.html#aa4b5d6817ee43aae5cc08bff4c0b6b75">kbloom</a>[i / 8] >> (i % 8)) & 1;</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span>}</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span><span class="comment"></span> </div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span><span class="comment">/** MurmurHash3 finalization mix function. */</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"><a class="line" href="hashtable_8h.html#ac1bb2e17d20ca0fc08ab9e02ecaa698f"> 170</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <a class="code hl_function" href="hashtable_8h.html#ac1bb2e17d20ca0fc08ab9e02ecaa698f">mix32</a>(<span class="keywordtype">unsigned</span> h)</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span>{</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> h ^= h >> 16;</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> h *= 0x85ebca6b;</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> h ^= h >> 13;</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> h *= 0xc2b2ae35;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> h ^= h >> 16;</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="keywordflow">return</span> h;</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span>}</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span><span class="comment"></span> </div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span><span class="comment">/** Ensure hash's are never zero. */</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"><a class="line" href="hashtable_8h.html#ad3e0c9c023060284c0e81ff95ff25979"> 181</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <a class="code hl_function" href="hashtable_8h.html#ad3e0c9c023060284c0e81ff95ff25979">nozero</a>(<span class="keywordtype">unsigned</span> h)</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span>{</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keywordflow">return</span> h ? h : (unsigned)-1;</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span>}</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> </div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span><span class="preprocessor">#endif </span><span class="comment">/* !HASHTABLE_H */</span><span class="preprocessor"></span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> </div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span><span class="comment">/* If ENTRY is defined, define type-dependent static inline methods. */</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span><span class="preprocessor">#ifdef ENTRY</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> </div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span><span class="preprocessor"># include <assert.h></span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span><span class="preprocessor"># include <stddef.h></span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> </div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span><span class="preprocessor"># define _JOIN2(x, y) x##y</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span><span class="preprocessor"># define _JOIN(x, y) _JOIN2(x, y)</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> </div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span><span class="preprocessor"># ifndef KEY</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span><span class="preprocessor"># define KEY ENTRY</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> </div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span><span class="preprocessor"># ifndef MATCH</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span><span class="preprocessor"># define MATCH KEY</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> </div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span><span class="preprocessor"># ifndef NAME</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span><span class="preprocessor"># define NAME _JOIN(ENTRY, _hashtable)</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> </div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08"> 209</a></span><span class="preprocessor"># define ENTRY_t _JOIN(ENTRY, _t) </span><span class="comment">/**< The entry type. */</span><span class="preprocessor"></span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a4ede5dc90f17fe0b2fa44430c8073d89"> 210</a></span><span class="preprocessor"># define KEY_t _JOIN(KEY, _t) </span><span class="comment">/**< The key type. */</span><span class="preprocessor"></span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a7b951012b0e11016cdcbee035a283be1"> 211</a></span><span class="preprocessor"># define MATCH_t _JOIN(MATCH, _t) </span><span class="comment">/**< The match type. */</span><span class="preprocessor"></span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"><a class="line" href="hashtable_8h.html#af15ef27e505263cd8d9855c6bdbba940"> 212</a></span><span class="preprocessor"># define KEY_hash _JOIN(KEY, _hash) </span><span class="comment">/**< The key hash(k) method. */</span><span class="preprocessor"></span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a4b095b5dd8e8b80ad03e12e57b3c4e86"> 213</a></span><span class="preprocessor"># define MATCH_cmp _JOIN(MATCH, _cmp) </span><span class="comment">/**< The match cmp(m, e) method. */</span><span class="preprocessor"></span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span><span class="comment">/* The names for all the hashtable methods. */</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span><span class="preprocessor"># define NAME_new _JOIN(NAME, _new)</span></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span><span class="preprocessor"># define NAME_free _JOIN(NAME, _free)</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span><span class="preprocessor"># define NAME_stats_init _JOIN(NAME, _stats_init)</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span><span class="preprocessor"># define NAME_add _JOIN(NAME, _add)</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span><span class="preprocessor"># define NAME_find _JOIN(NAME, _find)</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span><span class="preprocessor"># define NAME_iter _JOIN(NAME, _iter)</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span><span class="preprocessor"># define NAME_next _JOIN(NAME, _next)</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> </div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span><span class="comment">/* Modified hash() with/without mix32() and reserving zero for empty buckets. */</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span><span class="preprocessor"># ifdef HASHTABLE_NMIX32</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span><span class="preprocessor"># define _KEY_HASH(k) nozero(KEY_hash((KEY_t *)k))</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span><span class="preprocessor"># else</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span><span class="preprocessor"># define _KEY_HASH(k) nozero(mix32(KEY_hash((KEY_t *)k)))</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> </div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span><span class="comment">/* Loop macro for probing table t for key hash hk, iterating with index i and</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span><span class="comment"> entry hash h, terminating at an empty bucket. */</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span><span class="preprocessor"># define _for_probe(t, hk, i, h) \</span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span><span class="preprocessor"> unsigned const *const ktable = t->ktable;\</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span><span class="preprocessor"> unsigned const tmask = t->tmask;\</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span><span class="preprocessor"> unsigned i, s, h;\</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span><span class="preprocessor"> for (i = hk & tmask, s = 0; (h = ktable[i]); i = (i + ++s) & tmask)</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> </div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span><span class="comment">/* Conditional macro for incrementing stats counters. */</span></div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span><span class="preprocessor"># ifndef HASHTABLE_NSTATS</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span><span class="preprocessor"># define _stats_inc(c) (c++)</span></div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span><span class="preprocessor"># else</span></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span><span class="preprocessor"># define _stats_inc(c)</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span><span class="comment"></span> </div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span><span class="comment">/** Allocate and initialize a hashtable instance.</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span><span class="comment"> *</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span><span class="comment"> * The provided size is used as an indication of the number of entries you wish</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span><span class="comment"> * to add, but the allocated size will probably be larger depending on the</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span><span class="comment"> * implementation to enable optimisations or avoid degraded performance. It may</span></div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span><span class="comment"> * be possible to fill the table beyond the requested size, but performance can</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span><span class="comment"> * start to degrade badly if it is over filled.</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span><span class="comment"> *</span></div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span><span class="comment"> * \param size - The desired minimum size of the hash table.</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span><span class="comment"> *</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span><span class="comment"> * \return The initialized hashtable instance or NULL if it failed. */</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a72f00532020b20d176b57e60fe24c480"> 256</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *<a class="code hl_function" href="hashtable_8h.html#a72f00532020b20d176b57e60fe24c480">NAME_new</a>(<span class="keywordtype">int</span> size)</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span>{</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">return</span> _hashtable_new(size);</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span>}</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span><span class="comment"></span> </div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span><span class="comment">/** Destroy and free a hashtable instance.</span></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span><span class="comment"> *</span></div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span><span class="comment"> * This will free the hashtable, but will not free the entries in the</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span><span class="comment"> * hashtable. If you want to free the entries too, use a hashtable iterator to</span></div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span><span class="comment"> * free the the entries first.</span></div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span><span class="comment"> *</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span><span class="comment"> * \param *t - The hashtable to destroy and free. */</span></div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a804ac6e8aad00085226b5605e6300abd"> 268</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="hashtable_8h.html#a804ac6e8aad00085226b5605e6300abd">NAME_free</a>(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t)</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span>{</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> _hashtable_free(t);</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span>}</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span><span class="comment"></span> </div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span><span class="comment">/** Initialize hashtable stats counters.</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span><span class="comment"> *</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span><span class="comment"> * This will reset all the stats counters for the hashtable,</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span><span class="comment"> *</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span><span class="comment"> * \param *t - The hashtable to initializ stats for. */</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a158adda1c5dd628b410c6c9f53ecdebf"> 278</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="hashtable_8h.html#a158adda1c5dd628b410c6c9f53ecdebf">NAME_stats_init</a>(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t)</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span>{</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span><span class="preprocessor"># ifndef HASHTABLE_NSTATS</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> t-><a class="code hl_variable" href="structhashtable.html#a2d26a02a9bc656f5acab82ee1f45c82e">find_count</a> = t-><a class="code hl_variable" href="structhashtable.html#a560df9089435475d6ba5cbd2e0d0076d">match_count</a> = t-><a class="code hl_variable" href="structhashtable.html#ad2995922a4f5fb09e8c0dcc092be91bf">hashcmp_count</a> = t-><a class="code hl_variable" href="structhashtable.html#aa5ee8c97823281612f138de984dd46f3">entrycmp_count</a> = 0;</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span>}</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span><span class="comment"></span> </div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span><span class="comment">/** Add an entry to a hashtable.</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span><span class="comment"> *</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span><span class="comment"> * This doesn't use MATCH_cmp() or do any checks for existing copies or</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span><span class="comment"> * instances, so it will add duplicates. If you want to avoid adding</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span><span class="comment"> * duplicates, use NAME_find() to check for existing entries first.</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span><span class="comment"> *</span></div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span><span class="comment"> * \param *t - The hashtable to add to.</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span><span class="comment"> *</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span><span class="comment"> * \param *e - The entry object to add.</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span><span class="comment"> *</span></div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span><span class="comment"> * \return The added entry, or NULL if the table is full. */</span></div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a8f5751d4adbbec9c6b30848c951c14e7"> 296</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <a class="code hl_define" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a> *<a class="code hl_function" href="hashtable_8h.html#a8f5751d4adbbec9c6b30848c951c14e7">NAME_add</a>(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t, <a class="code hl_define" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a> *e)</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span>{</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> <span class="keywordtype">unsigned</span> he = _KEY_HASH(e);</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> </div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> assert(e != NULL);</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> <span class="keywordflow">if</span> (t-><a class="code hl_variable" href="structhashtable.html#a849d7b9cab945feabe177cd5e61f46a7">count</a> + 1 == t-><a class="code hl_variable" href="structhashtable.html#ab62bd10297b090cfce7d728fd650e51d">size</a>)</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span><span class="preprocessor"># ifndef HASHTABLE_NBLOOM</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> hashtable_setbloom(t, he);</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> _for_probe(t, he, i, h);</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> t-><a class="code hl_variable" href="structhashtable.html#a849d7b9cab945feabe177cd5e61f46a7">count</a>++;</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> t-><a class="code hl_variable" href="structhashtable.html#a325ead2dc00a7fa743f74f7d70af04d7">ktable</a>[i] = he;</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> <span class="keywordflow">return</span> t-><a class="code hl_variable" href="structhashtable.html#ac624838d2888397a8374fb2aabd330fe">etable</a>[i] = e;</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span>}</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span><span class="comment"></span> </div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span><span class="comment">/** Find an entry in a hashtable.</span></div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span><span class="comment"> *</span></div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span><span class="comment"> * Uses MATCH_cmp() to find the first matching entry in the table in the same</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span><span class="comment"> * hash() bucket.</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span><span class="comment"> *</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span><span class="comment"> * \param *t - The hashtable to search.</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span><span class="comment"> *</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span><span class="comment"> * \param *m - The key or match object to search for.</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span><span class="comment"> *</span></div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span><span class="comment"> * \return The first found entry, or NULL if nothing was found. */</span></div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a17bb9474643a3b0e36849e0faa1e8310"> 322</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <a class="code hl_define" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a> *<a class="code hl_function" href="hashtable_8h.html#a17bb9474643a3b0e36849e0faa1e8310">NAME_find</a>(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t, <a class="code hl_define" href="hashtable_8h.html#a7b951012b0e11016cdcbee035a283be1">MATCH_t</a> *m)</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span>{</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> assert(m != NULL);</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <span class="keywordtype">unsigned</span> hm = _KEY_HASH(m);</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <a class="code hl_define" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a> *e;</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> </div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> _stats_inc(t-><a class="code hl_variable" href="structhashtable.html#a2d26a02a9bc656f5acab82ee1f45c82e">find_count</a>);</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span><span class="preprocessor"># ifndef HASHTABLE_NBLOOM</span></div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <span class="keywordflow">if</span> (!hashtable_getbloom(t, hm))</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span><span class="preprocessor"># endif</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> _for_probe(t, hm, i, he) {</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> _stats_inc(t-><a class="code hl_variable" href="structhashtable.html#ad2995922a4f5fb09e8c0dcc092be91bf">hashcmp_count</a>);</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <span class="keywordflow">if</span> (hm == he) {</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> _stats_inc(t-><a class="code hl_variable" href="structhashtable.html#aa5ee8c97823281612f138de984dd46f3">entrycmp_count</a>);</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> <span class="keywordflow">if</span> (!<a class="code hl_define" href="hashtable_8h.html#a4b095b5dd8e8b80ad03e12e57b3c4e86">MATCH_cmp</a>(m, e = t-><a class="code hl_variable" href="structhashtable.html#ac624838d2888397a8374fb2aabd330fe">etable</a>[i])) {</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> _stats_inc(t-><a class="code hl_variable" href="structhashtable.html#a560df9089435475d6ba5cbd2e0d0076d">match_count</a>);</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <span class="keywordflow">return</span> e;</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> }</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> }</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> }</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> <span class="comment">/* Also count the compare for the empty bucket. */</span></div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> _stats_inc(t-><a class="code hl_variable" href="structhashtable.html#ad2995922a4f5fb09e8c0dcc092be91bf">hashcmp_count</a>);</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span>}</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> </div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span><span class="keyword">static</span> <span class="keyword">inline</span> <a class="code hl_define" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a> *<a class="code hl_function" href="hashtable_8h.html#a3d6872fc0d32704681ab91bc95990f88">NAME_next</a>(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t, <span class="keywordtype">int</span> *i);</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span><span class="comment"></span> </div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span><span class="comment">/** Initialize a iteration and return the first entry.</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span><span class="comment"> *</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span><span class="comment"> * This works together with NAME_next() for iterating through all entries in a</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span><span class="comment"> * hashtable.</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span><span class="comment"> *</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span><span class="comment"> * Example: \code</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span><span class="comment"> * for (e = NAME_iter(t, &i); e != NULL; e = NAME_next(t, &i))</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span><span class="comment"> * ...</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span><span class="comment"> * \endcode</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span><span class="comment"> *</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span><span class="comment"> * \param *t - the hashtable to iterate over.</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span><span class="comment"> *</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span><span class="comment"> * \param *i - the int iterator index to initialize.</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span><span class="comment"> *</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span><span class="comment"> * \return The first entry or NULL if the hashtable is empty. */</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a63414b4706a0821a88b77e44654ed879"> 365</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <a class="code hl_define" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a> *<a class="code hl_function" href="hashtable_8h.html#a63414b4706a0821a88b77e44654ed879">NAME_iter</a>(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t, <span class="keywordtype">int</span> *i)</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span>{</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> assert(t != NULL);</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> assert(i != NULL);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> *i = 0;</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> <span class="keywordflow">return</span> <a class="code hl_function" href="hashtable_8h.html#a3d6872fc0d32704681ab91bc95990f88">NAME_next</a>(t, i);</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span>}</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span><span class="comment"></span> </div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span><span class="comment">/** Get the next entry from a hashtable iterator or NULL when finished.</span></div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span><span class="comment"> *</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span><span class="comment"> * This works together with NAME_iter() for iterating through all entries in a</span></div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span><span class="comment"> * hashtable.</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span><span class="comment"> *</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span><span class="comment"> * \param *t - the hashtable to iterate over.</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span><span class="comment"> *</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span><span class="comment"> * \param *i - the int iterator index to use.</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span><span class="comment"> *</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span><span class="comment"> * \return The next entry or NULL if the iterator is finished. */</span></div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"><a class="line" href="hashtable_8h.html#a3d6872fc0d32704681ab91bc95990f88"> 383</a></span><span class="keyword">static</span> <span class="keyword">inline</span> <a class="code hl_define" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a> *<a class="code hl_function" href="hashtable_8h.html#a3d6872fc0d32704681ab91bc95990f88">NAME_next</a>(<a class="code hl_struct" href="structhashtable.html">hashtable_t</a> *t, <span class="keywordtype">int</span> *i)</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span>{</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> assert(t != NULL);</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> assert(i != NULL);</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <a class="code hl_define" href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a> *e = NULL;</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> </div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <span class="keywordflow">while</span> ((*i < t->size) && !(e = t-><a class="code hl_variable" href="structhashtable.html#ac624838d2888397a8374fb2aabd330fe">etable</a>[(*i)++])) ;</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> <span class="keywordflow">return</span> e;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span>}</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> </div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span><span class="preprocessor"># undef ENTRY</span></div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span><span class="preprocessor"># undef KEY</span></div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span><span class="preprocessor"># undef MATCH</span></div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span><span class="preprocessor"># undef NAME</span></div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span><span class="preprocessor"># undef ENTRY_t</span></div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span><span class="preprocessor"># undef KEY_t</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span><span class="preprocessor"># undef MATCH_t</span></div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span><span class="preprocessor"># undef KEY_hash</span></div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span><span class="preprocessor"># undef MATCH_cmp</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span><span class="preprocessor"># undef NAME_new</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span><span class="preprocessor"># undef NAME_free</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span><span class="preprocessor"># undef NAME_stats_init</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span><span class="preprocessor"># undef NAME_add</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span><span class="preprocessor"># undef NAME_find</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span><span class="preprocessor"># undef NAME_iter</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span><span class="preprocessor"># undef NAME_next</span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span><span class="preprocessor"># undef _KEY_HASH</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span><span class="preprocessor">#endif </span><span class="comment">/* ENTRY */</span><span class="preprocessor"></span></div>
<div class="ttc" id="ahashtable_8h_html_a0b465aad0dbee94f1c2885f803e47b08"><div class="ttname"><a href="hashtable_8h.html#a0b465aad0dbee94f1c2885f803e47b08">ENTRY_t</a></div><div class="ttdeci">#define ENTRY_t</div><div class="ttdoc">The entry type.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00209">hashtable.h:209</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a158adda1c5dd628b410c6c9f53ecdebf"><div class="ttname"><a href="hashtable_8h.html#a158adda1c5dd628b410c6c9f53ecdebf">NAME_stats_init</a></div><div class="ttdeci">static void NAME_stats_init(hashtable_t *t)</div><div class="ttdoc">Initialize hashtable stats counters.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00278">hashtable.h:278</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a17bb9474643a3b0e36849e0faa1e8310"><div class="ttname"><a href="hashtable_8h.html#a17bb9474643a3b0e36849e0faa1e8310">NAME_find</a></div><div class="ttdeci">static ENTRY_t * NAME_find(hashtable_t *t, MATCH_t *m)</div><div class="ttdoc">Find an entry in a hashtable.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00322">hashtable.h:322</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a3d6872fc0d32704681ab91bc95990f88"><div class="ttname"><a href="hashtable_8h.html#a3d6872fc0d32704681ab91bc95990f88">NAME_next</a></div><div class="ttdeci">static ENTRY_t * NAME_next(hashtable_t *t, int *i)</div><div class="ttdoc">Get the next entry from a hashtable iterator or NULL when finished.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00383">hashtable.h:383</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a4b095b5dd8e8b80ad03e12e57b3c4e86"><div class="ttname"><a href="hashtable_8h.html#a4b095b5dd8e8b80ad03e12e57b3c4e86">MATCH_cmp</a></div><div class="ttdeci">#define MATCH_cmp</div><div class="ttdoc">The match cmp(m, e) method.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00213">hashtable.h:213</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a63414b4706a0821a88b77e44654ed879"><div class="ttname"><a href="hashtable_8h.html#a63414b4706a0821a88b77e44654ed879">NAME_iter</a></div><div class="ttdeci">static ENTRY_t * NAME_iter(hashtable_t *t, int *i)</div><div class="ttdoc">Initialize a iteration and return the first entry.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00365">hashtable.h:365</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a72f00532020b20d176b57e60fe24c480"><div class="ttname"><a href="hashtable_8h.html#a72f00532020b20d176b57e60fe24c480">NAME_new</a></div><div class="ttdeci">static hashtable_t * NAME_new(int size)</div><div class="ttdoc">Allocate and initialize a hashtable instance.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00256">hashtable.h:256</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a73b7b0b1854d7b8336d3168aaa8fe755"><div class="ttname"><a href="hashtable_8h.html#a73b7b0b1854d7b8336d3168aaa8fe755">hashtable_t</a></div><div class="ttdeci">struct hashtable hashtable_t</div><div class="ttdoc">The hashtable type.</div></div>
<div class="ttc" id="ahashtable_8h_html_a7b951012b0e11016cdcbee035a283be1"><div class="ttname"><a href="hashtable_8h.html#a7b951012b0e11016cdcbee035a283be1">MATCH_t</a></div><div class="ttdeci">#define MATCH_t</div><div class="ttdoc">The match type.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00211">hashtable.h:211</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a804ac6e8aad00085226b5605e6300abd"><div class="ttname"><a href="hashtable_8h.html#a804ac6e8aad00085226b5605e6300abd">NAME_free</a></div><div class="ttdeci">static void NAME_free(hashtable_t *t)</div><div class="ttdoc">Destroy and free a hashtable instance.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00268">hashtable.h:268</a></div></div>
<div class="ttc" id="ahashtable_8h_html_a8f5751d4adbbec9c6b30848c951c14e7"><div class="ttname"><a href="hashtable_8h.html#a8f5751d4adbbec9c6b30848c951c14e7">NAME_add</a></div><div class="ttdeci">static ENTRY_t * NAME_add(hashtable_t *t, ENTRY_t *e)</div><div class="ttdoc">Add an entry to a hashtable.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00296">hashtable.h:296</a></div></div>
<div class="ttc" id="ahashtable_8h_html_ac1bb2e17d20ca0fc08ab9e02ecaa698f"><div class="ttname"><a href="hashtable_8h.html#ac1bb2e17d20ca0fc08ab9e02ecaa698f">mix32</a></div><div class="ttdeci">static unsigned mix32(unsigned h)</div><div class="ttdoc">MurmurHash3 finalization mix function.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00170">hashtable.h:170</a></div></div>
<div class="ttc" id="ahashtable_8h_html_ad3e0c9c023060284c0e81ff95ff25979"><div class="ttname"><a href="hashtable_8h.html#ad3e0c9c023060284c0e81ff95ff25979">nozero</a></div><div class="ttdeci">static unsigned nozero(unsigned h)</div><div class="ttdoc">Ensure hash's are never zero.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00181">hashtable.h:181</a></div></div>
<div class="ttc" id="astructhashtable_html"><div class="ttname"><a href="structhashtable.html">hashtable</a></div><div class="ttdoc">The hashtable type.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00128">hashtable.h:128</a></div></div>
<div class="ttc" id="astructhashtable_html_a2d26a02a9bc656f5acab82ee1f45c82e"><div class="ttname"><a href="structhashtable.html#a2d26a02a9bc656f5acab82ee1f45c82e">hashtable::find_count</a></div><div class="ttdeci">long find_count</div><div class="ttdoc">The count of finds tried.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00137">hashtable.h:137</a></div></div>
<div class="ttc" id="astructhashtable_html_a325ead2dc00a7fa743f74f7d70af04d7"><div class="ttname"><a href="structhashtable.html#a325ead2dc00a7fa743f74f7d70af04d7">hashtable::ktable</a></div><div class="ttdeci">unsigned ktable[]</div><div class="ttdoc">Table of hash keys.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00146">hashtable.h:146</a></div></div>
<div class="ttc" id="astructhashtable_html_a560df9089435475d6ba5cbd2e0d0076d"><div class="ttname"><a href="structhashtable.html#a560df9089435475d6ba5cbd2e0d0076d">hashtable::match_count</a></div><div class="ttdeci">long match_count</div><div class="ttdoc">The count of matches found.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00138">hashtable.h:138</a></div></div>
<div class="ttc" id="astructhashtable_html_a849d7b9cab945feabe177cd5e61f46a7"><div class="ttname"><a href="structhashtable.html#a849d7b9cab945feabe177cd5e61f46a7">hashtable::count</a></div><div class="ttdeci">int count</div><div class="ttdoc">Number of entries in hashtable.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00130">hashtable.h:130</a></div></div>
<div class="ttc" id="astructhashtable_html_aa4b5d6817ee43aae5cc08bff4c0b6b75"><div class="ttname"><a href="structhashtable.html#aa4b5d6817ee43aae5cc08bff4c0b6b75">hashtable::kbloom</a></div><div class="ttdeci">unsigned char * kbloom</div><div class="ttdoc">Bloom filter of hash keys with k=1.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00143">hashtable.h:143</a></div></div>
<div class="ttc" id="astructhashtable_html_aa5ee8c97823281612f138de984dd46f3"><div class="ttname"><a href="structhashtable.html#aa5ee8c97823281612f138de984dd46f3">hashtable::entrycmp_count</a></div><div class="ttdeci">long entrycmp_count</div><div class="ttdoc">The count of entry compares done.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00140">hashtable.h:140</a></div></div>
<div class="ttc" id="astructhashtable_html_ab62bd10297b090cfce7d728fd650e51d"><div class="ttname"><a href="structhashtable.html#ab62bd10297b090cfce7d728fd650e51d">hashtable::size</a></div><div class="ttdeci">int size</div><div class="ttdoc">Size of allocated hashtable.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00129">hashtable.h:129</a></div></div>
<div class="ttc" id="astructhashtable_html_ab89d13f1e21e46e4790780095e1f14a0"><div class="ttname"><a href="structhashtable.html#ab89d13f1e21e46e4790780095e1f14a0">hashtable::tmask</a></div><div class="ttdeci">unsigned tmask</div><div class="ttdoc">Mask to get the hashtable index.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00131">hashtable.h:131</a></div></div>
<div class="ttc" id="astructhashtable_html_ac624838d2888397a8374fb2aabd330fe"><div class="ttname"><a href="structhashtable.html#ac624838d2888397a8374fb2aabd330fe">hashtable::etable</a></div><div class="ttdeci">void ** etable</div><div class="ttdoc">Table of pointers to entries.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00145">hashtable.h:145</a></div></div>
<div class="ttc" id="astructhashtable_html_ad2995922a4f5fb09e8c0dcc092be91bf"><div class="ttname"><a href="structhashtable.html#ad2995922a4f5fb09e8c0dcc092be91bf">hashtable::hashcmp_count</a></div><div class="ttdeci">long hashcmp_count</div><div class="ttdoc">The count of hash compares done.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00139">hashtable.h:139</a></div></div>
<div class="ttc" id="astructhashtable_html_afe6082e065c17d152a5e00150edc9b40"><div class="ttname"><a href="structhashtable.html#afe6082e065c17d152a5e00150edc9b40">hashtable::bshift</a></div><div class="ttdeci">unsigned bshift</div><div class="ttdoc">Shift to get the bloomfilter index.</div><div class="ttdef"><b>Definition:</b> <a href="hashtable_8h_source.html#l00133">hashtable.h:133</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.10-->
<!-- start footer part -->
<!-- ad -->
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- librsync -->
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-3547096055927362"
data-ad-slot="8322976738"
data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
<!-- analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-71109100-1', 'auto');
ga('send', 'pageview');
</script>
<hr class="footer"/><address class="footer"><small>
Generated on Sun Feb 19 2023 16:26:49 for librsync by  <a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.9.4
</small></address>
</body>
</html>