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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _pers_tree.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/impl/pers_tree.h>
  12. #define LEFT 0
  13. #define RIGHT 1
  14. #define f_isred(p)   ((p)->f_color)
  15. #define c_isred(p)   ((p)->c_color)
  16. #define f_mred(p)    ((p)->f_color=1)
  17. #define c_mred(p)    ((p)->c_color=1)
  18. #define f_mblack(p)  ((p)->f_color=0)
  19. #define c_mblack(p)  ((p)->c_color=0)
  20. #define f_lchild(p)  ((p)->f_link[0])
  21. #define c_lchild(p)  ((p)->c_link[0])
  22. #define f_rchild(p)  ((p)->f_link[1])
  23. #define c_rchild(p)  ((p)->c_link[1])
  24. #define f_parent(p)  ((p)->f_link[2])
  25. #define c_parent(p)  ((p)->c_link[2])
  26. #define f_isleaf(p)  (f_lchild(p)==(p))
  27. #define c_isleaf(p)  (c_lchild(p)==(p))
  28. void pers_rb_tree::f_rbclear(F_pers_tree_node* p)
  29. { if (!(f_isleaf(p)))
  30.     { f_rbclear(f_lchild(p));
  31.       f_rbclear(f_rchild(p));
  32.      }
  33.   delete p;
  34.  }
  35. void pers_rb_tree::c_rbclear(C_pers_tree_node* p)
  36. { if (!(c_isleaf(p)))
  37.     { c_rbclear(c_lchild(p));
  38.       c_rbclear(c_rchild(p));
  39.      }
  40.   delete p;
  41. }
  42. F_pers_tree_node* pers_rb_tree::f_rbsearch(F_pers_tree_node* p, Version i)
  43. {
  44.   F_pers_tree_node *q;
  45.   
  46.   q = f_rchild(p);
  47.   while (!(f_isleaf(q)))
  48.   {  
  49.     if (i == q->ver_stamp || vless(i, q->ver_stamp))
  50.       q = f_lchild(q);
  51.     else
  52.       q = f_rchild(q);
  53.   }
  54.   return(q);
  55. }
  56. C_pers_tree_node* pers_rb_tree::c_rbsearch(C_pers_tree_node* p, Version i)
  57. {
  58.   C_pers_tree_node *q;
  59.   
  60.   q = c_rchild(p);
  61.   while (!(c_isleaf(q)))
  62.   {
  63.     if (i == q->vers_stamp || vless(i, q->vers_stamp))
  64.       q = c_lchild(q);
  65.     else
  66.       q = c_rchild(q);
  67.   }
  68.   return(q);
  69. }
  70. F_pers_tree_node * pers_rb_tree::f_nleaf(pers_tree_node* newvalue, Version i)
  71. {
  72.   F_pers_tree_node* result = new F_pers_tree_node;
  73.   f_mblack(result);
  74.   result->ver_stamp = i;
  75.   f_lchild(result) = f_rchild(result) = result;
  76.   result->poin_value = newvalue;
  77.   return(result);
  78. }
  79. C_pers_tree_node * pers_rb_tree::c_nleaf(int newvalue, Version i)
  80. {
  81.   C_pers_tree_node* result = new C_pers_tree_node;
  82.   c_mblack(result);
  83.   result->vers_stamp = i;
  84.   c_lchild(result) = c_rchild(result) = result;
  85.   result->col_value = newvalue;
  86.   return(result);
  87. }
  88. F_pers_tree_node * pers_rb_tree::f_nnode(F_pers_tree_node* c1, F_pers_tree_node* c2)
  89. {
  90.   F_pers_tree_node* result = new F_pers_tree_node;
  91.   f_mred(result);
  92.   if (vless(c1->ver_stamp, c2->ver_stamp))
  93.   {
  94.     f_lchild(result) = c1;
  95.     c1->f_right = 0;
  96.     f_rchild(result) = c2;
  97.     c2->f_right = 1;
  98.   }
  99.   else
  100.   {
  101.     f_lchild(result) = c2;
  102.     c2->f_right = 0;
  103.     f_rchild(result) = c1;
  104.     c1->f_right = 1;
  105.   }
  106.   f_parent(c1) = f_parent(c2) = result;
  107.   result->ver_stamp = (f_lchild(result))->ver_stamp;
  108.   result->poin_value = NULL;
  109.   return(result);
  110. }
  111. C_pers_tree_node* pers_rb_tree::c_nnode(C_pers_tree_node* c1, C_pers_tree_node* c2)
  112. {
  113.   C_pers_tree_node* result = new C_pers_tree_node;
  114.   c_mred(result);
  115.   if (vless(c1->vers_stamp, c2->vers_stamp))
  116.   {
  117.     c_lchild(result) = c1;
  118.     c1->c_right = 0;
  119.     c_rchild(result) = c2;
  120.     c2->c_right = 1;
  121.   }
  122.   else
  123.   {
  124.     c_lchild(result) = c2;
  125.     c2->c_right = 0;
  126.     c_rchild(result) = c1;
  127.     c1->c_right = 1;
  128.   }
  129.   c_parent(c1) = c_parent(c2) = result;
  130.   result->vers_stamp = (c_lchild(result))->vers_stamp;
  131.   result->col_value = 0;  
  132.   return(result);
  133. }
  134. void  pers_rb_tree::f_single_rot(F_pers_tree_node* top_node, int dir)
  135. {
  136.   F_pers_tree_node *temp, *q;
  137.   q = top_node->f_link[1-dir];
  138.   top_node->f_link[1-dir] = temp = q->f_link[dir];
  139.   temp->f_right = 1 - dir;
  140.   f_parent(temp) = top_node;
  141.   q->f_link[dir] = top_node;
  142.   temp = f_parent(top_node);
  143.   f_parent(top_node) = q;
  144.   q->f_right = top_node->f_right;
  145.   temp->f_link[top_node->f_right] = q;
  146.   f_parent(q) = temp;
  147.   top_node->f_right = dir;
  148.   return;
  149. }
  150. void  pers_rb_tree::c_single_rot(C_pers_tree_node* top_node, int dir)
  151. {
  152.   C_pers_tree_node *temp, *q;
  153.   q = top_node->c_link[1-dir];
  154.   top_node->c_link[1-dir] = temp = q->c_link[dir];
  155.   temp->c_right = 1 - dir;
  156.   c_parent(temp) = top_node;
  157.   q->c_link[dir] = top_node;
  158.   temp = c_parent(top_node);
  159.   c_parent(top_node) = q;
  160.   q->c_right = top_node->c_right;
  161.   temp->c_link[top_node->c_right] = q;
  162.   c_parent(q) = temp;
  163.   top_node->c_right = dir;
  164.   return;
  165. }
  166. void  pers_rb_tree::f_double_rot(F_pers_tree_node* top_node, int dir)
  167. {
  168.   F_pers_tree_node *q, *r, *temp;
  169.   q = top_node->f_link[1-dir];
  170.   r = q->f_link[dir];
  171.   top_node->f_link[1-dir] = temp = r->f_link[dir];
  172.   temp->f_right = 1 - dir;
  173.   f_parent(temp) = top_node;
  174.   q->f_link[dir] = (temp = r->f_link[1-dir]);
  175.   temp->f_right = dir;
  176.   f_parent(temp) = q;
  177.   temp = f_parent(top_node);
  178.   r->f_right = top_node->f_right;
  179.   r->f_link[dir] = top_node;
  180.   f_parent(top_node) = r;
  181.   top_node->f_right = dir;
  182.   r->f_link[1-dir] = q;
  183.   f_parent(q) = r;
  184.   temp->f_link[r->f_right] = r;
  185.   f_parent(r) = temp;
  186.   return;
  187. }
  188. void  pers_rb_tree::c_double_rot(C_pers_tree_node* top_node, int dir)
  189. {
  190.   C_pers_tree_node *q, *r, *temp;
  191.   q = top_node->c_link[1-dir];
  192.   r = q->c_link[dir];
  193.   top_node->c_link[1-dir] = temp = r->c_link[dir];
  194.   temp->c_right = 1 - dir;
  195.   c_parent(temp) = top_node;
  196.   q->c_link[dir] = (temp = r->c_link[1-dir]);
  197.   temp->c_right = dir;
  198.   c_parent(temp) = q;
  199.   temp = c_parent(top_node);
  200.   r->c_right = top_node->c_right;
  201.   r->c_link[dir] = top_node;
  202.   c_parent(top_node) = r;
  203.   top_node->c_right = dir;
  204.   r->c_link[1-dir] = q;
  205.   c_parent(q) = r;
  206.   temp->c_link[r->c_right] = r;
  207.   c_parent(r) = temp;
  208.   return;
  209. }
  210. int pers_rb_tree::f_insert(F_pers_tree_node* head, pers_tree_node* newvalue, Version i)
  211. {
  212.   int aux_bool;
  213.   F_pers_tree_node *p, *q, *r, *aux_node;
  214.   if (f_rchild(head) == NULL)
  215.   {
  216.     p = f_nleaf(newvalue, i);
  217.     p->f_right = 1;
  218.     f_parent(p) = head;
  219.     f_rchild(head) = p;
  220.     return(0);
  221.   }
  222.   p = f_rbsearch(head, i);
  223.   if (p->ver_stamp == i)
  224.   {
  225.     p->poin_value = newvalue;
  226.     return(1);
  227.   }
  228.   q = f_nleaf(newvalue, i);
  229.   aux_bool = p->f_right;
  230.   aux_node = f_parent(p);
  231.   r = f_nnode(p, q);
  232.   f_parent(r) = aux_node;
  233.   r->f_right = aux_bool;
  234.   aux_node->f_link[aux_bool] = r;
  235.   if (!f_isred(aux_node))
  236.   {
  237.     f_mblack(f_rchild(head));
  238.     return(0);
  239.   }
  240.   q = aux_node;
  241.   p = f_parent(q);
  242.   while ((f_isred(f_lchild(p))) && (f_isred(f_rchild(p))))
  243.   {
  244.     f_mblack(f_lchild(p));
  245.     f_mblack(f_rchild(p));
  246.     f_mred(p);
  247.     r = p;
  248.     q = f_parent(r);
  249.     if (!f_isred(q))
  250.     {
  251.       f_mblack(f_rchild(head));
  252.       return(0);
  253.     }
  254.     p = f_parent(q);
  255.   }
  256.   if (q->f_right == r->f_right)
  257.   {
  258.     f_mred(p);
  259.     f_mblack(q);
  260.     f_single_rot(p, 1-r->f_right);
  261.   }
  262.   else
  263.   {
  264.     f_mblack(r);
  265.     f_mred(p);
  266.     f_double_rot(p, r->f_right);
  267.   }
  268.   f_mblack(f_rchild(head));
  269.   return(0);
  270. }
  271. int pers_rb_tree::c_insert(C_pers_tree_node* head, int newvalue, Version i)
  272. {
  273.   int aux_bool;
  274.   C_pers_tree_node *p, *q, *r, *aux_node;
  275.   if (c_rchild(head) == NULL)
  276.   {
  277.     p = c_nleaf(newvalue, i);
  278.     p->c_right = 1;
  279.     c_parent(p) = head;
  280.     c_rchild(head) = p;
  281.     return(0);
  282.   }
  283.   p = c_rbsearch(head, i);
  284.   if (p->vers_stamp == i)
  285.   {
  286.     p->col_value = newvalue;
  287.     return(1);
  288.   }
  289.   q = c_nleaf(newvalue, i);
  290.   aux_bool = p->c_right;
  291.   aux_node = c_parent(p);
  292.   r = c_nnode(p, q);
  293.   c_parent(r) = aux_node;
  294.   r->c_right = aux_bool;
  295.   aux_node->c_link[aux_bool] = r;
  296.   if (!c_isred(aux_node))
  297.   {
  298.     c_mblack(c_rchild(head));
  299.     return(0);
  300.   }
  301.   q = aux_node;
  302.   p = c_parent(q);
  303.   while ((c_isred(c_lchild(p))) && (c_isred(c_rchild(p))))
  304.   {
  305.     c_mblack(c_lchild(p));
  306.     c_mblack(c_rchild(p));
  307.     c_mred(p);
  308.     r = p;
  309.     q = c_parent(r);
  310.     if (!c_isred(q))
  311.     {
  312.       c_mblack(c_rchild(head));
  313.       return(0);
  314.     }
  315.     p = c_parent(q);
  316.   }
  317.   if (q->c_right == r->c_right)
  318.   {
  319.     c_mred(p);
  320.     c_mblack(q);
  321.     c_single_rot(p, 1-r->c_right);
  322.   }
  323.   else
  324.   {
  325.     c_mblack(r);
  326.     c_mred(p);
  327.     c_double_rot(p, r->c_right);
  328.   }
  329.   c_mblack(c_rchild(head));
  330.   return(0);
  331. }
  332. /* insert the new version in the appropriate position and update the 
  333.  * version list
  334.  */
  335. void pers_rb_tree::del_version(Version) 
  336. { if (--v_list->count ==0) del_tree(); }
  337. Version pers_rb_tree::copy_version(Version i) { return new_version(i); }
  338. Version pers_rb_tree::new_version(Version i)
  339. {
  340.   Version succ = v_list->vl.succ(i);
  341.   
  342.   ver_node p = new VER_pers_tree_node;
  343.   if (succ != nil)
  344.      p->ser_num = (v_list->vl[i]->ser_num + v_list->vl[succ]->ser_num) / 2.0;
  345.   else 
  346.      p->ser_num = v_list->vl[i]->ser_num + 1000;
  347.   p->popul = v_list->vl[i]->popul;
  348.   p->acc_pointer = v_list->vl[i]->acc_pointer;
  349.   v_list->count++;
  350.   return v_list->vl.insert(p,i);
  351. }
  352. /* implementation of the update step (change of left or right child)
  353.  * for a specific persistent node and update operation 
  354.  */
  355.  
  356. void pers_rb_tree::update(F_pers_tree_node* p, pers_tree_node* newvalue, Version i)
  357.   F_pers_tree_node *p1, *i1, *i2;
  358.   Version ip = v_list->vl.succ(i);
  359.   if (f_insert(p, newvalue, i) == 1) return;
  360.   if (ip == nil || vless(ip,p->ver_stamp)) return;
  361.   p1 = f_rbsearch(p, i);
  362.   if (p1->f_right)
  363.   {
  364.     i1 = f_lchild(f_parent(p1));
  365.     if (f_isleaf(i1))
  366.       goto la;
  367.     else
  368.       i1 = f_rchild(i1);
  369. la: while (p1 != f_rchild(p) && p1->f_right)
  370.       p1 = f_parent(p1);
  371.     if (p1 == f_rchild(p))
  372.       i2 = NULL;
  373.     else
  374.     {
  375.       i2 = f_rchild(f_parent(p1));
  376.       while (!f_isleaf(i2))
  377.         i2 = f_lchild(i2);
  378.     }
  379.   }
  380.   else
  381.   {
  382.     i2 = f_rchild(f_parent(p1));
  383.     if (f_isleaf(i2))
  384.       goto m;
  385.     else
  386.       i2 = f_lchild(i2);
  387.  m: while (p1->f_right == 0)
  388.       p1 = f_parent(p1);
  389.     i1 = f_lchild(f_parent(p1));
  390.     while (!f_isleaf(i1))
  391.       i1 = f_rchild(i1);
  392.   }
  393.   if (i2 == NULL || vless(ip, i2->ver_stamp))
  394.      f_insert(p, i1->poin_value, ip);
  395. }
  396.    
  397. /* implementation of the update step (change of color) for a specific
  398.  * persistent node and update operation 
  399.  */
  400.  
  401. void pers_rb_tree::up_col(C_pers_tree_node* p, int newvalue, Version i)
  402.   C_pers_tree_node *p1, *i1, *i2;
  403.   
  404.   Version ip = v_list->vl.succ(i);
  405.   if (c_insert(p, newvalue, i) == 1) return;
  406.   if (ip ==nil  || vless(ip,p->vers_stamp)) return;
  407.   p1 = c_rbsearch(p, i);
  408.   if (p1->c_right)
  409.   {
  410.     i1 = c_lchild(c_parent(p1));
  411.     if (c_isleaf(i1))
  412.       goto lb;
  413.     else
  414.       i1 = c_rchild(i1);
  415. lb: while (p1 != c_rchild(p) && p1->c_right)
  416.       p1 = c_parent(p1);
  417.     if (p1 == c_rchild(p))
  418.       i2 = NULL;
  419.     else
  420.     {
  421.       i2 = c_rchild(c_parent(p1));
  422.       while (!c_isleaf(i2))
  423.         i2 = c_lchild(i2);
  424.     }
  425.   }
  426.   else
  427.   {
  428.     i2 = c_rchild(c_parent(p1));
  429.     if (c_isleaf(i2))
  430.       goto ma;
  431.     else
  432.       i2 = c_lchild(i2);
  433. ma: while (p1->c_right == 0)
  434.       p1 = c_parent(p1);
  435.     i1 = c_lchild(c_parent(p1));
  436.     while (!c_isleaf(i1))
  437.       i1 = c_rchild(i1);
  438.   }
  439.   if (i2 == NULL || vless(ip, i2->vers_stamp))
  440.      c_insert(p, i1->col_value, ip);
  441. }
  442.    
  443. /* implementation of the access step for a specific persistent node 
  444.  * and version 
  445.  */
  446. pers_tree_node * pers_rb_tree::acc_step(F_pers_tree_node *head, Version i)
  447. {
  448.   F_pers_tree_node *q, *i1;
  449.  
  450.   q = f_rbsearch(head, i);
  451.   if (q->ver_stamp == i)
  452.     return(q->poin_value);
  453.   if (vless(q->ver_stamp, i))
  454.     return(q->poin_value);
  455.   if (q->f_right)
  456.   {
  457.      i1 = f_lchild(f_parent(q));
  458.      if (f_isleaf(i1))
  459.        goto t;
  460.      else
  461.        i1 = f_rchild(i1);
  462.   }
  463.   else
  464.   {
  465.     while (q->f_right == 0)
  466.       q = f_parent(q);
  467.     i1 = f_lchild(f_parent(q));
  468.     while (!f_isleaf(i1))
  469.       i1 = f_rchild(i1);
  470.   }
  471. t:return(i1->poin_value);
  472. }
  473.   
  474. /* find out whether a given persistent node is red or not in a 
  475.  * specific version 
  476.  */
  477. int pers_rb_tree::isred(pers_tree_node* p, Version i)
  478. {
  479.   C_pers_tree_node *head, *q, *i1;
  480.   
  481.   if (isleaf(p))
  482.     return(0);
  483.   head = p->red;
  484.   q = c_rbsearch(head, i);
  485.   if (q->vers_stamp == i)
  486.     return(q->col_value);
  487.   if (vless(q->vers_stamp, i))
  488.     return(q->col_value);
  489.   if (q->c_right)
  490.   {  
  491.      i1 = c_lchild(c_parent(q));
  492.      if (c_isleaf(i1))
  493.        goto s;
  494.      else
  495.        i1 = c_rchild(i1);
  496.   }
  497.   else
  498.   {
  499.     while (q->c_right == 0)
  500.       q = c_parent(q);
  501.     i1 = c_lchild(c_parent(q));
  502.     while (!c_isleaf(i1))
  503.       i1 = c_rchild(i1);
  504.   }
  505. s:return(i1->col_value);
  506. }
  507.  
  508. /* create a new leaf and initialize the fields with the appropriate values */
  509.  
  510. pers_tree_node* pers_rb_tree::newleaf(void* val, void* inf, pers_tree_node* pred, pers_tree_node* succ, Version i)
  511. {
  512.   pers_tree_node *result;
  513.   F_pers_tree_node *res1, *res2;
  514.   C_pers_tree_node *res3;
  515.   
  516.   result = new pers_tree_node;
  517.   res1   = new F_pers_tree_node;
  518.   res2   = new F_pers_tree_node;
  519.   res3   = new C_pers_tree_node;
  520.    
  521.     result->key = val;
  522.     result->info = inf;
  523.     result->parent = NULL;
  524.     result->right = 1;
  525.     result->is_leaf = 1;
  526.     result->copy = NULL;
  527.     result->next = v_list->used;
  528.     v_list->used = result;
  529.     res1->ver_stamp = res2->ver_stamp = res3->vers_stamp = i;
  530.     f_lchild(res1) = f_rchild(res1) = f_parent(res1) = NULL;
  531.     f_lchild(res2) = f_rchild(res2) = f_parent(res2) = NULL;
  532.     c_lchild(res3) = c_rchild(res3) = c_parent(res3) = NULL;
  533.     res1->f_right = res2->f_right = res3->c_right = 1;
  534.     res1->f_color = res2->f_color = res3->c_color = 0;
  535.     res1->poin_value = res2->poin_value = NULL; 
  536.     res3->col_value = 0;  
  537.     f_insert(res1, pred, i);
  538.     f_insert(res2, succ, i);
  539.     c_insert(res3, 0, i);
  540.     result->link[0] = res1;
  541.     result->link[1] = res2;
  542.     result->red     = res3;
  543.     return result;
  544. }
  545. /* create a new persistent node and initialize its fields with the
  546.  * appropriate values 
  547.  */
  548.  
  549. pers_tree_node* pers_rb_tree::newnode(pers_tree_node* c1, pers_tree_node* c2, Version i)
  550. {
  551.   // c1 and c2 are leaves
  552.   pers_tree_node *result;
  553.   F_pers_tree_node *res1, *res2,  *res4;   // s.n. : res4 pointer to leaf (copy)
  554.   C_pers_tree_node *res3;
  555.   
  556.   result = new pers_tree_node;
  557.   res1   = new F_pers_tree_node;
  558.   res2   = new F_pers_tree_node;
  559.   res3   = new C_pers_tree_node;
  560.   res4   = new F_pers_tree_node;
  561.     result->parent = NULL;
  562.     result->next = v_list->used;
  563.     v_list->used = result;
  564.     res1->ver_stamp = res2->ver_stamp = res3->vers_stamp = i;
  565.     f_lchild(res1) = f_rchild(res1) = f_parent(res1) = NULL;
  566.     f_lchild(res2) = f_rchild(res2) = f_parent(res2) = NULL;
  567.     f_lchild(res4) = f_rchild(res4) = f_parent(res4) = NULL;
  568.     c_lchild(res3) = c_rchild(res3) = c_parent(res3) = NULL;
  569.     res1->f_right = res2->f_right = res3->c_right = res4->f_right = 1;
  570.     res1->f_color = res2->f_color = res3->c_color = res4->f_color = 0;
  571.     res1->poin_value = res2->poin_value = res4->poin_value = NULL; 
  572.     res3->col_value = 1;  
  573.     c_insert(res3, 1, i);
  574.     if (cmp_keys(c1->key, c2->key) < 1)
  575.     {
  576.       f_insert(res1, c1, i);
  577.       f_insert(res2, c2, i);
  578.       f_insert(res4, c1, i);
  579.       result->key = c1->key;
  580.     }
  581.     else
  582.     {
  583.       f_insert(res1, c2, i);
  584.       f_insert(res2, c1, i);
  585.       f_insert(res4, c2, i);
  586.       result->key = c2->key;
  587.     }
  588.     result->link[0] = res1;
  589.     result->link[1] = res2;
  590.     result->red     = res3;
  591.     result->copy    = res4;
  592.     result->is_leaf = 0;
  593.     return(result);
  594. }
  595.   
  596. /* implementation of the single rotation for the fully persistent
  597.  * red-black tree
  598.  */
  599. pers_tree_node* pers_rb_tree::single_rot(pers_tree_node* top_node, int dir, Version i)
  600. {
  601.   pers_tree_node *temp, *q, *newroot;
  602.   
  603.   newroot = NULL;
  604.   q = child(1 - dir, top_node, i);
  605.   temp = child(dir, q, i);
  606.   update(top_node->link[1 - dir], temp, i);
  607.   update(q->link[dir], top_node, i);
  608.   if ((temp = top_node->parent) == NULL)
  609.     newroot = q;
  610.   top_node->parent = q;
  611.   if (temp != NULL)
  612.     update(temp->link[top_node->right], q, i);
  613.   top_node->right = dir;
  614.   return(newroot);
  615. }
  616. /* implementation of the double rotation for the fully persistent
  617.  * red-black tree
  618.  */
  619. pers_tree_node* pers_rb_tree::double_rot(pers_tree_node* top_node, int dir, Version i)
  620. {
  621.   pers_tree_node *q, *r, *temp, *newroot;
  622.   
  623.   newroot = NULL;
  624.   q = child(1 - dir, top_node, i);
  625.   r = child(dir, q, i);
  626.   temp = child(dir, r, i);
  627.   update(top_node->link[1 - dir], temp, i);
  628.   temp = child(1 - dir, r, i);
  629.   update(q->link[dir], temp, i);
  630.   if ((temp = top_node->parent) == NULL)
  631.     newroot = r;
  632.   update(r->link[dir], top_node, i);
  633.   update(r->link[1 - dir], q, i);
  634.   if (temp != NULL)
  635.     update(temp->link[top_node->right], r, i);
  636.   return(newroot);
  637. }
  638. /* the root is colored black after each  update operation */
  639. void pers_rb_tree::m_b_root(Version i)
  640. {
  641.   pers_tree_node *p;
  642.   p = v_list->vl[i]->acc_pointer;
  643.   if (p != NULL && !isleaf(p) && isred(p, i))
  644.      up_col(p->red, 0, i);
  645. }
  646. //------------------------------------------------------------------------------
  647. // member functions
  648. //------------------------------------------------------------------------------
  649. void pers_rb_tree::init_tree()
  650. {
  651.    /* create dummy (empty) version 0 */
  652.    ver_node v = new VER_pers_tree_node;
  653.    v->ser_num =  0;
  654.    v->popul   =  0;
  655.    v->acc_pointer = NULL;
  656.    v_list = new V_LIST;
  657.    v_list->vl.append(v);
  658.    v_list->count = 1;
  659.    v_list->used = NULL;
  660. }
  661. pers_tree_node* pers_rb_tree::search(void *val, pers_tree_node*& copy, Version i)
  662. {
  663.   pers_tree_node *p, *q;
  664.   copy = NULL;
  665.   
  666.   if ((p = v_list->vl[i]->acc_pointer) == NULL)
  667.     return(NULL);
  668.   p->parent = NULL;
  669.   p->right = 1;
  670.   while (!isleaf(p))
  671.   {
  672.     int v = cmp_keys(val, get_key(p,i));
  673.     if (v < 1)
  674.     { if (v==0) copy = p;
  675.       q = p;
  676.       p = child(0, p, i);
  677.       p->parent = q;
  678.       p->right = 0;
  679.      }
  680.     else
  681.     { q = p;
  682.       p = child(1, p, i);
  683.       p->parent = q;
  684.       p->right = 1;
  685.      }
  686.    }
  687.    return p;
  688. }
  689.  
  690. Version  pers_rb_tree::del(void *val, Version i1)
  691. {
  692.   pers_tree_node *pos_del, *par1, *par2, *root, *newroot, *temp, *copy;
  693.   Version i  = new_version(i1);
  694.   
  695.   if ((pos_del = search(val, copy, i1)) == NULL) return i; //empty tree
  696.   if (cmp_keys(pos_del->key, val) != 0) return i;  // key not found
  697.   if ((--(v_list->vl[i]->popul)) == 0)
  698.   {
  699.     v_list->vl[i]->acc_pointer = NULL;
  700.     return i;
  701.   }
  702.   //update links to neighbor leaves
  703.   pers_tree_node* pred = child(0,pos_del,i);
  704.   pers_tree_node* succ = child(1,pos_del,i);
  705.   if (pred) update(pred->link[1],succ,i);
  706.   if (succ) update(succ->link[0],pred,i);
  707.   root = v_list->vl[i]->acc_pointer;
  708.   if ((par1 = pos_del->parent) == root)
  709.   {
  710.     v_list->vl[i]->acc_pointer = sibling(pos_del, i);
  711.     goto end;
  712.    }
  713.   par2 = par1->parent;
  714.   pos_del = sibling(pos_del, i);
  715.   update(par2->link[par1->right], pos_del, i);
  716.   pos_del->parent = par2;
  717.   pos_del->right = par1->right;
  718.   if (copy != NULL && copy != par1)  // we have to overwrite copy  by pred
  719.   {
  720.     update(copy->copy, pred, i);
  721.    }
  722.   
  723.   if (isred(par1, i))
  724.     goto end;
  725.   if (isred(pos_del, i))
  726.   {
  727.     up_col(pos_del->red, 0, i);
  728.     goto end;
  729.   }
  730.   par1 = sibling(pos_del, i);
  731.   while ((!isred(par1, i)) && (!isred(child(0, par1, i), i)) &&
  732.          (!isred(child(1, par1, i), i)))
  733.   {
  734.     up_col(par1->red, 1, i);
  735.     pos_del = pos_del->parent;
  736.     if (isred(pos_del, i))
  737.     {
  738.       up_col(pos_del->red, 0, i);
  739.       goto end;
  740.     }
  741.     if (pos_del == root)
  742.       goto end;
  743.     else
  744.       par1 = sibling(pos_del, i);
  745.   }
  746.   par2 = pos_del->parent;
  747.   if (isred(par1, i))
  748.   {
  749.     up_col(par2->red, 1, i);
  750.     up_col(par1->red, 0,i);
  751.     if ((newroot = single_rot(par2, pos_del->right, i)) != NULL)
  752.       v_list->vl[i]->acc_pointer = newroot;
  753.     par1 = sibling(pos_del,i);
  754.     if ((!isred(child(0, par1, i), i)) && (!isred(child(1, par1, i), i)))
  755.     {
  756.       up_col(par1->red, 1, i);
  757.       up_col((pos_del->parent)->red, 0, i);
  758.       goto end;
  759.     }
  760.   }
  761.   par2 = pos_del->parent;
  762.   if (!pos_del->right)
  763.     if (isred(child(0, par1, i), i))
  764.     {
  765.       temp = child(0, par1, i);
  766.       up_col(temp->red, isred(par2, i), i);
  767.       up_col(par2->red, 0, i);
  768.       newroot = double_rot(par2, LEFT, i);
  769.     }
  770.     else
  771.     {
  772.       up_col(par1->red, isred(par2, i), i);
  773.       up_col(par2->red, 0, i);
  774.       temp = child(1, par1, i);
  775.       up_col(temp->red, 0, i);
  776.       newroot = single_rot(par2, LEFT, i);
  777.     }
  778.   else
  779.     if (isred(child(0, par1, i), i))
  780.     {
  781.       up_col(par1->red, isred(par2, i), i);
  782.       up_col(par2->red, 0, i);
  783.       temp = child(0, par1, i);
  784.       up_col(temp->red, 0, i);
  785.       newroot = single_rot(par2, RIGHT, i);
  786.     }
  787.     else
  788.     {
  789.       temp = child(1, par1, i);
  790.       up_col(temp->red, isred(par2, i), i);
  791.       up_col(par2->red, 0, i);
  792.       newroot = double_rot(par2, RIGHT, i);
  793.     }
  794.   if (newroot != NULL)
  795.     v_list->vl[i]->acc_pointer = newroot;
  796. end:
  797.   m_b_root(i);
  798.   return i;
  799. }
  800. Version pers_rb_tree::insert(void *val, void* info, Version i1)
  801. {
  802.   int aux_bool; 
  803.   pers_tree_node *p, *q, *r, *aux_node, *root, *newroot, *temp;
  804.   Version i = new_version(i1);
  805.   p = search(val, i1);
  806.   if (p && cmp_keys(p->key, val) == 0) return i;  // key already there
  807.   copy_key(val);
  808.   copy_inf(info);
  809.   
  810.   if (p == NULL)   // empty tree
  811.   { p = newleaf(val, info, nil, nil, i);
  812.     v_list->vl[i]->acc_pointer = p;
  813.     v_list->vl[i]->popul = 1;
  814.     goto end;
  815.    }
  816.   (v_list->vl[i]->popul)++;
  817.   if (cmp_keys(val, p->key) > 0)   // new rightmost leaf 
  818.     { q = newleaf(val,info, p, nil, i);   
  819.       update(p->link[1], q, i);
  820.      }
  821.   else // new  leaf before  p 
  822.     { pers_tree_node * pred = child(0,p,i);
  823.       q = newleaf(val,info, pred, p, i);   
  824.       update(p->link[0], q, i);
  825.       if (pred) update(pred->link[1], q, i);
  826.      }
  827.   aux_bool = p->right;
  828.   r = newnode(p, q, i);
  829.   if (p->parent == NULL)
  830.   {
  831.     v_list->vl[i]->acc_pointer = r;
  832.     goto end;
  833.   }
  834.   aux_node = p->parent;
  835.   r->right = aux_bool;
  836.   update(aux_node->link[aux_bool], r, i);
  837.   if (!isred(aux_node, i))
  838.      goto end;
  839.   q = aux_node;
  840.   p = q->parent;
  841.   root = v_list->vl[i]->acc_pointer;
  842.   while ((isred(child(0, p, i), i)) && (isred(child(1, p, i), i)))
  843.   {
  844.     temp = child(0, p, i);
  845.     up_col(temp->red, 0, i);
  846.     temp = child(1, p, i);
  847.     up_col(temp->red, 0, i);
  848.     up_col(p->red, 1, i);
  849.     if (p == root)
  850.       goto end;
  851.     r = p;
  852.     q = r->parent;
  853.     if (!isred(q, i))
  854.       goto end;
  855.     p = q->parent;
  856.   }
  857.   if (q->right == r->right)
  858.   {
  859.     up_col(p->red, 1, i);
  860.     up_col(q->red, 0, i);
  861.     newroot = single_rot(p, 1 - r->right, i);
  862.   }
  863.   else
  864.   {
  865.     up_col(r->red, 0, i);
  866.     up_col(p->red, 1, i);
  867.     newroot = double_rot(p, r->right, i);
  868.   }
  869.   if (newroot != NULL)
  870.     v_list->vl[i]->acc_pointer = newroot;
  871. end:
  872.   m_b_root(i);
  873.   return i;
  874. }
  875. Version pers_rb_tree::change_inf(pers_tree_node* p, void* info, Version i1)
  876. {
  877.   Version i = new_version(i1);
  878.   p = search(p->key, i1);  // setting parent pointers
  879.   pers_tree_node* pred = child(0,p,i);
  880.   pers_tree_node* succ = child(1,p,i);
  881.   copy_inf(info);
  882.   pers_tree_node* q = newleaf(p->key,info, pred, succ, i);   
  883.   if (pred) update(pred->link[1],q,i);
  884.   if (succ) update(succ->link[0],q,i);
  885.   q->right = p->right;
  886.   update(p->parent->link[q->right], q, i);
  887.   return i;
  888. }
  889. pers_tree_node* pers_rb_tree::min(Version v)
  890. { pers_tree_node* r = v_list->vl[v]->acc_pointer;
  891.   if (r == nil) return nil;
  892.   while ( ! isleaf(r)) r = child(0,r,v);
  893.   return r;
  894. }  
  895. pers_tree_node* pers_rb_tree::max(Version v)
  896. { pers_tree_node* r = v_list->vl[v]->acc_pointer;
  897.   if (r == nil) return nil;
  898.   while ( ! isleaf(r)) r = child(1,r,v);
  899.   return r;
  900. }  
  901. void pers_rb_tree::print(pers_tree_node *p, Version v)
  902. { if (p)
  903.   { if (isleaf(p))  
  904.     { print_key(p->key);
  905.       cout << " ";
  906.      }
  907.     else
  908.      { print(child(0, p, v), v);
  909.        print(child(1, p, v), v);
  910.       }
  911.    }
  912. }  
  913. void pers_rb_tree::del_tree()
  914.   while (v_list->used)
  915.   { pers_tree_node* p = v_list->used;
  916.     v_list->used = v_list->used->next;
  917.     f_rbclear(f_rchild(p->link[0]));
  918.     delete p->link[0];
  919.     f_rbclear(f_rchild(p->link[1]));
  920.     delete p->link[1];
  921.     if (p->copy != nil)
  922.     {
  923.       f_rbclear(f_rchild(p->copy));
  924.       delete p->copy;
  925.      }
  926.     c_rbclear(c_rchild(p->red));
  927.     delete p->red;
  928.     if (isleaf(p))
  929.     { clear_key(p->key);
  930.       clear_inf(p->info);
  931.      }
  932.     delete p;
  933.    }
  934.    ver_node q;
  935.    forall(q, v_list->vl) delete q;
  936.    delete v_list;
  937.  }  
  938. pers_tree_node*  pers_rb_tree::lookup(void *val,Version v)
  939. { pers_tree_node* p = search(val,v);
  940.   return (p && cmp_keys(key(p), val) == 0) ? p : nil;
  941.  }
  942. pers_tree_node* pers_rb_tree::locate(void *val,Version v)
  943. { pers_tree_node* p = search(val,v);
  944.   return ( p && cmp_keys(key(p), val) >= 0) ?  p : nil;
  945.  }
  946. pers_tree_node* pers_rb_tree::locate_pred(void *val,Version v)
  947. { pers_tree_node* p = search(val,v);
  948.   if (p==0) return nil;
  949.   if (cmp_keys(key(p), val) <= 0)  return p;
  950.   return child(0,p,v);
  951. }
  952. void pers_rb_tree::draw(DRAW_NODE_FCT draw_node,
  953.                         DRAW_EDGE_FCT draw_edge, 
  954.                         Version v, pers_tree_node* r, 
  955.                         double x1, double x2, double y, 
  956.                         double ydist, double last_x)
  957.   double x = (x1+x2)/2;
  958.   if (r==NULL) return;
  959.   if (last_x != 0) draw_edge(last_x,y+ydist,x,y);
  960.   if (isleaf(r)) 
  961.      draw_node(x,y,r->key);
  962.   else
  963.     { draw_node(x,y,get_key(r,v));
  964.       draw(draw_node,draw_edge,v,child(0,r,v),x1,x,y-ydist,ydist,x);
  965.       draw(draw_node,draw_edge,v,child(1,r,v),x,x2,y-ydist,ydist,x);
  966.      }
  967. }
  968. void pers_rb_tree::draw(DRAW_NODE_FCT draw_node,
  969.                         DRAW_EDGE_FCT draw_edge, 
  970.                         Version v, double x1, double x2, double y, double ydist)
  971. { draw(draw_node,draw_edge,v,v_list->vl[v]->acc_pointer,x1,x2,y,ydist,0); }