Home | History | Annotate | Download | only in libyasm
      1 #ifndef YASM_INTTREE_H
      2 #define YASM_INTTREE_H
      3 
      4 #ifndef YASM_LIB_DECL
      5 #define YASM_LIB_DECL
      6 #endif
      7 
      8 /* The interval_tree.h and interval_tree.cc files contain code for
      9  * interval trees implemented using red-black-trees as described in
     10  * the book _Introduction_To_Algorithms_ by Cormen, Leisserson,
     11  * and Rivest.
     12  */
     13 
     14 typedef struct IntervalTreeNode {
     15     struct IntervalTreeNode *left, *right, *parent;
     16     void *data;
     17     long low;
     18     long high;
     19     long maxHigh;
     20     int red; /* if red=0 then the node is black */
     21 } IntervalTreeNode;
     22 
     23 typedef struct it_recursion_node {
     24     /* This structure stores the information needed when we take the
     25      * right branch in searching for intervals but possibly come back
     26      * and check the left branch as well.
     27      */
     28     IntervalTreeNode *start_node;
     29     unsigned int parentIndex;
     30     int tryRightBranch;
     31 } it_recursion_node;
     32 
     33 typedef struct IntervalTree {
     34     /* A sentinel is used for root and for nil.  These sentinels are
     35      * created when ITTreeCreate is called.  root->left should always
     36      * point to the node which is the root of the tree.  nil points to a
     37      * node which should always be black but has aribtrary children and
     38      * parent and no key or info.  The point of using these sentinels is so
     39      * that the root and nil nodes do not require special cases in the code
     40      */
     41     IntervalTreeNode *root;
     42     IntervalTreeNode *nil;
     43 
     44 /*private:*/
     45     unsigned int recursionNodeStackSize;
     46     it_recursion_node * recursionNodeStack;
     47     unsigned int currentParent;
     48     unsigned int recursionNodeStackTop;
     49 } IntervalTree;
     50 
     51 YASM_LIB_DECL
     52 IntervalTree *IT_create(void);
     53 YASM_LIB_DECL
     54 void IT_destroy(IntervalTree *);
     55 YASM_LIB_DECL
     56 void IT_print(const IntervalTree *);
     57 YASM_LIB_DECL
     58 void *IT_delete_node(IntervalTree *, IntervalTreeNode *, long *low,
     59                      long *high);
     60 YASM_LIB_DECL
     61 IntervalTreeNode *IT_insert(IntervalTree *, long low, long high, void *data);
     62 YASM_LIB_DECL
     63 IntervalTreeNode *IT_get_predecessor(const IntervalTree *, IntervalTreeNode *);
     64 YASM_LIB_DECL
     65 IntervalTreeNode *IT_get_successor(const IntervalTree *, IntervalTreeNode *);
     66 YASM_LIB_DECL
     67 void IT_enumerate(IntervalTree *, long low, long high, void *cbd,
     68                   void (*callback) (IntervalTreeNode *node, void *cbd));
     69 
     70 #endif
     71