mie: name: add a mie_name destructor that removes it from its parent name map

This commit is contained in:
2025-08-16 20:54:05 +01:00
parent 44e242615b
commit d8f4f319e9
2 changed files with 40 additions and 0 deletions

View File

@@ -4,6 +4,10 @@
#include <blue/core/btree.h>
#include <blue/core/queue.h>
#define MIE_NAME_VALID(p) (((p)->n_str) != NULL)
struct mie_name_map;
enum mie_name_map_flags {
MIE_NAME_MAP_STRICT = 0x01u,
};
@@ -25,6 +29,7 @@ struct mie_name_map_entry {
struct mie_name {
struct mie_name_map_entry n_base;
struct mie_name_map *n_parent;
char *n_str;
};
@@ -45,4 +50,6 @@ extern struct mie_name *mie_name_map_put(
struct mie_name_map *map, struct mie_name *entry, const char *hint,
enum mie_name_map_flags flags);
extern void mie_name_destroy(struct mie_name *name);
#endif

View File

@@ -145,6 +145,7 @@ struct mie_name *mie_name_map_put(
b_status status = put_name(map, entry);
if (B_OK(status)) {
entry->n_parent = map;
entry->n_str = b_strdup(str);
return entry;
}
@@ -184,6 +185,7 @@ struct mie_name *mie_name_map_put(
b_status status = put_name(map, entry);
if (B_OK(status)) {
entry->n_parent = map;
entry->n_str = b_strdup(str);
b_rope_destroy(&unique_name);
return entry;
@@ -194,3 +196,34 @@ struct mie_name *mie_name_map_put(
return NULL;
}
void mie_name_destroy(struct mie_name *name)
{
struct mie_name_map *parent = name->n_parent;
struct mie_name_map_entry *entry
= get_entry(&parent->m_entries, name->n_base.e_hash);
struct mie_name_bucket *bucket = NULL;
if (!entry) {
return;
}
switch (entry->e_type) {
case MIE_NAME_MAP_E_NAME:
b_btree_delete(&parent->m_entries, &entry->e_node);
break;
case MIE_NAME_MAP_E_BUCKET:
bucket = b_unbox(struct mie_name_bucket, entry, b_base);
b_queue_delete(&bucket->b_names, &name->n_base.e_entry);
break;
default:
abort();
return;
}
name->n_parent = NULL;
if (name->n_str) {
free(name->n_str);
name->n_str = NULL;
}
}