INET Framework for OMNeT++/OMNEST
inet::IntervalTree Class Reference

Interval tree. More...

#include <IntervalTree.h>

Classes

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...
 

Public Member Functions

 IntervalTree ()
 
 ~IntervalTree ()
 
void print () const
 Print the whole interval tree. More...
 
const IntervaldeleteNode (Node *node)
 Delete one node of the interval tree. More...
 
void deleteNode (const Interval *ivl)
 delete node stored a given interval More...
 
Nodeinsert (const Interval *new_interval)
 Insert one node of the interval tree. More...
 
NodegetMinimum (Node *node) const
 
NodegetMaximum (Node *node) const
 
NodegetPredecessor (Node *node) const
 get the predecessor of a given node More...
 
NodegetSuccessor (Node *node) const
 Get the successor of a given node. More...
 
std::deque< const Interval * > query (simtime_t low, simtime_t high)
 Return result for a given query. More...
 

Protected Member Functions

void leftRotate (Node *node)
 left rotation of tree node More...
 
void rightRotate (Node *node)
 right rotation of tree node More...
 
void recursiveInsert (Node *node)
 recursively insert a node More...
 
void recursivePrint (Node *node) const
 recursively print a subtree More...
 
NoderecursiveSearch (Node *node, const Interval *ivl) const
 recursively find the node corresponding to the interval More...
 
void fixupMaxHigh (Node *node)
 Travels up to the root fixing the max_high fields after an insertion or deletion. More...
 
void deleteFixup (Node *node)
 

Protected Attributes

Noderoot = nullptr
 
Nodenil = nullptr
 

Private Attributes

unsigned int recursion_node_stack_size = 0
 
it_recursion_noderecursion_node_stack = nullptr
 
unsigned int current_parent = 0
 
unsigned int recursion_node_stack_top = 0
 

Friends

class IntervalTreeTest
 

Detailed Description

Interval tree.

Constructor & Destructor Documentation

◆ IntervalTree()

inet::IntervalTree::IntervalTree ( )

the following are used for the query function

59 {
60  nil = new Node;
61  nil->left = nil->right = nil->parent = nil;
62  nil->red = false;
63  nil->key = nil->high = nil->max_high = -SimTime::getMaxTime(); // -std::numeric_limits<double>::max();
64  nil->stored_interval = nullptr;
65 
66  root = new Node;
67  root->parent = root->left = root->right = nil;
68  root->key = root->high = root->max_high = SimTime::getMaxTime(); // std::numeric_limits<double>::max();
69  root->red = false;
70  root->stored_interval = nullptr;
71 
74  recursion_node_stack = (it_recursion_node *)malloc(recursion_node_stack_size * sizeof(it_recursion_node));
76  recursion_node_stack[0].start_node = nullptr;
77 }

◆ ~IntervalTree()

inet::IntervalTree::~IntervalTree ( )
80 {
81  Node *x = root->left;
82  std::deque<Node *> nodes_to_free;
83 
84  if (x != nil) {
85  if (x->left != nil) {
86  nodes_to_free.push_back(x->left);
87  }
88  if (x->right != nil) {
89  nodes_to_free.push_back(x->right);
90  }
91 
92  delete x;
93  while (nodes_to_free.size() > 0) {
94  x = nodes_to_free.back();
95  nodes_to_free.pop_back();
96  if (x->left != nil) {
97  nodes_to_free.push_back(x->left);
98  }
99  if (x->right != nil) {
100  nodes_to_free.push_back(x->right);
101  }
102  delete x;
103  }
104  }
105  delete nil;
106  delete root;
107  free(recursion_node_stack);
108 }

Member Function Documentation

◆ deleteFixup()

void inet::IntervalTree::deleteFixup ( Node node)
protected
325 {
326  Node *w;
327  Node *root_left_node = root->left;
328 
329  while ((!x->red) && (root_left_node != x)) {
330  if (x == x->parent->left) {
331  w = x->parent->right;
332  if (w->red) {
333  w->red = false;
334  x->parent->red = true;
335  leftRotate(x->parent);
336  w = x->parent->right;
337  }
338  if ((!w->right->red) && (!w->left->red)) {
339  w->red = true;
340  x = x->parent;
341  }
342  else {
343  if (!w->right->red) {
344  w->left->red = false;
345  w->red = true;
346  rightRotate(w);
347  w = x->parent->right;
348  }
349  w->red = x->parent->red;
350  x->parent->red = false;
351  w->right->red = false;
352  leftRotate(x->parent);
353  x = root_left_node;
354  }
355  }
356  else {
357  w = x->parent->left;
358  if (w->red) {
359  w->red = false;
360  x->parent->red = true;
361  rightRotate(x->parent);
362  w = x->parent->left;
363  }
364  if ((!w->right->red) && (!w->left->red)) {
365  w->red = true;
366  x = x->parent;
367  }
368  else {
369  if (!w->left->red) {
370  w->right->red = false;
371  w->red = true;
372  leftRotate(w);
373  w = x->parent->left;
374  }
375  w->red = x->parent->red;
376  x->parent->red = false;
377  w->left->red = false;
378  rightRotate(x->parent);
379  x = root_left_node;
380  }
381  }
382  }
383  x->red = false;
384 }

