libvieter/src/tree/vieter_tree_iterator.c

50 lines
1.0 KiB
C

#include "vieter_tree.h"
#include "vieter_tree_internal.h"
vieter_tree_iterator *vieter_tree_iterator_from(vieter_tree *tree) {
vieter_tree_iterator *iter = calloc(1, sizeof(vieter_tree_iterator));
// An empty tree's iterator will be done immediately
if (tree->size == 0) {
iter->started = true;
iter->done = true;
return iter;
}
iter->current_node = tree->root;
return iter;
}
vieter_tree_error vieter_tree_iterator_next(void **out,
vieter_tree_iterator *iter) {
if (iter->done) {
return vieter_tree_iterator_done;
}
if (!iter->started) {
while (iter->current_node->children[0] != NULL) {
iter->current_node = iter->current_node->children[0];
}
iter->started = true;
}
*out = iter->current_node->data;
iter->current_node = vieter_tree_node_next(iter->current_node);
if (iter->current_node == NULL) {
iter->done = true;
}
return vieter_tree_ok;
}
void vieter_tree_iterator_free(vieter_tree_iterator **ptp) {
free(*ptp);
*ptp = NULL;
}