From 79c83ef73cf842a3e74b19fa53f2f06e0b054707 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 11 Jan 2026 14:03:51 +0000 Subject: [PATCH] mie: id: add iteration support to mie_id_map --- mie/id.c | 90 ++++++++++++++++++++++++++++++-------------- mie/include/mie/id.h | 30 +++++++++++---- 2 files changed, 85 insertions(+), 35 deletions(-) diff --git a/mie/id.c b/mie/id.c index 29a50f7..ae056e2 100644 --- a/mie/id.c +++ b/mie/id.c @@ -118,34 +118,6 @@ void mie_id_to_string(const mie_id *id, char *out, size_t max) } } -void mie_id_map_init(struct mie_id_map *map, const mie_id *ns) -{ - memset(map, 0x0, sizeof *map); - - map->map_ns_id = *ns; -} - -const mie_id *mie_id_map_get_ns(const struct mie_id_map *map) -{ - return &map->map_ns_id; -} - -void mie_id_map_put(struct mie_id_map *map, mie_id *id, const b_rope *name) -{ - mie_id_init_ns(id, &map->map_ns_id, name); - put_id(&map->map_entries, id); -} - -void mie_id_map_put_id(struct mie_id_map *map, mie_id *node) -{ - put_id(&map->map_entries, node); -} - -mie_id *mie_id_map_get(const struct mie_id_map *map, mie_id *id) -{ - return get_id(&map->map_entries, id); -} - void mie_id_builder_begin(struct mie_id_builder *builder, const mie_id *ns) { memset(builder, 0x0, sizeof *builder); @@ -181,3 +153,65 @@ void mie_id_builder_end(struct mie_id_builder *builder, mie_id *out) out->id_bytes[8] &= 0x3F; out->id_bytes[8] |= 0x80; } + +void mie_id_map_init(struct mie_id_map *map, const mie_id *ns) +{ + memset(map, 0x0, sizeof *map); + + map->map_ns_id = *ns; +} + +const mie_id *mie_id_map_get_ns(const struct mie_id_map *map) +{ + return &map->map_ns_id; +} + +void mie_id_map_put(struct mie_id_map *map, mie_id *id, const b_rope *name) +{ + mie_id_init_ns(id, &map->map_ns_id, name); + put_id(&map->map_entries, id); +} + +void mie_id_map_put_id(struct mie_id_map *map, mie_id *node) +{ + put_id(&map->map_entries, node); +} + +mie_id *mie_id_map_get(const struct mie_id_map *map, mie_id *id) +{ + return get_id(&map->map_entries, id); +} + +enum mie_status mie_id_map_iterator_begin( + struct mie_id_map_iterator *it, const struct mie_id_map *map) +{ + memset(it, 0x0, sizeof *it); + + it->_n = b_btree_first(&map->map_entries); + + if (!it->_n) { + return MIE_ERR_NO_DATA; + } + + it->it_id = b_unbox(mie_id, it->_n, e_node); + + return MIE_SUCCESS; +} + +enum mie_status mie_id_map_iterator_move_next(struct mie_id_map_iterator *it) +{ + if (!it->_n) { + it->it_id = NULL; + return MIE_ERR_NO_DATA; + } + + it->_n = b_btree_next(it->_n); + if (!it->_n) { + it->it_id = NULL; + return MIE_ERR_NO_DATA; + } + + it->it_id = b_unbox(mie_id, it->_n, e_node); + + return MIE_SUCCESS; +} diff --git a/mie/include/mie/id.h b/mie/include/mie/id.h index c556cfa..76cc7a5 100644 --- a/mie/include/mie/id.h +++ b/mie/include/mie/id.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -55,6 +56,11 @@ struct mie_id_map { b_btree map_entries; }; +struct mie_id_map_iterator { + mie_id *it_id; + b_btree_node *_n; +}; + MIE_API void mie_id_init( mie_id *out, uint32_t a, uint16_t b, uint16_t c, uint16_t d, uint64_t e); MIE_API void mie_id_init_zero(mie_id *out); @@ -68,13 +74,6 @@ static inline int mie_id_compare(const mie_id *a, const mie_id *b) MIE_API void mie_id_to_string(const mie_id *id, char *out, size_t max); -MIE_API void mie_id_map_init(struct mie_id_map *map, const mie_id *ns); -MIE_API const mie_id *mie_id_map_get_ns(const struct mie_id_map *map); -MIE_API void mie_id_map_put( - struct mie_id_map *map, mie_id *node, const b_rope *name); -MIE_API void mie_id_map_put_id(struct mie_id_map *map, mie_id *node); -MIE_API mie_id *mie_id_map_get(const struct mie_id_map *map, mie_id *id); - MIE_API void mie_id_builder_begin(struct mie_id_builder *builder, const mie_id *ns); MIE_API void mie_id_builder_add( struct mie_id_builder *builder, const void *p, size_t len); @@ -93,4 +92,21 @@ MIE_API void mie_id_builder_add_marker( struct mie_id_builder *builder, enum mie_id_builder_marker marker); MIE_API void mie_id_builder_end(struct mie_id_builder *builder, mie_id *out); +MIE_API void mie_id_map_init(struct mie_id_map *map, const mie_id *ns); +static inline bool mie_id_map_empty(const struct mie_id_map *map) +{ + return b_btree_empty(&map->map_entries); +} + +MIE_API const mie_id *mie_id_map_get_ns(const struct mie_id_map *map); +MIE_API void mie_id_map_put( + struct mie_id_map *map, mie_id *node, const b_rope *name); +MIE_API void mie_id_map_put_id(struct mie_id_map *map, mie_id *node); +MIE_API mie_id *mie_id_map_get(const struct mie_id_map *map, mie_id *id); + +MIE_API enum mie_status mie_id_map_iterator_begin( + struct mie_id_map_iterator *it, const struct mie_id_map *map); +MIE_API enum mie_status mie_id_map_iterator_move_next( + struct mie_id_map_iterator *it); + #endif