Add the ability to copy a ref trie.
This commit is contained in:
parent
92186911ad
commit
8f48a16a25
|
@ -53,6 +53,14 @@ typedef struct libab_ref_trie_s libab_ref_trie;
|
||||||
* @param trie the trie to initialize.
|
* @param trie the trie to initialize.
|
||||||
*/
|
*/
|
||||||
void libab_ref_trie_init(libab_ref_trie* trie);
|
void libab_ref_trie_init(libab_ref_trie* trie);
|
||||||
|
/**
|
||||||
|
* Initializes a new trie with a shallow copy of another.
|
||||||
|
* @param trie the trie to initialize.
|
||||||
|
* @param copy_of the trie to copy.
|
||||||
|
* @return the result of the initialization.
|
||||||
|
*/
|
||||||
|
libab_result libab_ref_trie_init_copy(libab_ref_trie* trie,
|
||||||
|
const libab_ref_trie* copy_of);
|
||||||
/**
|
/**
|
||||||
* Stores a reference counted value into the trie.
|
* Stores a reference counted value into the trie.
|
||||||
* This releases the reference for the given key, if one
|
* This releases the reference for the given key, if one
|
||||||
|
|
|
@ -6,6 +6,62 @@ void libab_ref_trie_init(libab_ref_trie* trie) {
|
||||||
trie->head = NULL;
|
trie->head = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _libab_ref_trie_free(libab_ref_trie_node* node) {
|
||||||
|
if (node == NULL)
|
||||||
|
return;
|
||||||
|
_libab_ref_trie_free(node->next);
|
||||||
|
_libab_ref_trie_free(node->child);
|
||||||
|
libab_ref_free(&node->ref);
|
||||||
|
free(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
libab_result _libab_ref_trie_copy(const libab_ref_trie_node* copy_of,
|
||||||
|
libab_ref_trie_node** copy_into) {
|
||||||
|
libab_result result = LIBAB_SUCCESS;
|
||||||
|
|
||||||
|
if(copy_of == NULL) {
|
||||||
|
*copy_into = NULL;
|
||||||
|
} else if(((*copy_into) = malloc(sizeof(**copy_into)))) {
|
||||||
|
(*copy_into)->child = NULL;
|
||||||
|
(*copy_into)->next = NULL;
|
||||||
|
|
||||||
|
result = _libab_ref_trie_copy(copy_of->next, &(*copy_into)->next);
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
result = _libab_ref_trie_copy(copy_of->child, &(*copy_into)->child);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
(*copy_into)->key = copy_of->key;
|
||||||
|
libab_ref_copy(©_of->ref, &(*copy_into)->ref);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = LIBAB_MALLOC;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result != LIBAB_SUCCESS && *copy_into) {
|
||||||
|
_libab_ref_trie_free((*copy_into)->next);
|
||||||
|
_libab_ref_trie_free((*copy_into)->child);
|
||||||
|
free(*copy_into);
|
||||||
|
*copy_into = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
libab_result libab_ref_trie_init_copy(libab_ref_trie* trie,
|
||||||
|
const libab_ref_trie* copy_of) {
|
||||||
|
libab_result result = LIBAB_SUCCESS;
|
||||||
|
|
||||||
|
libab_ref_trie_init(trie);
|
||||||
|
result = _libab_ref_trie_copy(copy_of->head, &trie->head);
|
||||||
|
|
||||||
|
if(result != LIBAB_SUCCESS) {
|
||||||
|
libab_ref_trie_free(trie);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
libab_result _libab_ref_trie_put(libab_ref_trie_node** node, const char* key,
|
libab_result _libab_ref_trie_put(libab_ref_trie_node** node, const char* key,
|
||||||
libab_ref* ref) {
|
libab_ref* ref) {
|
||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
|
@ -80,15 +136,6 @@ const libab_ref* libab_ref_trie_get(const libab_ref_trie* trie,
|
||||||
return &trie->null_ref;
|
return &trie->null_ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _libab_ref_trie_free(libab_ref_trie_node* node) {
|
|
||||||
if (node == NULL)
|
|
||||||
return;
|
|
||||||
_libab_ref_trie_free(node->next);
|
|
||||||
_libab_ref_trie_free(node->child);
|
|
||||||
libab_ref_free(&node->ref);
|
|
||||||
free(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
void libab_ref_trie_free(libab_ref_trie* trie) {
|
void libab_ref_trie_free(libab_ref_trie* trie) {
|
||||||
_libab_ref_trie_free(trie->head);
|
_libab_ref_trie_free(trie->head);
|
||||||
libab_ref_free(&trie->null_ref);
|
libab_ref_free(&trie->null_ref);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user