mirror of https://github.com/yasm/yasm.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.1 KiB
59 lines
2.1 KiB
/* $Id$ */ |
|
#ifndef YASM_INTTREE_H |
|
#define YASM_INTTREE_H |
|
|
|
/* The interval_tree.h and interval_tree.cc files contain code for |
|
* interval trees implemented using red-black-trees as described in |
|
* the book _Introduction_To_Algorithms_ by Cormen, Leisserson, |
|
* and Rivest. |
|
*/ |
|
|
|
typedef struct IntervalTreeNode { |
|
struct IntervalTreeNode *left, *right, *parent; |
|
void *data; |
|
long low; |
|
long high; |
|
long maxHigh; |
|
int red; /* if red=0 then the node is black */ |
|
} IntervalTreeNode; |
|
|
|
typedef struct it_recursion_node { |
|
/* This structure stores the information needed when we take the |
|
* right branch in searching for intervals but possibly come back |
|
* and check the left branch as well. |
|
*/ |
|
IntervalTreeNode *start_node; |
|
unsigned int parentIndex; |
|
int tryRightBranch; |
|
} it_recursion_node; |
|
|
|
typedef struct IntervalTree { |
|
/* A sentinel is used for root and for nil. These sentinels are |
|
* created when ITTreeCreate is called. root->left should always |
|
* point to the node which is the root of the tree. nil points to a |
|
* node which should always be black but has aribtrary children and |
|
* parent and no key or info. The point of using these sentinels is so |
|
* that the root and nil nodes do not require special cases in the code |
|
*/ |
|
IntervalTreeNode *root; |
|
IntervalTreeNode *nil; |
|
|
|
/*private:*/ |
|
unsigned int recursionNodeStackSize; |
|
it_recursion_node * recursionNodeStack; |
|
unsigned int currentParent; |
|
unsigned int recursionNodeStackTop; |
|
} IntervalTree; |
|
|
|
IntervalTree *IT_create(void); |
|
void IT_destroy(IntervalTree *); |
|
void IT_print(const IntervalTree *); |
|
void *IT_delete_node(IntervalTree *, IntervalTreeNode *, long *low, |
|
long *high); |
|
IntervalTreeNode *IT_insert(IntervalTree *, long low, long high, void *data); |
|
IntervalTreeNode *IT_get_predecessor(const IntervalTree *, IntervalTreeNode *); |
|
IntervalTreeNode *IT_get_successor(const IntervalTree *, IntervalTreeNode *); |
|
void IT_enumerate(IntervalTree *, long low, long high, void *cbd, |
|
void (*callback) (IntervalTreeNode *node, void *cbd)); |
|
|
|
#endif
|
|
|