@@ -28,7 +28,6 @@ typedef struct A
28
28
B * * bucket ;
29
29
size_t size ;
30
30
size_t bucket_count ;
31
- int saturated ;
32
31
}
33
32
A ;
34
33
@@ -185,21 +184,50 @@ JOIN(A, swap)(A* self, A* other)
185
184
}
186
185
187
186
static inline size_t
188
- JOIN (A , closest_prime )(size_t number , int * saturated )
189
- {
190
- static size_t primes [] = {
191
- 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 , 79 , 83 , 89 , 97 ,
192
- 103 , 109 , 113 , 127 , 137 , 139 , 149 , 157 , 167 , 179 , 193 , 199 , 211 , 227 , 241 , 257 , 277 , 293 , 313 , 337 ,
193
- 359 , 383 , 409 , 439 , 467 , 503 , 541 , 577 , 619 , 661 , 709 , 761 , 823 , 887 , 953 , 1031 , 1109 , 1193 , 1289 , 1381 ,
194
- 1493 , 1613 , 1741 , 1879 , 2029 , 2179 , 2357 , 2549 , 2753 , 2971 , 3209 , 3469 , 3739 , 4027 , 4349 ,
195
- 4703 , 5087 , 5503 , 5953 , 6427 , 6949 , 7517 , 8123 , 8783 , 9497 , 10273 , 11113 , 12011 , 12983 , 14033 ,
196
- 15173 , 16411 , 17749 , 19183 , 20753 , 22447 , 24281 , 26267 , 28411 , 30727 , 33223 , 35933 , 38873 , 42043 , 45481 ,
197
- 49201 , 53201 , 57557 , 62233 , 67307 , 72817 , 78779 , 85229 , 92203 , 99733 , 107897 , 116731 , 126271 , 136607 , 147793 ,
198
- 159871 , 172933 , 187091 , 202409 , 218971 , 236897 , 256279 , 277261 , 299951 , 324503 , 351061 , 379787 , 410857 , 444487 ,
199
- 480881 , 520241 , 562841 , 608903 , 658753 , 712697 , 771049 , 834181 , 902483 , 976369 , 1056323 , 1142821 , 1236397 , 1337629 ,
200
- 1447153 , 1565659 , 1693859 , 1832561 , 1982627 , 2144977 , 2320627 , 2510653 , 2716249 , 2938679 , 3179303 , 3439651 , 3721303 ,
201
- 4026031 , 4355707 , 4712381 , 5098259 , 5515729 , 5967347 , 6456007 , 6984629 , 7556579 , 8175383 , 8844859 , 9569143 , 10352717 ,
202
- 11200489 , 12117689 , 13109983 , 14183539 , 15345007 , 16601593 , 17961079 , 19431899 , 21023161 , 22744717 , 24607243
187
+ JOIN (A , closest_prime )(size_t number )
188
+ {
189
+ static uint32_t primes [] = {
190
+ 2 , 3 , 5 , 7 , 11 ,
191
+ 13 , 17 , 19 , 23 , 29 , 31 ,
192
+ 37 , 41 , 43 , 47 , 53 , 59 ,
193
+ 61 , 67 , 71 , 73 , 79 , 83 ,
194
+ 89 , 97 , 103 , 109 , 113 , 127 ,
195
+ 137 , 139 , 149 , 157 , 167 , 179 ,
196
+ 193 , 199 , 211 , 227 , 241 , 257 ,
197
+ 277 , 293 , 313 , 337 , 359 , 383 ,
198
+ 409 , 439 , 467 , 503 , 541 , 577 ,
199
+ 619 , 661 , 709 , 761 , 823 , 887 ,
200
+ 953 , 1031 , 1109 , 1193 , 1289 , 1381 ,
201
+ 1493 , 1613 , 1741 , 1879 , 2029 , 2179 ,
202
+ 2357 , 2549 , 2753 , 2971 , 3209 , 3469 ,
203
+ 3739 , 4027 , 4349 , 4703 , 5087 , 5503 ,
204
+ 5953 , 6427 , 6949 , 7517 , 8123 , 8783 ,
205
+ 9497 , 10273 , 11113 , 12011 , 12983 , 14033 ,
206
+ 15173 , 16411 , 17749 , 19183 , 20753 , 22447 ,
207
+ 24281 , 26267 , 28411 , 30727 , 33223 , 35933 ,
208
+ 38873 , 42043 , 45481 , 49201 , 53201 , 57557 ,
209
+ 62233 , 67307 , 72817 , 78779 , 85229 , 92203 ,
210
+ 99733 , 107897 , 116731 , 126271 , 136607 , 147793 ,
211
+ 159871 , 172933 , 187091 , 202409 , 218971 , 236897 ,
212
+ 256279 , 277261 , 299951 , 324503 , 351061 , 379787 ,
213
+ 410857 , 444487 , 480881 , 520241 , 562841 , 608903 ,
214
+ 658753 , 712697 , 771049 , 834181 , 902483 , 976369 ,
215
+ 1056323 , 1142821 , 1236397 , 1337629 , 1447153 , 1565659 ,
216
+ 1693859 , 1832561 , 1982627 , 2144977 , 2320627 , 2510653 ,
217
+ 2716249 , 2938679 , 3179303 , 3439651 , 3721303 , 4026031 ,
218
+ 4355707 , 4712381 , 5098259 , 5515729 , 5967347 , 6456007 ,
219
+ 6984629 , 7556579 , 8175383 , 8844859 , 9569143 , 10352717 ,
220
+ 11200489 , 12117689 , 13109983 , 14183539 , 15345007 , 16601593 ,
221
+ 17961079 , 19431899 , 21023161 , 22744717 , 24607243 , 26622317 ,
222
+ 28802401 , 31160981 , 33712729 , 36473443 , 39460231 , 42691603 ,
223
+ 46187573 , 49969847 , 54061849 , 58488943 , 63278561 , 68460391 ,
224
+ 74066549 , 80131819 , 86693767 , 93793069 , 101473717 , 109783337 ,
225
+ 118773397 , 128499677 , 139022417 , 150406843 , 162723577 , 176048909 ,
226
+ 190465427 , 206062531 , 222936881 , 241193053 , 260944219 , 282312799 ,
227
+ 305431229 , 330442829 , 357502601 , 386778277 , 418451333 , 452718089 ,
228
+ 489790921 , 529899637 , 573292817 , 620239453 , 671030513 , 725980837 ,
229
+ 785430967 , 849749479 , 919334987 , 994618837 , 1076067617 , 1164186217 ,
230
+ 1259520799 , 1362662261 , 1474249943 , 1594975441 , 1725587117 ,
203
231
};
204
232
size_t min = primes [0 ];
205
233
if (number < min )
@@ -212,8 +240,6 @@ JOIN(A, closest_prime)(size_t number, int* saturated)
212
240
if (number >= a && number <= b )
213
241
return number == a ? a : b ;
214
242
}
215
- if (saturated )
216
- * saturated = 1 ;
217
243
return primes [size - 1 ];
218
244
}
219
245
@@ -272,31 +298,29 @@ JOIN(A, rehash)(A* self, size_t desired_count);
272
298
static inline void
273
299
JOIN (A , reserve )(A * self , size_t desired_count )
274
300
{
275
- if (!self -> saturated )
301
+ if (self -> size > 0 )
302
+ JOIN (A , rehash )(self , desired_count );
303
+ else
276
304
{
277
- if (self -> size > 0 )
278
- JOIN (A , rehash )(self , desired_count );
279
- else
280
- {
281
- size_t bucket_count = JOIN (A , closest_prime )(desired_count , & self -> saturated );
282
- B * * temp = (B * * ) calloc (bucket_count , sizeof (B * ));
283
- for (size_t i = 0 ; i < self -> bucket_count ; i ++ )
284
- temp [i ] = self -> bucket [i ];
285
- free (self -> bucket );
286
- self -> bucket = temp ;
287
- self -> bucket_count = bucket_count ;
288
- }
305
+ size_t bucket_count = JOIN (A , closest_prime )(desired_count );
306
+ B * * temp = (B * * ) calloc (bucket_count , sizeof (B * ));
307
+ for (size_t i = 0 ; i < self -> bucket_count ; i ++ )
308
+ temp [i ] = self -> bucket [i ];
309
+ free (self -> bucket );
310
+ self -> bucket = temp ;
311
+ self -> bucket_count = bucket_count ;
289
312
}
290
313
}
291
314
292
315
static inline void
293
316
JOIN (A , rehash )(A * self , size_t desired_count )
294
317
{
295
- if (!self -> saturated )
318
+ if (desired_count <= self -> size )
319
+ desired_count = self -> size + 1 ;
320
+ size_t expected = JOIN (A , closest_prime )(desired_count );
321
+ if (expected != self -> bucket_count )
296
322
{
297
323
A rehashed = JOIN (A , init )(self -> hash , self -> equal );
298
- if (desired_count <= self -> size )
299
- desired_count = self -> size + 1 ;
300
324
JOIN (A , reserve )(& rehashed , desired_count );
301
325
foreach (A , self , it )
302
326
{
0 commit comments