Initial version.
This commit is contained in:
120
src/nxt_rbtree.h
Normal file
120
src/nxt_rbtree.h
Normal file
@@ -0,0 +1,120 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) Igor Sysoev
|
||||
* Copyright (C) NGINX, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NXT_RBTREE_H_INCLUDED_
|
||||
#define _NXT_RBTREE_H_INCLUDED_
|
||||
|
||||
|
||||
typedef struct nxt_rbtree_node_s nxt_rbtree_node_t;
|
||||
|
||||
struct nxt_rbtree_node_s {
|
||||
nxt_rbtree_node_t *left;
|
||||
nxt_rbtree_node_t *right;
|
||||
nxt_rbtree_node_t *parent;
|
||||
|
||||
uint8_t color;
|
||||
uint8_t spare;
|
||||
};
|
||||
|
||||
|
||||
typedef struct {
|
||||
nxt_rbtree_node_t *left;
|
||||
nxt_rbtree_node_t *right;
|
||||
nxt_rbtree_node_t *parent;
|
||||
} nxt_rbtree_part_t;
|
||||
|
||||
|
||||
#define NXT_RBTREE_NODE(node) \
|
||||
nxt_rbtree_part_t node; \
|
||||
uint8_t color
|
||||
|
||||
|
||||
#define NXT_RBTREE_NODE_INIT { NULL, NULL, NULL }, 0
|
||||
|
||||
|
||||
typedef struct {
|
||||
nxt_rbtree_node_t sentinel;
|
||||
} nxt_rbtree_t;
|
||||
|
||||
|
||||
typedef void (*nxt_rbtree_insert_t)(nxt_rbtree_node_t *root,
|
||||
nxt_rbtree_node_t *node, nxt_rbtree_node_t *sentinel);
|
||||
|
||||
typedef nxt_int_t (*nxt_rbtree_compare_t)(nxt_rbtree_node_t *node1,
|
||||
nxt_rbtree_node_t *node2);
|
||||
|
||||
|
||||
#define \
|
||||
nxt_rbtree_root(tree) \
|
||||
((tree)->sentinel.left)
|
||||
|
||||
|
||||
#define nxt_rbtree_sentinel(tree) \
|
||||
(&(tree)->sentinel)
|
||||
|
||||
|
||||
#define nxt_rbtree_is_empty(tree) \
|
||||
(nxt_rbtree_root(tree) == nxt_rbtree_sentinel(tree))
|
||||
|
||||
|
||||
#define nxt_rbtree_min(tree) \
|
||||
nxt_rbtree_branch_min(tree, &(tree)->sentinel)
|
||||
|
||||
|
||||
nxt_inline nxt_rbtree_node_t *
|
||||
nxt_rbtree_branch_min(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
|
||||
{
|
||||
while (node->left != nxt_rbtree_sentinel(tree)) {
|
||||
node = node->left;
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
#define nxt_rbtree_is_there_successor(tree, node) \
|
||||
((node) != nxt_rbtree_sentinel(tree))
|
||||
|
||||
|
||||
nxt_inline nxt_rbtree_node_t *
|
||||
nxt_rbtree_node_successor(nxt_rbtree_t *tree, nxt_rbtree_node_t *node)
|
||||
{
|
||||
nxt_rbtree_node_t *parent;
|
||||
|
||||
if (node->right != nxt_rbtree_sentinel(tree)) {
|
||||
return nxt_rbtree_branch_min(tree, node->right);
|
||||
}
|
||||
|
||||
for ( ;; ) {
|
||||
parent = node->parent;
|
||||
|
||||
/*
|
||||
* Explicit test for a root node is not required here, because
|
||||
* the root node is always the left child of the sentinel.
|
||||
*/
|
||||
if (node == parent->left) {
|
||||
return parent;
|
||||
}
|
||||
|
||||
node = parent;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NXT_EXPORT void nxt_rbtree_init(nxt_rbtree_t *tree,
|
||||
nxt_rbtree_compare_t compare, nxt_rbtree_insert_t insert);
|
||||
NXT_EXPORT void nxt_rbtree_insert(nxt_rbtree_t *tree, nxt_rbtree_part_t *node);
|
||||
NXT_EXPORT nxt_rbtree_node_t *nxt_rbtree_find(nxt_rbtree_t *tree,
|
||||
nxt_rbtree_part_t *node);
|
||||
NXT_EXPORT nxt_rbtree_node_t *nxt_rbtree_find_less_or_equal(nxt_rbtree_t *tree,
|
||||
nxt_rbtree_part_t *node);
|
||||
NXT_EXPORT nxt_rbtree_node_t *
|
||||
nxt_rbtree_find_greater_or_equal(nxt_rbtree_t *tree,
|
||||
nxt_rbtree_part_t *node);
|
||||
NXT_EXPORT void nxt_rbtree_delete(nxt_rbtree_t *tree, nxt_rbtree_part_t *node);
|
||||
|
||||
|
||||
#endif /* _NXT_RBTREE_H_INCLUDED_ */
|
||||
Reference in New Issue
Block a user