X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fhtable%2Fhtable.h;h=03193567d847a5512b31d173bcb8a21a6d54d09e;hp=938b43afc89ce5a6603c45761da17d26b748475e;hb=HEAD;hpb=d615e534e870a911f11b7b88021242220ea053bf diff --git a/ccan/htable/htable.h b/ccan/htable/htable.h index 938b43af..faaf541b 100644 --- a/ccan/htable/htable.h +++ b/ccan/htable/htable.h @@ -75,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 @@ -123,7 +132,7 @@ bool htable_copy_(struct htable *dst, const struct htable *src); * htable_add - add a pointer into a hash table. * @ht: the htable * @hash: the hash value of the object - * @p: the non-NULL pointer + * @p: the non-NULL pointer (also cannot be (void *)1). * * Also note that this can only fail due to allocation failure. Otherwise, it * returns true. @@ -258,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!