X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fintmap%2Fintmap.c;fp=ccan%2Fintmap%2Fintmap.c;h=3473ef3236159fc834aaffad1a4ba81977937ca1;hb=1e888a93a79132f28f59319558187278badbe418;hp=ab6ddc9d87dd0763025a80912f2e049dfc96c01b;hpb=a241664cddd9c1a9a66064171f871ae52598b82b;p=ccan diff --git a/ccan/intmap/intmap.c b/ccan/intmap/intmap.c index ab6ddc9d..3473ef32 100644 --- a/ccan/intmap/intmap.c +++ b/ccan/intmap/intmap.c @@ -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); +}