blob: d7250f8ace739c3131c6847d52ab7aabab39f9fc [file] [log] [blame]
Igor Sysoevd90282d2004-09-28 08:34:51 +00001
2/*
Igor Sysoevff8da912004-09-29 16:00:49 +00003 * Copyright (C) Igor Sysoev
Igor Sysoevd90282d2004-09-28 08:34:51 +00004 */
5
6
Igor Sysoevf5003d82003-12-04 14:53:00 +00007#ifndef _NGX_RBTREE_H_INCLUDED_
8#define _NGX_RBTREE_H_INCLUDED_
9
10
11#include <ngx_config.h>
12#include <ngx_core.h>
13
14
Igor Sysoev208eed22005-10-07 13:30:52 +000015typedef ngx_uint_t ngx_rbtree_key_t;
16typedef ngx_int_t ngx_rbtree_key_int_t;
17
18
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000019typedef struct ngx_rbtree_node_s ngx_rbtree_node_t;
Igor Sysoevf5003d82003-12-04 14:53:00 +000020
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000021struct ngx_rbtree_node_s {
22 ngx_rbtree_key_t key;
23 ngx_rbtree_node_t *left;
24 ngx_rbtree_node_t *right;
25 ngx_rbtree_node_t *parent;
Igor Sysoev8c5f37e2006-11-16 15:34:52 +000026 u_char color;
27 u_char data;
Igor Sysoevf5003d82003-12-04 14:53:00 +000028};
29
Igor Sysoev62260f22003-12-05 17:07:27 +000030
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000031typedef struct ngx_rbtree_s ngx_rbtree_t;
32
Igor Sysoev8c5f37e2006-11-16 15:34:52 +000033typedef void (*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root,
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000034 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
35
36struct ngx_rbtree_s {
37 ngx_rbtree_node_t *root;
38 ngx_rbtree_node_t *sentinel;
Igor Sysoev8c5f37e2006-11-16 15:34:52 +000039 ngx_rbtree_insert_pt insert;
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000040};
Igor Sysoevf5003d82003-12-04 14:53:00 +000041
42
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000043void ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree,
44 ngx_rbtree_node_t *node);
45void ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree,
46 ngx_rbtree_node_t *node);
Igor Sysoevf4eb0172006-11-20 17:13:21 +000047void ngx_rbtree_insert_value(ngx_rbtree_node_t *root, ngx_rbtree_node_t *node,
48 ngx_rbtree_node_t *sentinel);
Igor Sysoev8c5f37e2006-11-16 15:34:52 +000049void ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *root,
50 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000051
52
Igor Sysoev618dc752007-01-12 19:48:30 +000053#define ngx_rbt_red(node) ((node)->color = 1)
54#define ngx_rbt_black(node) ((node)->color = 0)
55#define ngx_rbt_is_red(node) ((node)->color)
56#define ngx_rbt_is_black(node) (!ngx_rbt_is_red(node))
57#define ngx_rbt_copy_color(n1, n2) (n1->color = n2->color)
58
59
Igor Sysoevdcec2fa2007-01-02 23:04:54 +000060/* a sentinel must be black */
61
Igor Sysoev618dc752007-01-12 19:48:30 +000062#define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node)
Igor Sysoevdcec2fa2007-01-02 23:04:54 +000063
64
Igor Sysoev1bfa7bc2005-10-10 12:59:41 +000065static ngx_inline ngx_rbtree_node_t *
66ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
Igor Sysoevf5003d82003-12-04 14:53:00 +000067{
Igor Sysoev208eed22005-10-07 13:30:52 +000068 while (node->left != sentinel) {
69 node = node->left;
70 }
Igor Sysoevf5003d82003-12-04 14:53:00 +000071
Igor Sysoev208eed22005-10-07 13:30:52 +000072 return node;
Igor Sysoevf5003d82003-12-04 14:53:00 +000073}
74
75
76#endif /* _NGX_RBTREE_H_INCLUDED_ */