home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ledar34.zip / leda-r-3_4_tar / LEDA-3.4 / src / dict / _ch_array.c < prev    next >
C/C++ Source or Header  |  1996-09-03  |  4KB  |  224 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA 3.4
  4. +
  5. +  _ch_array.c
  6. +
  7. +  This file is part of the LEDA research version (LEDA-R) that can be 
  8. +  used free of charge in academic research and teaching. Any commercial
  9. +  use of this software requires a license which is distributed by the
  10. +  LEDA Software GmbH, Postfach 151101, 66041 Saarbruecken, FRG
  11. +  (fax +49 681 31104).
  12. +
  13. +  Copyright (c) 1991-1996  by  Max-Planck-Institut fuer Informatik
  14. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  15. +  All rights reserved.
  16. *******************************************************************************/
  17.  
  18. #include <LEDA/impl/ch_array.h>
  19.  
  20. //------------------------------------------------------------------------------
  21. //
  22. //  hashing array with chaining and table doubling
  23. //
  24. //  only integer/pointer keys
  25. //  no delete operation
  26. //
  27. //  S. Naeher (1994)
  28. //
  29. //------------------------------------------------------------------------------
  30.  
  31.  
  32. #define NIL GenPtr(this)
  33.  
  34.  
  35. /* #define HASH(x) (table + (int(x) & table_size_1)) */
  36.  
  37. #define HASH(x) (table + (hash_fct(x) & table_size_1))
  38.  
  39.  
  40. ch_array::ch_array(int n) 
  41. { int ts = 1;
  42.   while (ts < n) ts <<= 1;
  43.   init_table(ts); 
  44. }
  45.  
  46.  
  47. GenPtr ch_array::lookup(GenPtr x) const
  48.   ch_array_item p = HASH(x);
  49.   ((GenPtr&)STOP.k) = x;
  50.   while (p->k != x) p = p->succ;
  51.   return (p == &STOP) ? nil : p;
  52. }
  53.  
  54.  
  55. GenPtr ch_array::access(GenPtr x) const
  56. { ch_array_item p = HASH(x);
  57.   ((GenPtr&)STOP.k) = x;
  58.   while (p->k != x) p = p->succ;
  59.   if (p == &STOP) init_inf(x);
  60.   else x = p->i;
  61.   return x;
  62. }
  63.  
  64.  
  65. GenPtr& ch_array::access(GenPtr x)
  66.   //if (x == NIL) error_handler(1,"internal error in ch_array");
  67.  
  68.   ch_array_item p = HASH(x);
  69.  
  70.   if (p->k == x) return p->i;
  71.  
  72.   if (p->k == NIL)
  73.   { p->k = x;
  74.     init_inf(p->i);
  75.     return p->i;
  76.    }
  77.  
  78.   STOP.k = x;
  79.   ch_array_item q = p->succ; 
  80.   while (q->k != x) q = q->succ;
  81.   if (q != &STOP) return q->i;
  82.  
  83.  
  84.   // index x not present, insert it
  85.  
  86.   if (free == table_end)   // table full: rehash
  87.   { rehash();
  88.     p = HASH(x);
  89.    }
  90.  
  91.   q = free++;
  92.   q->k = x;
  93.   init_inf(q->i);
  94.   q->succ = p->succ;
  95.   p->succ = q;
  96.  
  97.   return q->i;
  98. }
  99.  
  100.  
  101.  
  102. void ch_array::destroy() 
  103. { for(ch_array_item p = table; p < table_end; p++)
  104.     if (p->k != NIL) clear_inf(p->i);
  105.   delete[] table; 
  106.  }
  107.  
  108.  
  109. void ch_array::init_table(int T)
  110.   table_size = T;
  111.   table_size_1 = T-1;
  112.  
  113.   table = new ch_array_elem[2*T];
  114.  
  115.   free      = table + T;
  116.   table_end = free  + T;
  117.  
  118.   ch_array_item p=table;
  119.  
  120.   while (p<free) 
  121.   { p->k = NIL;
  122.     p->succ = &STOP;
  123.     p++;
  124.    }
  125.  
  126.   while (p<table_end) 
  127.   { p->k = NIL;
  128.     p++;
  129.    }
  130.  
  131.  
  132. }
  133.  
  134.  
  135. #define INSERT(x,y)\
  136. { ch_array_item q = HASH(x);\
  137.   if (q->k == NIL)\
  138.     { q->k = x;\
  139.       q->i = y;\
  140.      }\
  141.   else\
  142.    { free->k = x;\
  143.      free->i = y;\
  144.      free->succ = q->succ;\
  145.      q->succ = free++;\
  146.    }\
  147. }
  148.  
  149.  
  150. void ch_array::rehash()
  151.   ch_array_item old_table = table;
  152.   ch_array_item old_table_end = table_end;
  153.   
  154.   init_table(2*table_size);
  155.  
  156.   for(ch_array_item p = old_table; p < old_table_end; p++)
  157.       if (p->k != NIL) INSERT(p->k,p->i);
  158.  
  159.   delete[] old_table;
  160. }
  161.  
  162.  
  163. ch_array_item ch_array::first_item() const
  164. { ch_array_item p = table;
  165.   while (p < table_end && p->k == NIL) p++;
  166.   return (p < table_end) ? p : 0;
  167.  }
  168.  
  169.  
  170. ch_array_item ch_array::next_item(ch_array_item p) const
  171. { p++;
  172.   while (p < table_end && p->k == NIL) p++;
  173.   return (p < table_end) ? p : 0;
  174.  }
  175.  
  176.  
  177. ch_array::ch_array(const ch_array& D)
  178.   init_table(D.table_size);
  179.  
  180.   for(ch_array_item p = D.table; p < D.table_end; p++) 
  181.   { if (p->k != GenPtr(&D)) 
  182.     { INSERT(p->k,p->i);
  183.       D.copy_inf(p->i);
  184.      }
  185.    }
  186. }
  187.  
  188.  
  189. ch_array& ch_array::operator=(const ch_array& D)
  190.   destroy();
  191.   init_table(D.table_size);
  192.  
  193.   for(ch_array_item p = D.table; p < D.table_end; p++) 
  194.   { if (p->k != GenPtr(&D)) 
  195.     { INSERT(p->k,p->i);
  196.       copy_inf(p->i);
  197.      }
  198.    }
  199.   return *this;
  200. }
  201.  
  202.  
  203. void ch_array::print()
  204. { for (int i=0; i<table_size; i++)
  205.   { ch_array_item p = table + i;
  206.     if (p->k != NIL)
  207.     { int l = 0;
  208.       while(p != &STOP)
  209.       { l++; 
  210.         p = p->succ;
  211.        }
  212.       cout << string("L(%d) = %d",i,l) << endl;
  213.      }
  214.    }
  215. }
  216.   
  217.