mie: id: add iteration support to mie_id_map
This commit is contained in:
90
mie/id.c
90
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;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <blue/core/queue.h>
|
||||
#include <blue/core/rope.h>
|
||||
#include <mie/misc.h>
|
||||
#include <mie/status.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user