Add new function l_hashmap_find() which is similar to foreach.
The find will start to call a user supplied function for every
entry in hashmap. If user function returns true, then the find
will return and not call remaining hash elements.
---
ell/hashmap.c | 39 +++++++++++++++++++++++++++++++++++++++
ell/hashmap.h | 5 +++++
2 files changed, 44 insertions(+)
diff --git a/ell/hashmap.c b/ell/hashmap.c
index 6c7c10f..03fcd7c 100644
--- a/ell/hashmap.c
+++ b/ell/hashmap.c
@@ -687,3 +687,42 @@ LIB_EXPORT bool l_hashmap_isempty(struct l_hashmap *hashmap)
return hashmap->entries == 0;
}
+
+/**
+ * l_hashmap_find:
+ * @hashmap: hash table object
+ * @function: callback function
+ * @user_data: user data given to callback function
+ *
+ * Call @function for every entry in @hashmap. If @function returns true,
+ * then quit calling @function.
+ **/
+LIB_EXPORT void l_hashmap_find(struct l_hashmap *hashmap,
+ l_hashmap_find_func_t function, void *user_data)
+{
+ unsigned int i;
+
+ if (unlikely(!hashmap || !function))
+ return;
+
+ for (i = 0; i < NBUCKETS; i++) {
+ struct entry *entry, *head = &hashmap->buckets[i];
+
+ if (!head->next)
+ continue;
+
+ for (entry = head;; entry = entry->next) {
+ bool found;
+
+ if (!entry->removed) {
+ found = function(entry->key, entry->value,
+ user_data);
+ if (found)
+ return;
+ }
+
+ if (entry->next == head)
+ break;
+ }
+ }
+}
diff --git a/ell/hashmap.h b/ell/hashmap.h
index a904109..3085477 100644
--- a/ell/hashmap.h
+++ b/ell/hashmap.h
@@ -31,6 +31,8 @@ extern "C" {
typedef void (*l_hashmap_foreach_func_t) (const void *key, void *value,
void *user_data);
+typedef bool (*l_hashmap_find_func_t) (const void *key, void *value,
+ void *user_data);
typedef void (*l_hashmap_destroy_func_t) (void *value);
typedef unsigned int (*l_hashmap_hash_func_t) (const void *p);
typedef int (*l_hashmap_compare_func_t) (const void *a, const void *b);
@@ -70,6 +72,9 @@ void *l_hashmap_lookup(struct l_hashmap *hashmap, const void *key);
void l_hashmap_foreach(struct l_hashmap *hashmap,
l_hashmap_foreach_func_t function, void *user_data);
+void l_hashmap_find(struct l_hashmap *hashmap,
+ l_hashmap_find_func_t function, void *user_data);
+
unsigned int l_hashmap_size(struct l_hashmap *hashmap);
bool l_hashmap_isempty(struct l_hashmap *hashmap);
--
1.8.3.1