Referenced by deleteNode().

◆ deleteNode() [1/2]

void inet::IntervalTree::deleteNode ( const Interval ivl)

delete node stored a given interval

387 {
388  Node *node = recursiveSearch(root, ivl);
389  if (node != nil)
390  deleteNode(node);
391 }

◆ deleteNode() [2/2]

const IntervalTree::Interval * inet::IntervalTree::deleteNode ( Node node)

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

411 {
412  Node *y;
413  Node *x;
414  const Interval *node_to_delete = z->stored_interval;
415 
416  y = ((z->left == nil) || (z->right == nil)) ? z : getSuccessor(z);
417  x = (y->left == nil) ? y->right : y->left;
418  if (root == (x->parent = y->parent)) {
419  root->left = x;
420  }
421  else {
422  if (y == y->parent->left) {
423  y->parent->left = x;
424  }
425  else {
426  y->parent->right = x;
427  }
428  }
429 
432  if (y != z) {
433  y->max_high = -SimTime::getMaxTime(); // -std::numeric_limits<double>::max();
434  y->left = z->left;
435  y->right = z->right;
436  y->parent = z->parent;
437  z->left->parent = z->right->parent = y;
438  if (z == z->parent->left)
439  z->parent->left = y;
440  else
441  z->parent->right = y;
442 
443  fixupMaxHigh(x->parent);
444  if (!(y->red)) {
445  y->red = z->red;
446  deleteFixup(x);
447  }
448  else
449  y->red = z->red;
450  delete z;
451  }
452  else {
453  fixupMaxHigh(x->parent);
454  if (!(y->red))
455  deleteFixup(x);
456  delete y;
457  }
458 
459  return node_to_delete;
460 }

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.

181 {
182  while (x != root) {
183  x->max_high = std::max(x->high, std::max(x->left->max_high, x->right->max_high));
184  x = x->parent;
185  }
186 }

Referenced by deleteNode(), and insert().

◆ getMaximum()

IntervalTree::Node * inet::IntervalTree::getMaximum ( Node node) const
250 {
251  while (x->right != nil)
252  x = x->right;
253  return x;
254 }

Referenced by getPredecessor().

◆ getMinimum()

IntervalTree::Node * inet::IntervalTree::getMinimum ( Node node) const
243 {
244  while (x->left != nil)
245  x = x->left;
246  return x;
247 }

Referenced by getSuccessor().

◆ getPredecessor()

IntervalTree::Node * inet::IntervalTree::getPredecessor ( Node node) const

get the predecessor of a given node

273 {
274  Node *y;
275 
276  if (nil != x->left)
277  return getMaximum(x->left);
278  else {
279  y = x->parent;
280  while (y != nil && x == y->left) {
281  x = y;
282  y = y->parent;
283  }
284  return y;
285  }
286 }

◆ getSuccessor()

IntervalTree::Node * inet::IntervalTree::getSuccessor ( Node node) const

Get the successor of a given node.

257 {
258  Node *y;
259 
260  if (nil != x->right)
261  return getMinimum(x->right);
262  else {
263  y = x->parent;
264  while (y != nil && x == y->right) {
265  x = y;
266  y = y->parent;
267  }
268  return y;
269  }
270 }

Referenced by deleteNode().

◆ insert()

IntervalTree::Node * inet::IntervalTree::insert ( const Interval new_interval)

Insert one node of the interval tree.

use sentinel instead of checking for root

