void hattrie_iter_next(hattrie_iter_t* i) { if (hattrie_iter_finished(i)) return; if (i->i != NULL && !ahtable_iter_finished(i->i)) { ahtable_iter_next(i->i); } else if (i->has_nil_key) { i->has_nil_key = false; i->nil_val = 0; hattrie_iter_nextnode(i); } while (((i->i == NULL || ahtable_iter_finished(i->i)) && !i->has_nil_key) && i->stack != NULL ) { ahtable_iter_free(i->i); i->i = NULL; hattrie_iter_nextnode(i); } if (i->i != NULL && ahtable_iter_finished(i->i)) { ahtable_iter_free(i->i); i->i = NULL; } }
hattrie_iter_t* hattrie_iter_begin(const hattrie_t* T, bool sorted) { hattrie_iter_t* i = malloc_or_die(sizeof(hattrie_iter_t)); i->T = T; i->sorted = sorted; i->i = NULL; i->keysize = 16; i->key = malloc_or_die(i->keysize * sizeof(char)); i->level = 0; i->has_nil_key = false; i->nil_val = 0; i->stack = malloc_or_die(sizeof(hattrie_node_stack_t)); i->stack->next = NULL; i->stack->node = T->root; i->stack->c = '\0'; i->stack->level = 0; while (((i->i == NULL || ahtable_iter_finished(i->i)) && !i->has_nil_key) && i->stack != NULL ) { ahtable_iter_free(i->i); i->i = NULL; hattrie_iter_nextnode(i); } if (i->i != NULL && ahtable_iter_finished(i->i)) { ahtable_iter_free(i->i); i->i = NULL; } return i; }
/** next non-nil-key node * TODO pick a better name */ static void hattrie_iter_step(hattrie_iter_t* i) { while (((i->i == NULL || ahtable_iter_finished(i->i)) && !i->has_nil_key) && i->stack != NULL ) { ahtable_iter_free(i->i); i->i = NULL; hattrie_iter_nextnode(i); } if (i->i != NULL && ahtable_iter_finished(i->i)) { ahtable_iter_free(i->i); i->i = NULL; } }
void hattrie_iter_next(hattrie_iter_t* i) { do { if (hattrie_iter_finished(i)) return; if (i->i != NULL && !ahtable_iter_finished(i->i)) { ahtable_iter_next(i->i); } else if (i->has_nil_key) { i->has_nil_key = false; i->nil_val = 0; hattrie_iter_nextnode(i); } hattrie_iter_step(i); } while (i->prefix_len && hattrie_iter_prefix_not_match(i)); }