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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _g_map.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/graph.h>
  12. int graph_map::next_power(int s) const
  13. { if (s==0) return 0;
  14.   int p = 1;
  15.   while (p < s) p <<= 1;
  16.   return p;
  17. }
  18. void graph_map::init_table(GenPtr* start, GenPtr* stop)
  19. {  for(GenPtr* q=start; q < stop; q++) init_entry(*q); }
  20. void graph_map::clear_table()
  21. { GenPtr* stop = table+table_size;
  22.   for(GenPtr* q=table; q < stop; q++) clear_entry(*q); 
  23.  }
  24. void graph_map::resize_table(int sz)
  25.   GenPtr* old_table = table;
  26.   GenPtr* old_stop  = table + table_size;
  27.   
  28.   table_size = sz;
  29.   table = new GenPtr[sz];
  30.   GenPtr* p = old_table; 
  31.   GenPtr* q = table;
  32.   while (p < old_stop) *q++ = *p++;
  33.   init_table(q,table+sz);
  34.   if (old_table != old_stop) delete[] old_table;
  35. }
  36. void graph_map::init(const graph* G, int sz) 
  37. { clear_table();
  38.   if (table_size > 0) delete[] table;
  39.   table = 0;
  40.   g = G;
  41.   table_size = next_power(sz);
  42.   if (table_size > 0) table = new GenPtr[table_size];
  43. }
  44. graph_map::graph_map(const graph* G, int sz) 
  45. { g = G;
  46.   table = 0;
  47.   table_size = next_power(sz);
  48.   if (table_size > 0) table = new GenPtr[table_size];
  49. }
  50. graph_map::graph_map(const graph_map& M)
  51. { g = M.g;
  52.   table = 0;
  53.   table_size = M.table_size;
  54.   if (table_size > 0)
  55.   { table = new GenPtr[table_size];
  56.     GenPtr* p = table;
  57.     GenPtr* stop = M.table+M.table_size;
  58.     for(GenPtr* q=M.table; q < stop; q++) 
  59.     { *p = *q;
  60.       M.copy_entry(*p); 
  61.       p++;
  62.      }
  63.    }
  64. }
  65. graph_map& graph_map::operator=(const graph_map& M)
  66. { if (&M == this) return *this;
  67.   clear_table();
  68.   if (table_size > 0) delete[] table;
  69.   table = 0;
  70.   g = M.g;
  71.   table_size = M.table_size;
  72.   if (table_size > 0)
  73.   { table = new GenPtr[table_size];
  74.     GenPtr* p = table;
  75.     GenPtr* stop = M.table+M.table_size;
  76.     for(GenPtr* q=M.table; q < stop; q++) 
  77.     { *p = *q;
  78.       copy_entry(*p); 
  79.       p++;
  80.      }
  81.    }
  82.   return *this;
  83. }