* 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;
};
* 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.
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
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!