189 {
190  Node *y;
191  Node *x;
192  Node *new_node;
193 
194  x = new Node(new_interval);
195  recursiveInsert(x);
196  fixupMaxHigh(x->parent);
197  new_node = x;
198  x->red = true;
199  while (x->parent->red) {
201  if (x->parent == x->parent->parent->left) {
202  y = x->parent->parent->right;
203  if (y->red) {
204  x->parent->red = false;
205  y->red = false;
206  x->parent->parent->red = true;
207  x = x->parent->parent;
208  }
209  else {
210  if (x == x->parent->right) {
211  x = x->parent;
212  leftRotate(x);
213  }
214  x->parent->red = false;
215  x->parent->parent->red = true;
216  rightRotate(x->parent->parent);
217  }
218  }
219  else {
220  y = x->parent->parent->left;
221  if (y->red) {
222  x->parent->red = false;
223  y->red = false;
224  x->parent->parent->red = true;
225  x = x->parent->parent;
226  }
227  else {
228  if (x == x->parent->left) {
229  x = x->parent;
230  rightRotate(x);
231  }
232  x->parent->red = false;
233  x->parent->parent->red = true;
234  leftRotate(x->parent->parent);
235  }
236  }
237  }
238  root->left->red = false;
239  return new_node;
240 }

Referenced by inet::physicallayer::CommunicationCacheBase::setCachedInterval().

◆ leftRotate()

void inet::IntervalTree::leftRotate ( Node node)
protected

left rotation of tree node

111 {
112  Node *y;
113 
114  y = x->right;
115  x->right = y->left;
116 
117  if (y->left != nil)
118  y->left->parent = x;
119 
120  y->parent = x->parent;
121 
122  if (x == x->parent->left)
123  x->parent->left = y;
124  else
125  x->parent->right = y;
126 
127  y->left = x;
128  x->parent = y;
129 
130  x->max_high = std::max(x->left->max_high, std::max(x->right->max_high, x->high));
131  y->max_high = std::max(x->max_high, std::max(y->right->max_high, y->high));
132 }

Referenced by deleteFixup(), and insert().

◆ print()

void inet::IntervalTree::print ( ) const

Print the whole interval tree.

320 {
322 }

◆ query()

std::deque< const IntervalTree::Interval * > inet::IntervalTree::query ( simtime_t  low,
simtime_t  high 
)

Return result for a given query.

474 {
475  std::deque<const Interval *> result_stack;
476  Node *x = root->left;
477  bool run = (x != nil);
478 
479  current_parent = 0;
480 
481  while (run) {
482  if (overlap(low, high, x->key, x->high)) {
483  result_stack.push_back(x->stored_interval);
485  }
486  if (x->left->max_high >= low) {
489  recursion_node_stack = (it_recursion_node *)realloc(recursion_node_stack,
490  recursion_node_stack_size * sizeof(it_recursion_node));
491  if (recursion_node_stack == nullptr)
492  exit(1);
493  }
498  x = x->left;
499  }
500  else
501  x = x->right;
502 
503  run = (x != nil);
504  while ((!run) && (recursion_node_stack_top > 1)) {
505  if (recursion_node_stack[--recursion_node_stack_top].try_right_branch) {
509  run = (x != nil);
510  }
511  }
512  }
513  return result_stack;
514 }

Referenced by inet::physicallayer::CommunicationCacheBase::computeInterferingTransmissions().

◆ 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.

159 {
160  Node *x;
161  Node *y;
162 
163  z->left = z->right = nil;
164  y = root;
165  x = root->left;
166  while (x != nil) {
167  y = x;
168  if (x->key > z->key)
169  x = x->left;
170  else
171  x = x->right;
172  }
173  z->parent = y;
174  if ((y == root) || (y->key > z->key))
175  y->left = z;
176  else
177  y->right = z;
178 }

Referenced by insert().

◆ recursivePrint()

void inet::IntervalTree::recursivePrint ( Node node) const
protected

recursively print a subtree

311 {
312  if (x != nil) {
313  recursivePrint(x->left);
314  x->print(nil, root);
315  recursivePrint(x->right);
316  }
317 }

Referenced by print().

◆ recursiveSearch()

IntervalTree::Node * inet::IntervalTree::recursiveSearch ( Node node,
const Interval ivl 
) const
protected

recursively find the node corresponding to the interval

394 {
395  if (node != nil) {
396  if (node->stored_interval == ivl)
397  return node;
398 
399  Node *left = recursiveSearch(node->left, ivl);
400  if (left != nil)
401  return left;
402  Node *right = recursiveSearch(node->right, ivl);
403  if (right != nil)
404  return right;
405  }
406 
407  return nil;
408 }

Referenced by deleteNode().

◆ rightRotate()

void inet::IntervalTree::rightRotate ( Node node)
protected

right rotation of tree node

135 {
136  Node *x;
137 
138  x = y->left;
139  y->left = x->right;
140 
141  if (nil != x->right)
142  x->right->parent = y;
143 
144  x->parent = y->parent;
145  if (y == y->parent->left)
146  y->parent->left = x;
147  else
148  y->parent->right = x;
149 
150  x->right = y;
151  y->parent = x;
152 
153  y->max_high = std::max(y->left->max_high, std::max(y->right->max_high, y->high));
154  x->max_high = std::max(x->left->max_high, std::max(y->max_high, x->high));
155 }

