oaf-boost/libn3ds/source/arm11/util/rbtree/rbtree_iterator.c
2022-08-04 11:40:24 +08:00

42 lines
748 B
C

#include "arm11/util/rbtree.h"
#include "rbtree_internal.h"
static inline rbtree_node_t*
do_iterate(const rbtree_node_t *node,
int next)
{
rbtree_node_t *it = (rbtree_node_t*)node;
if(it->child[next] != NULL)
{
it = it->child[next];
while(it->child[!next] != NULL)
it = it->child[!next];
}
else
{
rbtree_node_t *parent = get_parent(node);
while(parent != NULL && it == parent->child[next])
{
it = parent;
parent = get_parent(it);
}
it = parent;
}
return it;
}
rbtree_node_t*
rbtree_node_next(const rbtree_node_t *node)
{
return do_iterate(node, RIGHT);
}
rbtree_node_t*
rbtree_node_prev(const rbtree_node_t *node)
{
return do_iterate(node, LEFT);
}