Implement foreach for the trie.
This commit is contained in:
parent
3f2859a119
commit
56c891f9f8
|
@ -57,7 +57,8 @@ typedef struct libab_trie_node_s libab_trie_node;
|
||||||
|
|
||||||
void libab_trie_init(libab_trie* trie);
|
void libab_trie_init(libab_trie* trie);
|
||||||
libab_result libab_trie_put(libab_trie* trie, const char* key, void* value);
|
libab_result libab_trie_put(libab_trie* trie, const char* key, void* value);
|
||||||
const ll* libab_trie_get(libab_trie* trie, const char* key);
|
const ll* libab_trie_get(const libab_trie* trie, const char* key);
|
||||||
|
int libab_trie_foreach(const libab_trie* trie, void* data, compare_func compare, foreach_func foreach);
|
||||||
void libab_trie_free(libab_trie* trie);
|
void libab_trie_free(libab_trie* trie);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
19
src/trie.c
19
src/trie.c
|
@ -68,7 +68,7 @@ libab_result libab_trie_put(libab_trie* trie, const char* key, void* value) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ll* libab_trie_get(libab_trie* trie, const char* key) {
|
const ll* libab_trie_get(const libab_trie* trie, const char* key) {
|
||||||
libab_trie_node* current = trie->head;
|
libab_trie_node* current = trie->head;
|
||||||
while(current && *key) {
|
while(current && *key) {
|
||||||
while(current && current->key != *key) {
|
while(current && current->key != *key) {
|
||||||
|
@ -86,6 +86,23 @@ const ll* libab_trie_get(libab_trie* trie, const char* key) {
|
||||||
return &trie->empty_list;
|
return &trie->empty_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _libab_trie_foreach(libab_trie_node* node, void* data, compare_func compare, foreach_func foreach) {
|
||||||
|
int return_code;
|
||||||
|
if(node == NULL) return 0;
|
||||||
|
return_code = ll_foreach(&node->values, data, compare, foreach);
|
||||||
|
if(return_code == 0) {
|
||||||
|
return_code = _libab_trie_foreach(node->child, data, compare, foreach);
|
||||||
|
}
|
||||||
|
if(return_code == 0) {
|
||||||
|
return_code = _libab_trie_foreach(node->next, data, compare, foreach);
|
||||||
|
}
|
||||||
|
return return_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int libab_trie_foreach(const libab_trie* trie, void* data, compare_func compare, foreach_func foreach) {
|
||||||
|
return _libab_trie_foreach(trie->head, data, compare, foreach);
|
||||||
|
}
|
||||||
|
|
||||||
void libab_trie_free(libab_trie* trie) {
|
void libab_trie_free(libab_trie* trie) {
|
||||||
_libab_trie_free(trie->head);
|
_libab_trie_free(trie->head);
|
||||||
trie->head = NULL;
|
trie->head = NULL;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user