home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / src / basic / _pers_tr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  23.8 KB  |  1,144 lines

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