#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; }