X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fhtable%2Fhtable.c;h=59048dc0ada0df95b23583e0dfbba65d3c96768c;hb=c23a40c7f1ac9fad0146b46988a41f196aae933f;hp=b7e65d11966acc96be83dffbb25a273fec153145;hpb=3ea7b4d695237414015f33674d6ba01009e77fd1;p=ccan diff --git a/ccan/htable/htable.c b/ccan/htable/htable.c index b7e65d11..59048dc0 100644 --- a/ccan/htable/htable.c +++ b/ccan/htable/htable.c @@ -52,6 +52,29 @@ void htable_init(struct htable *ht, ht->table = &ht->perfect_bit; } +bool htable_init_sized(struct htable *ht, + size_t (*rehash)(const void *, void *), + void *priv, size_t expect) +{ + htable_init(ht, rehash, priv); + + /* Don't go insane with sizing. */ + for (ht->bits = 1; ((size_t)3 << ht->bits) / 4 < expect; ht->bits++) { + if (ht->bits == 30) + break; + } + + ht->table = calloc(1 << ht->bits, sizeof(size_t)); + if (!ht->table) { + ht->table = &ht->perfect_bit; + return false; + } + ht->max = ((size_t)3 << ht->bits) / 4; + ht->max_with_deleted = ((size_t)9 << ht->bits) / 10; + + return true; +} + void htable_clear(struct htable *ht) { if (ht->table != &ht->perfect_bit)