/* $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