forked from vieter-v/libvieter
50 lines
1.0 KiB
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;
|
|
}
|