X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fintmap%2Fintmap.c;h=3473ef3236159fc834aaffad1a4ba81977937ca1;hb=9e92552b1b2a1b631bde1c379b9f2950725b1245;hp=ab6ddc9d87dd0763025a80912f2e049dfc96c01b;hpb=e59acd521d11c1f392264762d79195fd6cc2b992;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); +}