blob: 79437cdd719719dee99e8e3169cbaf2b72a6e647 [file] [log] [blame]
Florin Coras672d5fc2019-04-15 17:28:51 -07001/*
2 * Copyright (c) 2019 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef SRC_VPPINFRA_RBTREE_H_
17#define SRC_VPPINFRA_RBTREE_H_
18
19#include <vppinfra/types.h>
20#include <vppinfra/pool.h>
21
22#define RBTREE_TNIL_INDEX 0
23
24typedef u32 rb_node_index_t;
25
26typedef enum rb_tree_color_
27{
28 RBTREE_RED,
29 RBTREE_BLACK
30} rb_node_color_t;
31
32typedef struct rb_node_
33{
34 u8 color; /**< node color */
35 rb_node_index_t parent; /**< parent index */
36 rb_node_index_t left; /**< left child index */
37 rb_node_index_t right; /**< right child index */
38 u32 key; /**< node key */
Florin Coras4375fa32019-04-19 15:56:00 -070039 uword opaque; /**< value stored by node */
Florin Coras672d5fc2019-04-15 17:28:51 -070040} rb_node_t;
41
42typedef struct rb_tree_
43{
44 rb_node_t *nodes; /**< pool of nodes */
45 rb_node_index_t root; /**< root index */
46} rb_tree_t;
47
48void rb_tree_init (rb_tree_t * rt);
49rb_node_index_t rb_tree_add (rb_tree_t * rt, u32 key);
Florin Coras4375fa32019-04-19 15:56:00 -070050rb_node_index_t rb_tree_add2 (rb_tree_t * rt, u32 key, uword opaque);
Florin Coras672d5fc2019-04-15 17:28:51 -070051void rb_tree_del (rb_tree_t * rt, u32 key);
52void rb_tree_free_nodes (rb_tree_t * rt);
53u32 rb_tree_n_nodes (rb_tree_t * rt);
54rb_node_t *rb_tree_min_subtree (rb_tree_t * rt, rb_node_t * x);
55rb_node_t *rb_tree_max_subtree (rb_tree_t * rt, rb_node_t * x);
56rb_node_t *rb_tree_search_subtree (rb_tree_t * rt, rb_node_t * x, u32 key);
Florin Corasf7cda7a2019-04-19 18:50:34 -070057rb_node_t *rb_tree_successor (rb_tree_t * rt, rb_node_t * x);
58rb_node_t *rb_tree_predecessor (rb_tree_t * rt, rb_node_t * x);
Florin Coras672d5fc2019-04-15 17:28:51 -070059
60static inline rb_node_index_t
61rb_node_index (rb_tree_t * rt, rb_node_t * n)
62{
63 return n - rt->nodes;
64}
65
66static inline u8
67rb_node_is_tnil (rb_tree_t * rt, rb_node_t * n)
68{
69 return rb_node_index (rt, n) == RBTREE_TNIL_INDEX;
70}
71
72static inline rb_node_t *
73rb_node (rb_tree_t * rt, rb_node_index_t ri)
74{
75 return pool_elt_at_index (rt->nodes, ri);
76}
77
Florin Coras4375fa32019-04-19 15:56:00 -070078static inline rb_node_t *
79rb_node_right (rb_tree_t * rt, rb_node_t * n)
80{
81 return pool_elt_at_index (rt->nodes, n->right);
82}
83
84static inline rb_node_t *
85rb_node_left (rb_tree_t * rt, rb_node_t * n)
86{
87 return pool_elt_at_index (rt->nodes, n->left);
88}
89
90static inline rb_node_t *
91rb_node_parent (rb_tree_t * rt, rb_node_t * n)
92{
93 return pool_elt_at_index (rt->nodes, n->parent);
94}
95
Florin Coras672d5fc2019-04-15 17:28:51 -070096#endif /* SRC_VPPINFRA_RBTREE_H_ */
97
98/*
99 * fd.io coding-style-patch-verification: ON
100 *
101 * Local Variables:
102 * eval: (c-set-style "gnu")
103 * End:
104 */