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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  graph_map.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_GRAPH_MAP_H
  12. #define LEDA_GRAPH_MAP_H
  13. #include <LEDA/basic.h>
  14. //------------------------------------------------------------------------------
  15. // graph_map:  base type for node/edge arrays and node/edge maps
  16. //------------------------------------------------------------------------------
  17. class graph_map {
  18. friend class graph;
  19. virtual void init_entry(GenPtr&)  const {}
  20. virtual void clear_entry(GenPtr&) const {}
  21. virtual void copy_entry(GenPtr&)  const {}
  22. GenPtr* table;
  23. int table_size;
  24. const graph*  g;
  25. int  next_power(int) const;
  26. void resize_table(int sz);
  27. protected:
  28. void init_table(GenPtr*, GenPtr*);
  29. void init_table() { init_table(table,table+table_size); }
  30. void clear_table();
  31. public:
  32. virtual int  cmp_entry(GenPtr,GenPtr) const  { return 0; }
  33. int     size() const { return table_size; }
  34. GenPtr& access(int i)     { return table[i]; }
  35. GenPtr  read(int i) const { return table[i]; }
  36. GenPtr& array_access(node v)
  37. #if ! defined(LEDA_CHECKING_OFF)
  38. if (index(v) >= table_size || graph_of(v) != g) 
  39.    error_handler(999,"node_array: illegal node");
  40. #endif
  41.   return table[index(v)]; 
  42.  }
  43. GenPtr& array_access(edge e)
  44. #if ! defined(LEDA_CHECKING_OFF)
  45. if (index(e) >= table_size || graph_of(e) != g) 
  46.    error_handler(999,"edge_array: illegal edge");
  47. #endif
  48.   return table[index(e)]; 
  49.  }
  50. GenPtr array_read(node v) const
  51. #if ! defined(LEDA_CHECKING_OFF)
  52. if (index(v) >= table_size || graph_of(v) != g) 
  53.    error_handler(999,"node_array: illegal node");
  54. #endif
  55.   return table[index(v)]; 
  56.  }
  57. GenPtr array_read(edge e) const
  58. #if ! defined(LEDA_CHECKING_OFF)
  59. if (index(e) >= table_size || graph_of(e) != g) 
  60.    error_handler(999,"edge_array: illegal edge");
  61. #endif
  62.   return table[index(e)]; 
  63.  }
  64. GenPtr& map_access(node v)
  65. #if ! defined(LEDA_CHECKING_OFF)
  66. if (graph_of(v) != g) error_handler(999,"node_map: illegal node");
  67. #endif
  68.   int i = index(v);
  69.   if (i >= table_size) resize_table(next_power(i+1));
  70.   return table[i]; 
  71. }
  72. GenPtr& map_access(edge e)
  73. {
  74. #if ! defined(LEDA_CHECKING_OFF)
  75. if (graph_of(e) != g) error_handler(999,"edge_map: illegal edge");
  76. #endif
  77.   int i = index(e);
  78.   if (i >= table_size) resize_table(next_power(i+1));
  79.   return table[i]; 
  80. }
  81. GenPtr map_read(node v) const
  82. #if ! defined(LEDA_CHECKING_OFF)
  83. if (graph_of(v) != g) error_handler(999,"node_map: illegal node");
  84. #endif
  85.   int i = index(v);
  86.   if (i < table_size) 
  87.      return table[i]; 
  88.   else
  89.     { GenPtr x; 
  90.       init_entry(x); 
  91.       return x;
  92.      }
  93. }
  94. GenPtr map_read(edge e) const
  95. {
  96. #if ! defined(LEDA_CHECKING_OFF)
  97. if (graph_of(e) != g) error_handler(999,"edge_map: illegal edge");
  98. #endif
  99.   int i = index(e);
  100.   if (i < table_size) 
  101.      return table[i]; 
  102.   else
  103.     { GenPtr x; 
  104.       init_entry(x); 
  105.       return x;
  106.      }
  107. }
  108. void init(const graph* G, int sz);
  109. graph_map(const graph* G, int sz);
  110. graph_map(const graph_map&);
  111. graph_map& operator=(const graph_map&);
  112. virtual ~graph_map() { delete[] table; } 
  113. };
  114. #endif