]> git.ozlabs.org Git - ccan/blobdiff - ccan/htable/htable.h
htable: optimize a little more.
[ccan] / ccan / htable / htable.h
index 938b43afc89ce5a6603c45761da17d26b748475e..358b74280867c8694fd90ce11689091fd57055fd 100644 (file)
  * 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, perfect_bitnum;
        size_t elems, deleted;
-       /* These are the bits which are the same in all pointers. */
-       uintptr_t common_mask, common_bits;
        uintptr_t *table;
 };
 
@@ -49,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, -1, 0, &name.common_bits }
+       { 0, -1, rehash, priv, 0, 0, 0, 0, &name.common_bits }
 
 /**
  * htable_init - initialize an empty hash table.
@@ -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
@@ -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!