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

65 lines
1.1 KiB
C

#pragma once
#define LEFT 0
#define RIGHT 1
typedef enum rbtree_color
{
RED = 0,
BLACK = 1,
} rbtree_color_t;
#define COLOR_MASK (RED|BLACK)
static inline void
set_black(rbtree_node_t *node)
{
node->parent_color &= ~COLOR_MASK;
node->parent_color |= BLACK;
}
static inline void
set_red(rbtree_node_t *node)
{
node->parent_color &= ~COLOR_MASK;
node->parent_color |= RED;
}
static inline rbtree_color_t
get_color(const rbtree_node_t *node)
{
if(node == NULL)
return BLACK;
return (rbtree_color_t)(node->parent_color & COLOR_MASK);
}
static inline int
is_black(const rbtree_node_t *node)
{
return get_color(node) == BLACK;
}
static inline int
is_red(const rbtree_node_t *node)
{
return get_color(node) == RED;
}
static inline rbtree_node_t*
get_parent(const rbtree_node_t *node)
{
return (rbtree_node_t*)(node->parent_color & ~COLOR_MASK);
}
static inline void
set_parent(rbtree_node_t *node,
const rbtree_node_t *parent)
{
node->parent_color = (get_color(node)) | ((uintptr_t)parent);
}
void
rbtree_rotate(rbtree_t *tree,
rbtree_node_t *node,
int left);