X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fhtable%2Fhtable.h;h=358b74280867c8694fd90ce11689091fd57055fd;hb=0f144bfe0ca3cc06564e19a7f3ea40177d1a3c2c;hp=28755d617d67b7766d44fe3e5ce93d7956a85d55;hpb=7a353c03e5e8cdd55cbc0917f9ecff5cf9beefdb;p=ccan diff --git a/ccan/htable/htable.h b/ccan/htable/htable.h index 28755d61..358b7428 100644 --- a/ccan/htable/htable.h +++ b/ccan/htable/htable.h @@ -22,13 +22,12 @@ * supply inline functions. */ struct htable { + /* These are the bits which are the same in all pointers. */ + uintptr_t common_bits, common_mask; size_t (*rehash)(const void *elem, void *priv); void *priv; - unsigned int bits; - size_t elems, deleted, max, max_with_deleted; - /* These are the bits which are the same in all pointers. */ - uintptr_t common_mask, common_bits; - uintptr_t perfect_bit; + unsigned int bits, perfect_bitnum; + size_t elems, deleted; uintptr_t *table; }; @@ -50,7 +49,7 @@ struct htable { * static struct htable ht = HTABLE_INITIALIZER(ht, rehash, NULL); */ #define HTABLE_INITIALIZER(name, rehash, priv) \ - { rehash, priv, 0, 0, 0, 0, 0, -1, 0, 0, &name.perfect_bit } + { 0, -1, rehash, priv, 0, 0, 0, 0, &name.common_bits } /** * htable_init - initialize an empty hash table. @@ -76,6 +75,15 @@ bool htable_init_sized(struct htable *ht, size_t (*rehash)(const void *elem, void *priv), void *priv, size_t size); +/** + * htable_count - count number of entries in a hash table. + * @ht: the hash table + */ +static inline size_t htable_count(const struct htable *ht) +{ + return ht->elems; +} + /** * htable_clear - empty a hash table. * @ht: the hash table to clear @@ -259,6 +267,19 @@ void *htable_prev_(const struct htable *htable, struct htable_iter *i); htable_delval_(htable_debug(htable, HTABLE_LOC), i) void htable_delval_(struct htable *ht, struct htable_iter *i); +/** + * htable_pick - set iterator to a random valid entry. + * @ht: the htable + * @seed: a random number to use. + * @i: the htable_iter which is output (or NULL). + * + * Usually used with htable_delval to delete a random entry. Returns + * NULL iff the table is empty, otherwise a random entry. + */ +#define htable_pick(htable, seed, i) \ + htable_pick_(htable_debug(htable, HTABLE_LOC), seed, i) +void *htable_pick_(const struct htable *ht, size_t seed, struct htable_iter *i); + /** * htable_set_allocator - set calloc/free functions. * @alloc: allocator to use, must zero memory!