Referenced by deleteFixup(), and insert().

Friends And Related Function Documentation

◆ IntervalTreeTest

friend class IntervalTreeTest
friend

Member Data Documentation

◆ current_parent

unsigned int inet::IntervalTree::current_parent = 0
private

Referenced by query().

◆ nil

◆ recursion_node_stack

it_recursion_node* inet::IntervalTree::recursion_node_stack = nullptr
private

Referenced by IntervalTree(), query(), and ~IntervalTree().

◆ recursion_node_stack_size

unsigned int inet::IntervalTree::recursion_node_stack_size = 0
private

Referenced by IntervalTree(), and query().

◆ recursion_node_stack_top

unsigned int inet::IntervalTree::recursion_node_stack_top = 0
private

Referenced by IntervalTree(), and query().

◆ root


The documentation for this class was generated from the following files:
inet::IntervalTree::rightRotate
void rightRotate(Node *node)
right rotation of tree node
Definition: IntervalTree.cc:134
inet::IntervalTree::nil
Node * nil
Definition: IntervalTree.h:157
inet::IntervalTree::Node::stored_interval
const Interval * stored_interval
interval stored in the node
Definition: IntervalTree.h:95
inet::IntervalTree::fixupMaxHigh
void fixupMaxHigh(Node *node)
Travels up to the root fixing the max_high fields after an insertion or deletion.
Definition: IntervalTree.cc:180
inet::IntervalTree::recursion_node_stack_top
unsigned int recursion_node_stack_top
Definition: IntervalTree.h:183
inet::IntervalTree::deleteFixup
void deleteFixup(Node *node)
Definition: IntervalTree.cc:324
inet::IntervalTree::Node::parent
Node * parent
Definition: IntervalTree.h:110
inet::IntervalTree::current_parent
unsigned int current_parent
Definition: IntervalTree.h:182
inet::IntervalTree::getMaximum
Node * getMaximum(Node *node) const
Definition: IntervalTree.cc:249
inet::IntervalTree::getSuccessor
Node * getSuccessor(Node *node) const
Get the successor of a given node.
Definition: IntervalTree.cc:256
inet::IntervalTree::leftRotate
void leftRotate(Node *node)
left rotation of tree node
Definition: IntervalTree.cc:110
inet::IntervalTree::recursiveInsert
void recursiveInsert(Node *node)
recursively insert a node
Definition: IntervalTree.cc:158
inet::IntervalTree::Node::left
Node * left
Definition: IntervalTree.h:106
inet::overlap
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
inet::IntervalTree::getMinimum
Node * getMinimum(Node *node) const
Definition: IntervalTree.cc:242
inet::IntervalTree::Node::right
Node * right
Definition: IntervalTree.h:108
if
if(cwndVector) cwndVector -> record(state->snd_cwnd)
inet::IntervalTree::deleteNode
const Interval * deleteNode(Node *node)
Delete one node of the interval tree.
Definition: IntervalTree.cc:410
inet::IntervalTree::recursion_node_stack
it_recursion_node * recursion_node_stack
Definition: IntervalTree.h:181
inet::IntervalTree::recursion_node_stack_size
unsigned int recursion_node_stack_size
Definition: IntervalTree.h:180
inet::IntervalTree::it_recursion_node::try_right_branch
bool try_right_branch
Definition: IntervalTree.h:122
inet::IntervalTree::Node::key
simtime_t key
Definition: IntervalTree.h:97
inet::sctp::max
double max(const double a, const double b)
Returns the maximum of a and b.
Definition: SctpAssociation.h:266
inet::IntervalTree::it_recursion_node::start_node
Node * start_node
Definition: IntervalTree.h:118
inet::IntervalTree::Node::max_high
simtime_t max_high
Definition: IntervalTree.h:101
inet::IntervalTree::Node::red
bool red
red or black node: if red = false then the node is black
Definition: IntervalTree.h:104
inet::IntervalTree::recursiveSearch
Node * recursiveSearch(Node *node, const Interval *ivl) const
recursively find the node corresponding to the interval
Definition: IntervalTree.cc:393
inet::IntervalTree::it_recursion_node::parent_index
unsigned int parent_index
Definition: IntervalTree.h:120
inet::IntervalTree::Node::high
simtime_t high
Definition: IntervalTree.h:99
inet::IntervalTree::recursivePrint
void recursivePrint(Node *node) const
recursively print a subtree
Definition: IntervalTree.cc:310
inet::IntervalTree::root
Node * root
Definition: IntervalTree.h:155