]> git.ozlabs.org Git - ccan/blobdiff - ccan/intmap/intmap.c
intmap: add iterator-by-callback.
[ccan] / ccan / intmap / intmap.c
index ab6ddc9d87dd0763025a80912f2e049dfc96c01b..3473ef3236159fc834aaffad1a4ba81977937ca1 100644 (file)
@@ -264,3 +264,19 @@ void intmap_clear_(struct intmap *map)
                clear(*map);
        intmap_init_(map);
 }
+
+bool intmap_iterate_(const struct intmap *n,
+                    bool (*handle)(intmap_index_t, void *, void *),
+                    void *data,
+                    intmap_index_t offset)
+{
+       /* Can only happen at root */
+       if (intmap_empty_(n))
+               return true;
+
+       if (n->v)
+               return handle(n->u.i - offset, n->v, data);
+
+       return intmap_iterate_(&n->u.n->child[0], handle, data, offset)
+               && intmap_iterate_(&n->u.n->child[1], handle, data, offset);
+}