pers_tree.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:6k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  pers_tree.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_PERS_TREE_H
  12. #define LEDA_PERS_TREE_H
  13. #include <LEDA/basic.h>
  14. #include <LEDA/list.h>
  15. typedef void (*DRAW_NODE_FCT)(double,double,void*);
  16. typedef void (*DRAW_EDGE_FCT)(double,double,double,double);
  17. /* implementation of a node of the ephemeral red-black tree of a specific
  18.  * persistent  node, where the colors of that persistent node through the
  19.  * various versions can be found
  20.  */
  21. class pers_tree_node;
  22. class C_pers_tree_node;
  23. class F_pers_tree_node;
  24. class VER_pers_tree_node;
  25. typedef list_item Version;
  26.  
  27. class C_pers_tree_node
  28. {
  29.   friend class pers_rb_tree;
  30.   Version vers_stamp;
  31.   C_pers_tree_node* c_link[3];
  32.   int c_right;
  33.   int c_color;
  34.   int col_value;
  35.   LEDA_MEMORY(C_pers_tree_node)
  36. };
  37. /* implementation of a node of the  ephemeral red-black tree of a specific
  38.  * persistent node, where the children of that persistent node through the
  39.  * various versions can be found
  40.  */
  41.  
  42. class F_pers_tree_node
  43. {
  44.   friend class pers_rb_tree;
  45.   Version ver_stamp;
  46.   F_pers_tree_node* f_link[3];
  47.   int f_right;
  48.   int f_color;
  49.   pers_tree_node* poin_value;
  50.   LEDA_MEMORY(F_pers_tree_node)
  51. };
  52. /* implementation of a persistent node */
  53. class pers_tree_node
  54. {
  55.   friend class pers_rb_tree;
  56.   void *key;
  57.   void *info;
  58.   pers_tree_node *parent;
  59.   int right;
  60.   int is_leaf;
  61.   F_pers_tree_node *link[2];
  62.   C_pers_tree_node *red;
  63.   F_pers_tree_node *copy;
  64.   pers_tree_node* next;  // linking all used pers_tree_nodeS
  65.   LEDA_MEMORY(pers_tree_node)
  66. };
  67. /* implementation of a node (or member) of the version list */
  68. class VER_pers_tree_node
  69.   friend class pers_rb_tree;
  70.   pers_tree_node*  acc_pointer;
  71.   int    popul;
  72.   double ser_num;
  73.   LEDA_MEMORY(VER_pers_tree_node)
  74. };
  75. typedef VER_pers_tree_node* ver_node;
  76. struct V_LIST {
  77. list<ver_node> vl;
  78. int count;
  79. pers_tree_node* used;
  80. };
  81. class pers_rb_tree {
  82. protected:
  83. V_LIST* v_list;
  84. virtual int cmp_keys(GenPtr, GenPtr) { return 0; }
  85. virtual void print_key(GenPtr)  {}
  86. virtual void copy_key(GenPtr&)  {}
  87. virtual void copy_inf(GenPtr&)  {}
  88. virtual void clear_key(GenPtr&) {}
  89. virtual void clear_inf(GenPtr&) {}
  90.  
  91. pers_tree_node* child(int leftright, pers_tree_node *p, Version i)
  92. { return(acc_step(p->link[leftright], i)); }
  93. void* get_key(pers_tree_node *p, Version i)
  94. { return (acc_step(p->copy, i))->key; }
  95. int isleaf(pers_tree_node *p) 
  96. { //return (p == p->link[0]->poin_value); 
  97.   return p->is_leaf;
  98.  }
  99.   
  100. pers_tree_node* sibling(pers_tree_node *p, Version i)
  101. { return acc_step(p->parent->link[1 - p->right], i); } 
  102. /* define the order of versions in the version list */
  103. int vless(Version x, Version y)    
  104. { return  (v_list->vl[x]->ser_num < v_list->vl[y]->ser_num); }
  105. /* find the next to a given version in the version list */ 
  106. Version  iplus(Version i)
  107. { return v_list->vl.succ(i); }
  108. pers_tree_node*   acc_step(F_pers_tree_node *, Version);
  109. Version new_version(Version);
  110. void    m_b_root(Version);
  111. F_pers_tree_node* f_nleaf(pers_tree_node*, Version);
  112. F_pers_tree_node* f_nnode(F_pers_tree_node*, F_pers_tree_node*);
  113. F_pers_tree_node* f_rbsearch(F_pers_tree_node* p, Version);
  114. void    f_rbclear(F_pers_tree_node*);
  115. int     f_insert(F_pers_tree_node*, pers_tree_node*, Version);
  116. void    f_single_rot(F_pers_tree_node*, int);
  117. void    f_double_rot(F_pers_tree_node*, int);
  118. C_pers_tree_node* c_nleaf(int, Version);
  119. C_pers_tree_node* c_nnode(C_pers_tree_node*, C_pers_tree_node*);
  120. C_pers_tree_node* c_rbsearch(C_pers_tree_node* p, Version);
  121. void    c_rbclear(C_pers_tree_node*);
  122. int     c_insert(C_pers_tree_node*, int, Version);
  123. void    c_single_rot(C_pers_tree_node*, int);
  124. void    c_double_rot(C_pers_tree_node*, int);
  125. pers_tree_node*   single_rot(pers_tree_node* top_node, int dir, Version i);
  126. pers_tree_node*   double_rot(pers_tree_node* top_node, int dir, Version i);
  127. pers_tree_node*   newnode(pers_tree_node* c1, pers_tree_node* c2, Version i);
  128. pers_tree_node*   newleaf(void* val, void* inf, pers_tree_node*, pers_tree_node*, Version i);
  129. int     isred(pers_tree_node* p, Version i);
  130. void    up_col(C_pers_tree_node* p, int newvalue, Version i);
  131. void    update(F_pers_tree_node* p, pers_tree_node* newvalue, Version i);
  132. pers_tree_node*   search(void* val, Version i)     { pers_tree_node* p; return search(val,p,i);}
  133. pers_tree_node*   search(void*, pers_tree_node*&, Version);
  134. public:
  135.  pers_rb_tree() {}
  136. virtual ~pers_rb_tree() {}
  137. void init_tree();
  138. void* key(pers_tree_node* p)  { return p->key; }
  139. void* inf(pers_tree_node* p)  { return p->info; }
  140. Version copy_version(Version);
  141. void    del_version(Version);
  142. Version del(void*, Version);
  143. Version insert(void*, void*, Version);
  144. Version change_inf(pers_tree_node*,void*,Version);
  145. pers_tree_node* lookup(void *val,Version v);
  146. pers_tree_node* locate(void *val,Version v);
  147. pers_tree_node* locate_pred(void *val,Version v);
  148. pers_tree_node* min(Version v);
  149. pers_tree_node* max(Version v);
  150. pers_tree_node* succ(pers_tree_node* p, Version v) { return child(1,p,v); }
  151. pers_tree_node* pred(pers_tree_node* p, Version v) { return child(0,p,v); }
  152. int   size(Version v) { return v_list->vl[v]->popul; }
  153. double ver_num(Version v)  { return v_list->vl[v]->ser_num; }
  154. void print(pers_tree_node*,Version);
  155. void del_tree();
  156. void print(Version v) 
  157. { //cout << form("%5f : ",v_list->vl[v]->ser_num);
  158.   print(v_list->vl[v]->acc_pointer,v);
  159.   newline;
  160.  }
  161. void draw(DRAW_NODE_FCT,DRAW_EDGE_FCT, Version, pers_tree_node*, double, double, double, double, double);
  162. void draw(DRAW_NODE_FCT,DRAW_EDGE_FCT, Version, double, double, double, double);
  163. };
  164. #endif