libosmocore
UNKNOWN
Osmocom core library
Toggle main menu visibility
Loading...
Searching...
No Matches
linuxrbtree.h
Go to the documentation of this file.
1
/*
2
Red Black Trees
3
(C) 1999 Andrea Arcangeli <andrea@suse.de>
4
5
This program is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2 of the License, or
8
(at your option) any later version.
9
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
14
15
linux/include/linux/rbtree.h
16
17
To use rbtrees you'll have to implement your own insert and search cores.
18
This will avoid us to use callbacks and to drop drammatically performances.
19
I know it's not the cleaner way, but in C (not in C++) to get
20
performances and genericity...
21
22
Some example of insert and search follows here. The search is a plain
23
normal search over an ordered tree. The insert instead must be implemented
24
int two steps: as first thing the code must insert the element in
25
order as a red leaf in the tree, then the support library function
26
rb_insert_color() must be called. Such function will do the
27
not trivial work to rebalance the rbtree if necessary.
28
29
-----------------------------------------------------------------------
30
static inline struct page * rb_search_page_cache(struct inode * inode,
31
unsigned long offset)
32
{
33
struct rb_node * n = inode->i_rb_page_cache.rb_node;
34
struct page * page;
35
36
while (n)
37
{
38
page = rb_entry(n, struct page, rb_page_cache);
39
40
if (offset < page->offset)
41
n = n->rb_left;
42
else if (offset > page->offset)
43
n = n->rb_right;
44
else
45
return page;
46
}
47
return NULL;
48
}
49
50
static inline struct page * __rb_insert_page_cache(struct inode * inode,
51
unsigned long offset,
52
struct rb_node * node)
53
{
54
struct rb_node ** p = &inode->i_rb_page_cache.rb_node;
55
struct rb_node * parent = NULL;
56
struct page * page;
57
58
while (*p)
59
{
60
parent = *p;
61
page = rb_entry(parent, struct page, rb_page_cache);
62
63
if (offset < page->offset)
64
p = &(*p)->rb_left;
65
else if (offset > page->offset)
66
p = &(*p)->rb_right;
67
else
68
return page;
69
}
70
71
rb_link_node(node, parent, p);
72
73
return NULL;
74
}
75
76
static inline struct page * rb_insert_page_cache(struct inode * inode,
77
unsigned long offset,
78
struct rb_node * node)
79
{
80
struct page * ret;
81
if ((ret = __rb_insert_page_cache(inode, offset, node)))
82
goto out;
83
rb_insert_color(node, &inode->i_rb_page_cache);
84
out:
85
return ret;
86
}
87
-----------------------------------------------------------------------
88
*/
89
90
#pragma once
91
92
#include <stdlib.h>
93
94
struct
rb_node
95
{
96
unsigned
long
rb_parent_color
;
97
#define RB_RED 0
98
#define RB_BLACK 1
99
struct
rb_node
*
rb_right
;
100
struct
rb_node
*
rb_left
;
101
}
__attribute__
((aligned(
sizeof
(
long
))));
102
/* The alignment might seem pointless, but allegedly CRIS needs it */
103
104
struct
rb_root
105
{
106
struct
rb_node
*
rb_node
;
107
};
108
109
110
#define rb_parent(r) ((struct rb_node *)((r)->rb_parent_color & ~3))
111
#define rb_color(r) ((r)->rb_parent_color & 1)
112
#define rb_is_red(r) (!rb_color(r))
113
#define rb_is_black(r) rb_color(r)
114
#define rb_set_red(r) do { (r)->rb_parent_color &= ~1; } while (0)
115
#define rb_set_black(r) do { (r)->rb_parent_color |= 1; } while (0)
116
117
static
inline
void
rb_set_parent
(
struct
rb_node
*rb,
struct
rb_node
*p)
118
{
119
rb->
rb_parent_color
= (rb->
rb_parent_color
& 3) | (
unsigned
long
)p;
120
}
121
static
inline
void
rb_set_color
(
struct
rb_node
*rb,
int
color
)
122
{
123
rb->
rb_parent_color
= (rb->
rb_parent_color
& ~1) |
color
;
124
}
125
126
#define RB_ROOT { NULL, }
127
#define rb_entry(ptr, type, member) container_of(ptr, type, member)
128
129
#define RB_EMPTY_ROOT(root) ((root)->rb_node == NULL)
130
#define RB_EMPTY_NODE(node) (rb_parent(node) == node)
131
#define RB_CLEAR_NODE(node) (rb_set_parent(node, node))
132
133
extern
void
rb_insert_color
(
struct
rb_node
*,
struct
rb_root
*);
134
extern
void
rb_erase
(
struct
rb_node
*,
struct
rb_root
*);
135
136
/* Find logical next and previous nodes in a tree */
137
extern
struct
rb_node
*
rb_next
(
const
struct
rb_node
*);
138
extern
struct
rb_node
*
rb_prev
(
const
struct
rb_node
*);
139
extern
struct
rb_node
*
rb_first
(
const
struct
rb_root
*);
140
extern
struct
rb_node
*
rb_last
(
const
struct
rb_root
*);
141
142
/* Fast replacement of a single node without remove/rebalance/add/rebalance */
143
extern
void
rb_replace_node
(
struct
rb_node
*victim,
struct
rb_node
*_new,
144
struct
rb_root
*root);
145
146
static
inline
void
rb_link_node
(
struct
rb_node
*
node
,
struct
rb_node
* parent,
147
struct
rb_node
** rb_link)
148
{
149
node
->rb_parent_color = (
unsigned
long )parent;
150
node
->rb_left =
node
->rb_right = NULL;
151
152
*rb_link =
node
;
153
}
node
struct cmd_node * node
color
static const char * color(int subsys)
Definition
logging.c:516
rb_set_parent
static void rb_set_parent(struct rb_node *rb, struct rb_node *p)
Definition
linuxrbtree.h:117
rb_link_node
static void rb_link_node(struct rb_node *node, struct rb_node *parent, struct rb_node **rb_link)
Definition
linuxrbtree.h:146
rb_set_color
static void rb_set_color(struct rb_node *rb, int color)
Definition
linuxrbtree.h:121
rb_next
struct rb_node * rb_next(const struct rb_node *)
Definition
rbtree.c:308
rb_insert_color
void rb_insert_color(struct rb_node *, struct rb_root *)
Definition
rbtree.c:69
rb_erase
void rb_erase(struct rb_node *, struct rb_root *)
Definition
rbtree.c:214
__attribute__
struct rb_root __attribute__
rb_replace_node
void rb_replace_node(struct rb_node *victim, struct rb_node *_new, struct rb_root *root)
Definition
rbtree.c:360
rb_first
struct rb_node * rb_first(const struct rb_root *)
Definition
rbtree.c:284
rb_prev
struct rb_node * rb_prev(const struct rb_node *)
Definition
rbtree.c:336
rb_last
struct rb_node * rb_last(const struct rb_root *)
Definition
rbtree.c:296
rb_node
Definition
linuxrbtree.h:95
rb_node::rb_parent_color
unsigned long rb_parent_color
Definition
linuxrbtree.h:96
rb_node::rb_left
struct rb_node * rb_left
Definition
linuxrbtree.h:100
rb_node::rb_right
struct rb_node * rb_right
Definition
linuxrbtree.h:99
rb_root
Definition
linuxrbtree.h:105
rb_root::rb_node
struct rb_node * rb_node
Definition
linuxrbtree.h:106
include
osmocom
core
linuxrbtree.h
Generated by
1.17.0