{
return hash->count;
}
+
+void hash_iter_init(const struct hash *hash, struct hash_iter *iter)
+{
+ iter->hash = hash;
+ iter->bucket = 0;
+ iter->entry = -1;
+}
+
+bool hash_iter_next(struct hash_iter *iter, const char **key,
+ const void **value)
+{
+ const struct hash_bucket *b = iter->hash->buckets + iter->bucket;
+ const struct hash_entry *e;
+
+ iter->entry++;
+
+ if (iter->entry >= b->used) {
+ iter->entry = 0;
+
+ for (iter->bucket++; iter->bucket < iter->hash->n_buckets;
+ iter->bucket++) {
+ b = iter->hash->buckets + iter->bucket;
+
+ if (b->used > 0)
+ break;
+ }
+
+ if (iter->bucket >= iter->hash->n_buckets)
+ return false;
+ }
+
+ e = b->entries + iter->entry;
+
+ if (value != NULL)
+ *value = e->value;
+ if (key != NULL)
+ *key = e->key;
+
+ return true;
+}
#ifndef _LIBKMOD_HASH_H_
#define _LIBKMOD_HASH_H_
+#include <stdbool.h>
+
struct hash;
+
+struct hash_iter {
+ const struct hash *hash;
+ unsigned int bucket;
+ unsigned int entry;
+};
+
struct hash *hash_new(unsigned int n_buckets, void (*free_value)(void *value));
void hash_free(struct hash *hash);
int hash_add(struct hash *hash, const char *key, const void *value);
int hash_del(struct hash *hash, const char *key);
void *hash_find(const struct hash *hash, const char *key);
unsigned int hash_get_count(const struct hash *hash);
+void hash_iter_init(const struct hash *hash, struct hash_iter *iter);
+bool hash_iter_next(struct hash_iter *iter, const char **key,
+ const void **value);
#endif