|
INET Framework for OMNeT++/OMNEST
|
Interval tree.
More...
#include <IntervalTree.h>
|
| struct | Interval |
| | Interval trees implemented using red-black-trees as described in the book Introduction_To_Algorithms_ by Cormen, Leisserson, and Rivest. More...
|
| |
| struct | it_recursion_node |
| | Class describes the information needed when we take the right branch in searching for intervals but possibly come back and check the left branch as well. More...
|
| |
| class | Node |
| | The node for interval tree. More...
|
| |
◆ IntervalTree()
| inet::IntervalTree::IntervalTree |
( |
| ) |
|
the following are used for the query function
◆ ~IntervalTree()
| inet::IntervalTree::~IntervalTree |
( |
| ) |
|
82 std::deque<Node *> nodes_to_free;
86 nodes_to_free.push_back(x->left);
88 if (x->right !=
nil) {
89 nodes_to_free.push_back(x->right);
93 while (nodes_to_free.size() > 0) {
94 x = nodes_to_free.back();
95 nodes_to_free.pop_back();
97 nodes_to_free.push_back(x->left);
99 if (x->right !=
nil) {
100 nodes_to_free.push_back(x->right);
◆ deleteFixup()
| void inet::IntervalTree::deleteFixup |
( |
Node * |
node | ) |
|
|
protected |
329 while ((!x->red) && (root_left_node != x)) {
330 if (x == x->parent->left) {
334 x->parent->red =
true;
336 w = x->parent->right;
338 if ((!w->right->red) && (!w->left->red)) {
343 if (!w->right->red) {
344 w->left->red =
false;
347 w = x->parent->right;
349 w->red = x->parent->red;
350 x->parent->red =
false;
351 w->right->red =
false;
360 x->parent->red =
true;
364 if ((!w->right->red) && (!w->left->red)) {
370 w->right->red =
false;
375 w->red = x->parent->red;
376 x->parent->red =
false;
377 w->left->red =
false;
Referenced by deleteNode().
◆ deleteNode() [1/2]
| void inet::IntervalTree::deleteNode |
( |
const Interval * |
ivl | ) |
|
delete node stored a given interval
◆ deleteNode() [2/2]
Delete one node of the interval tree.
y should not be nil in this case y is the node to splice out and x is its child
414 const Interval *node_to_delete = z->stored_interval;
418 if (
root == (x->parent = y->parent)) {
422 if (y == y->parent->left) {
433 y->
max_high = -SimTime::getMaxTime();
436 y->parent = z->parent;
437 z->left->parent = z->right->parent = y;
438 if (z == z->parent->left)
441 z->parent->right = y;
459 return node_to_delete;
Referenced by deleteNode(), and inet::physicallayer::VectorCommunicationCache::removeNonInterferingTransmissions().
◆ fixupMaxHigh()
| void inet::IntervalTree::fixupMaxHigh |
( |
Node * |
node | ) |
|
|
protected |
Travels up to the root fixing the max_high fields after an insertion or deletion.
183 x->max_high =
std::max(x->high,
std::max(x->left->max_high, x->right->max_high));
Referenced by deleteNode(), and insert().
◆ getMaximum()
◆ getMinimum()
◆ getPredecessor()
get the predecessor of a given node
280 while (y !=
nil && x == y->
left) {
◆ getSuccessor()
Get the successor of a given node.
Referenced by deleteNode().
◆ insert()
Insert one node of the interval tree.
use sentinel instead of checking for root
194 x =
new Node(new_interval);
199 while (x->parent->red) {
201 if (x->parent == x->parent->parent->left) {
202 y = x->parent->parent->right;
204 x->parent->red =
false;
206 x->parent->parent->red =
true;
207 x = x->parent->parent;
210 if (x == x->parent->right) {
214 x->parent->red =
false;
215 x->parent->parent->red =
true;
220 y = x->parent->parent->left;
222 x->parent->red =
false;
224 x->parent->parent->red =
true;
225 x = x->parent->parent;
228 if (x == x->parent->left) {
232 x->parent->red =
false;
233 x->parent->parent->red =
true;
Referenced by inet::physicallayer::CommunicationCacheBase::setCachedInterval().
◆ leftRotate()
| void inet::IntervalTree::leftRotate |
( |
Node * |
node | ) |
|
|
protected |
left rotation of tree node
120 y->parent = x->parent;
122 if (x == x->parent->left)
125 x->parent->right = y;
130 x->max_high =
std::max(x->left->max_high,
std::max(x->right->max_high, x->high));
Referenced by deleteFixup(), and insert().
◆ print()
| void inet::IntervalTree::print |
( |
| ) |
const |
Print the whole interval tree.
◆ query()
◆ recursiveInsert()
| void inet::IntervalTree::recursiveInsert |
( |
Node * |
node | ) |
|
|
protected |
recursively insert a node
Inserts z into the tree as if it were a regular binary tree.
163 z->left = z->right =
nil;
174 if ((y ==
root) || (y->key > z->key))
Referenced by insert().
◆ recursivePrint()
| void inet::IntervalTree::recursivePrint |
( |
Node * |
node | ) |
const |
|
protected |
recursively print a subtree
Referenced by print().
◆ recursiveSearch()
recursively find the node corresponding to the interval
396 if (node->stored_interval == ivl)
Referenced by deleteNode().
◆ rightRotate()
| void inet::IntervalTree::rightRotate |
( |
Node * |
node | ) |
|
|
protected |
right rotation of tree node
142 x->right->parent = y;
144 x->parent = y->parent;
145 if (y == y->parent->left)
148 y->parent->right = x;
153 y->max_high =
std::max(y->left->max_high,
std::max(y->right->max_high, y->high));
Referenced by deleteFixup(), and insert().
◆ IntervalTreeTest
| friend class IntervalTreeTest |
|
friend |
◆ current_parent
| unsigned int inet::IntervalTree::current_parent = 0 |
|
private |
◆ nil
| Node* inet::IntervalTree::nil = nullptr |
|
protected |
Referenced by deleteNode(), getMaximum(), getMinimum(), getPredecessor(), getSuccessor(), IntervalTree(), leftRotate(), inet::IntervalTree::Node::print(), query(), recursiveInsert(), recursivePrint(), recursiveSearch(), rightRotate(), and ~IntervalTree().
◆ recursion_node_stack
◆ recursion_node_stack_size
| unsigned int inet::IntervalTree::recursion_node_stack_size = 0 |
|
private |
◆ recursion_node_stack_top
| unsigned int inet::IntervalTree::recursion_node_stack_top = 0 |
|
private |
◆ root
| Node* inet::IntervalTree::root = nullptr |
|
protected |
Referenced by deleteFixup(), deleteNode(), fixupMaxHigh(), insert(), IntervalTree(), inet::IntervalTree::Node::print(), print(), query(), recursiveInsert(), recursivePrint(), and ~IntervalTree().
The documentation for this class was generated from the following files:
void rightRotate(Node *node)
right rotation of tree node
Definition: IntervalTree.cc:134
Node * nil
Definition: IntervalTree.h:157
const Interval * stored_interval
interval stored in the node
Definition: IntervalTree.h:95
void fixupMaxHigh(Node *node)
Travels up to the root fixing the max_high fields after an insertion or deletion.
Definition: IntervalTree.cc:180
unsigned int recursion_node_stack_top
Definition: IntervalTree.h:183
void deleteFixup(Node *node)
Definition: IntervalTree.cc:324
Node * parent
Definition: IntervalTree.h:110
unsigned int current_parent
Definition: IntervalTree.h:182
Node * getMaximum(Node *node) const
Definition: IntervalTree.cc:249
Node * getSuccessor(Node *node) const
Get the successor of a given node.
Definition: IntervalTree.cc:256
void leftRotate(Node *node)
left rotation of tree node
Definition: IntervalTree.cc:110
void recursiveInsert(Node *node)
recursively insert a node
Definition: IntervalTree.cc:158
Node * left
Definition: IntervalTree.h:106
bool overlap(simtime_t a1, simtime_t a2, simtime_t b1, simtime_t b2)
returns 1 if the intervals overlap, and 0 otherwise
Definition: IntervalTree.cc:463
Node * getMinimum(Node *node) const
Definition: IntervalTree.cc:242
Node * right
Definition: IntervalTree.h:108
if(cwndVector) cwndVector -> record(state->snd_cwnd)
const Interval * deleteNode(Node *node)
Delete one node of the interval tree.
Definition: IntervalTree.cc:410
it_recursion_node * recursion_node_stack
Definition: IntervalTree.h:181
unsigned int recursion_node_stack_size
Definition: IntervalTree.h:180
bool try_right_branch
Definition: IntervalTree.h:122
simtime_t key
Definition: IntervalTree.h:97
double max(const double a, const double b)
Returns the maximum of a and b.
Definition: SctpAssociation.h:266
Node * start_node
Definition: IntervalTree.h:118
simtime_t max_high
Definition: IntervalTree.h:101
bool red
red or black node: if red = false then the node is black
Definition: IntervalTree.h:104
Node * recursiveSearch(Node *node, const Interval *ivl) const
recursively find the node corresponding to the interval
Definition: IntervalTree.cc:393
unsigned int parent_index
Definition: IntervalTree.h:120
simtime_t high
Definition: IntervalTree.h:99
void recursivePrint(Node *node) const
recursively print a subtree
Definition: IntervalTree.cc:310
Node * root
Definition: IntervalTree.h:155