Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
RBTree.hxx
Go to the documentation of this file.
1
34#ifndef _UTILS_RBTREE_HXX_
35#define _UTILS_RBTREE_HXX_
36
37extern "C"
38{
39#include <sys/tree.hxx>
40};
41
42#include "utils/macros.h"
43
52template <typename Key, typename Value> class RBTree
53{
54public:
58 : freeList(NULL)
59 {
60 RB_INIT(&head);
61 }
62
66 RBTree(size_t nodes)
67 : freeList(NULL)
68 {
69 RB_INIT(&head);
70 Node *first = new Node[nodes];
71 first->entry.rbe_left = (Node*)this;
72
73 for (size_t i = 1; i < nodes; i++)
74 {
75 first[i].entry.rbe_left = freeList;
76 freeList = first + i;
77 }
78 }
79
81 struct Node
82 {
83 public:
85 RB_ENTRY(Node) entry;
86 Key key;
87 Value value;
92 {
93 }
94
99 Node(Key key, Value value)
100 : key(key),
101 value(value)
102 {
103 }
104 };
105
112 Node *insert(Key key, Value value)
113 {
114 Node *node = find(key);
115 if (node)
116 {
117 node->value = value;
118 }
119 else
120 {
121 node = alloc();
122 if (node)
123 {
124 node->key = key;
125 node->value = value;
126 insert(node);
127 }
128 }
129 return node;
130 }
131
135 void insert(Node *node)
136 {
137 RB_INSERT(tree, &head, node);
138 }
139
143 void remove(Node *node)
144 {
145 RB_REMOVE(tree, &head, node);
146 free(node);
147 }
148
153 Node *remove(Key key)
154 {
155 Node *node = find(key);
156 if (node)
157 {
158 remove(node);
159 free(node);
160 }
161 return node;
162 }
163
168 Node *find(Key key)
169 {
170 Node lookup;
171
172 lookup.key = key;
173
174 return RB_FIND(tree, &head, &lookup);
175 };
176
181 {
182 return RB_MIN(tree, &head);
183 }
184
189 {
190 return RB_MAX(tree, &head);
191 }
192
197 Node *next(Node *node)
198 {
199 return RB_NEXT(tree, &head, node);
200 }
201
206 Node *next(Key key)
207 {
208 Node *node = find(key);
209 return node ? RB_NEXT(tree, &head, node) : node;
210 }
211
217 {
218 return RB_PREV(tree, &head, node);
219 }
220
223 {
224 }
225
226private:
231 {
232 if (freeList && freeList != (Node*)this)
233 {
234 Node *node = freeList;
235 freeList = freeList->entry.rbe_left;
236 return node;
237 }
238 return NULL;
239 }
240
244 void free(Node *node)
245 {
246 if (freeList || freeList == (Node*)this)
247 {
248 node->entry.rbe_left = freeList;
249 freeList = node;
250 }
251 }
252
258 Key compare(Node *a, Node *b)
259 {
260 return a->key - b->key;
261 }
262
265
267 RB_HEAD(tree, Node);
268
270 RB_GENERATE(tree, Node, entry, compare);
271
273 struct tree head;
274
276};
277
278#endif /* _UTILS_RBTREE_HXX_ */
Though the standard template library includes std::map, commonly implemented as a Red Black tree,...
Definition RBTree.hxx:53
Node * insert(Key key, Value value)
Insert a node into the tree from pre-allocated Node pool.
Definition RBTree.hxx:112
struct tree head
tree instance
Definition RBTree.hxx:273
Key compare(Node *a, Node *b)
Compare two nodes.
Definition RBTree.hxx:258
Node * next(Key key)
Get the next node in the tree.
Definition RBTree.hxx:206
void insert(Node *node)
Insert a node into the tree.
Definition RBTree.hxx:135
RBTree(size_t nodes)
Default Constructor.
Definition RBTree.hxx:66
Node * first()
Get the first node in the tree.
Definition RBTree.hxx:180
~RBTree()
Default destructor.
Definition RBTree.hxx:222
RB_HEAD(tree, Node)
The datagram tree type.
Node * next(Node *node)
Get the next node in the tree.
Definition RBTree.hxx:197
Node * freeList
list of free nodes
Definition RBTree.hxx:264
Node * alloc()
Allocate a node from the free list.
Definition RBTree.hxx:230
void remove(Node *node)
Remove a node from the tree.
Definition RBTree.hxx:143
Node * previous(Node *node)
Get the previous node in the tree.
Definition RBTree.hxx:216
RB_GENERATE(tree, Node, entry, compare)
The datagram tree methods.
Node * find(Key key)
Find a node based on its lookup key.
Definition RBTree.hxx:168
Node * remove(Key key)
Remove a node from the tree.
Definition RBTree.hxx:153
RBTree()
Default Constructor.
Definition RBTree.hxx:57
void free(Node *node)
free a node to the free list if it exists.
Definition RBTree.hxx:244
Node * last()
Get the last node in the tree.
Definition RBTree.hxx:188
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Removes default copy-constructor and assignment added by C++.
Definition macros.h:171
The metadata for a tree node.
Definition RBTree.hxx:82
Node()
Default constructor.
Definition RBTree.hxx:91
Key key
key by which to sort the node
Definition RBTree.hxx:86
Value value
value of the node
Definition RBTree.hxx:87
RB_ENTRY(Node) entry
The pointer structure.
Node(Key key, Value value)
Constructor.
Definition RBTree.hxx:99