2
2
#include <string.h>
3
3
#include "khashp.h"
4
4
5
+ #ifdef KHASHP_STATIC
6
+ #define KHP_SCOPE static inline
7
+ #else
8
+ #define KHP_SCOPE
9
+ #endif
10
+
5
11
#define kh_max_count (cap ) (((cap)>>1) + ((cap)>>2)) /* default load factor: 75% */
6
12
7
13
#define MALLOC (type , cnt ) ((type*)malloc((cnt) * sizeof(type)))
@@ -31,7 +37,7 @@ static int khp_key_eq0(const void *key1, const void *key2, uint32_t key_len) //
31
37
return memcmp (key1 , key2 , key_len ) == 0 ;
32
38
}
33
39
34
- khashp_t * khp_init (uint32_t key_len , uint32_t val_len , khp_hash_fn_t fn , khp_key_eq_t eq )
40
+ KHP_SCOPE khashp_t * khp_init (uint32_t key_len , uint32_t val_len , khp_hash_fn_t fn , khp_key_eq_t eq )
35
41
{
36
42
khashp_t * h = CALLOC (khashp_t , 1 );
37
43
h -> key_len = key_len , h -> val_len = val_len ;
@@ -40,21 +46,21 @@ khashp_t *khp_init(uint32_t key_len, uint32_t val_len, khp_hash_fn_t fn, khp_key
40
46
return h ;
41
47
}
42
48
43
- void khp_destroy (khashp_t * h )
49
+ KHP_SCOPE void khp_destroy (khashp_t * h )
44
50
{
45
51
if (h == 0 ) return ;
46
52
free (h -> b ); free (h );
47
53
}
48
54
49
- void khp_clear (khashp_t * h )
55
+ KHP_SCOPE void khp_clear (khashp_t * h )
50
56
{
51
57
if (h == 0 || h -> used == 0 ) return ;
52
58
khint_t n_buckets = (khint_t )1U << h -> bits ;
53
59
memset (h -> used , 0 , __kh_fsize (n_buckets ) * sizeof (uint32_t ));
54
60
h -> count = 0 ;
55
61
}
56
62
57
- khint_t khp_get (const khashp_t * h , const void * key )
63
+ KHP_SCOPE khint_t khp_get (const khashp_t * h , const void * key )
58
64
{
59
65
khint_t i , last , n_buckets , mask , hash ;
60
66
if (h -> b == 0 ) return 0 ;
@@ -69,7 +75,7 @@ khint_t khp_get(const khashp_t *h, const void *key)
69
75
return !__kh_used (h -> used , i )? n_buckets : i ;
70
76
}
71
77
72
- int khp_resize (khashp_t * h , khint_t new_n_buckets )
78
+ KHP_SCOPE int khp_resize (khashp_t * h , khint_t new_n_buckets )
73
79
{
74
80
uint32_t * new_used = 0 ;
75
81
uint8_t * tmp ;
@@ -120,7 +126,7 @@ int khp_resize(khashp_t *h, khint_t new_n_buckets)
120
126
return 0 ;
121
127
}
122
128
123
- khint_t khp_put (khashp_t * h , const void * key , int * absent )
129
+ KHP_SCOPE khint_t khp_put (khashp_t * h , const void * key , int * absent )
124
130
{
125
131
khint_t n_buckets , i , last , mask , hash ;
126
132
n_buckets = h -> b ? (khint_t )1U <<h -> bits : 0U ;
@@ -146,7 +152,7 @@ khint_t khp_put(khashp_t *h, const void *key, int *absent)
146
152
return i ;
147
153
}
148
154
149
- int khp_del (khashp_t * h , khint_t i )
155
+ KHP_SCOPE int khp_del (khashp_t * h , khint_t i )
150
156
{
151
157
khint_t j = i , k , mask , n_buckets ;
152
158
if (h -> b == 0 ) return 0 ;
@@ -164,19 +170,19 @@ int khp_del(khashp_t *h, khint_t i)
164
170
return 1 ;
165
171
}
166
172
167
- void khp_get_val (const khashp_t * h , khint_t i , void * v )
173
+ KHP_SCOPE void khp_get_val (const khashp_t * h , khint_t i , void * v )
168
174
{
169
175
uint8_t * p = (uint8_t * )khp_get_bucket (h , i ) + h -> key_len ;
170
176
if (h -> val_len > 0 ) memcpy (v , p , h -> val_len );
171
177
}
172
178
173
- void khp_set_val (const khashp_t * h , khint_t i , const void * v )
179
+ KHP_SCOPE void khp_set_val (const khashp_t * h , khint_t i , const void * v )
174
180
{
175
181
uint8_t * p = (uint8_t * )khp_get_bucket (h , i ) + h -> key_len ;
176
182
if (h -> val_len > 0 ) memcpy (p , v , h -> val_len );
177
183
}
178
184
179
- void khp_get_key (const khashp_t * h , khint_t i , void * p )
185
+ KHP_SCOPE void khp_get_key (const khashp_t * h , khint_t i , void * p )
180
186
{
181
187
memcpy (p , khp_get_bucket (h , i ), h -> key_len );
182
188
}
@@ -203,14 +209,14 @@ static int kh_str_key_eq(const void *s1, const void *s2, uint32_t key_len)
203
209
return strcmp (p1 , p2 ) == 0 ;
204
210
}
205
211
206
- khashp_t * khp_str_init (uint32_t val_len , int dup )
212
+ KHP_SCOPE khashp_t * khp_str_init (uint32_t val_len , int dup )
207
213
{
208
214
khashp_t * h = khp_init (sizeof (void * ), val_len , khp_str_hash_fn , kh_str_key_eq );
209
215
h -> dup = !!dup ;
210
216
return h ;
211
217
}
212
218
213
- void khp_str_destroy (khashp_t * h )
219
+ KHP_SCOPE void khp_str_destroy (khashp_t * h )
214
220
{
215
221
if (h -> dup ) {
216
222
khint_t k ;
@@ -223,12 +229,12 @@ void khp_str_destroy(khashp_t *h)
223
229
khp_destroy (h );
224
230
}
225
231
226
- khint_t khp_str_get (const khashp_t * h , const char * key )
232
+ KHP_SCOPE khint_t khp_str_get (const khashp_t * h , const char * key )
227
233
{
228
234
return khp_get (h , & key );
229
235
}
230
236
231
- khint_t khp_str_put (khashp_t * h , const char * key , int * absent )
237
+ KHP_SCOPE khint_t khp_str_put (khashp_t * h , const char * key , int * absent )
232
238
{
233
239
khint_t k = khp_put (h , & key , absent );
234
240
if (* absent ) {
@@ -244,7 +250,7 @@ khint_t khp_str_put(khashp_t *h, const char *key, int *absent)
244
250
return k ;
245
251
}
246
252
247
- int khp_str_del (khashp_t * h , khint_t i )
253
+ KHP_SCOPE int khp_str_del (khashp_t * h , khint_t i )
248
254
{
249
255
if (h -> b == 0 ) return 0 ;
250
256
if (h -> dup ) {
0 commit comments