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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  edge_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_EDGE_MAP_H
  12. #define LEDA_EDGE_MAP_H
  13. //------------------------------------------------------------------------------
  14. // edge maps
  15. //------------------------------------------------------------------------------
  16. /*{Manpage {edge_map} {E} {Edge Maps} }*/
  17. #include <LEDA/graph.h>
  18. #define edge_data edge_map
  19. template <class E>
  20. class edge_map : public graph_map {
  21. /*{Mdefinition
  22. An instance of the data type name is a map for the edges of a graph
  23. $G$, i.e., equivalent to $map<edge,E>$ (cf. ref{Maps}). It can be
  24. used as a dynamic variant of the data type $edge_array$
  25. (cf. ref{Edge Arrays}). }*/
  26.   E def;
  27. int  cmp_entry(GenPtr x, GenPtr y) const { return LEDA_COMPARE(E,x,y); }
  28. void clear_entry(GenPtr& x) const { LEDA_CLEAR(E,x); }
  29. void copy_entry(GenPtr& x)  const { LEDA_COPY(E,x);  }
  30. void init_entry(GenPtr& x)  const { x = Copy(def); }
  31.   
  32. public:
  33. /*{Mcreation M }*/
  34. edge_map() : graph_map(nil,0) {}
  35. /*{Mcreate  introduces a variable var of type name and initializes
  36.              it to the map with empty domain. }*/
  37. edge_map(const graph& G) : graph_map(&G,G.max_edge_index()+1)
  38. { init_table(); }
  39. /*{Mcreate  introduces a variable var of type name and initializes
  40.              it with a mapping $m$ from the set of all edges of $G$ into 
  41.              the set of variables of type $E$. The variables in the range 
  42.              of $m$ are initialized by a call of the default constructor 
  43.              of type $E$. }*/
  44. edge_map(const graph& G, E x) : graph_map(&G,G.max_edge_index()+1)
  45. { def = x; init_table(); }
  46. /*{Mcreate  introduces a variable var of type name and initializes
  47.              it with a mapping $m$ from the set of all edges of $G$ into 
  48.              the set of variables of type $E$. The variables in the range 
  49.              of $m$ are initialized with a copy of $x$. }*/
  50. ~edge_map() {}
  51. /*{Moperations 1.3 4.3 }*/
  52. void init()  { graph_map::init(nil,1); }
  53. /*{Mop      makes var an edge map with empty domain. }*/
  54. void init(const graph& G)      
  55. { graph_map::init(&G,G.max_edge_index()+1); 
  56.   init_table(); }
  57. /*{Mop       makes var to a mapping $m$ from the set of all edges of $G$ 
  58.               into the set of variables of type $E$. The variables in the 
  59.               range of $m$ are initialized by a call of the default 
  60.               constructor of type $E$. }*/
  61. void init(const graph& G, E x) 
  62. { graph_map::init(&G,G.max_edge_index()+1); 
  63.   def = x;
  64.   init_table(); }
  65. /*{Mop       makes var to a mapping $m$ from the set of all edges of $G$ 
  66.               into the set of variables of type $E$. The variables in the 
  67.               range of $m$ are initialized with a copy of $x$. }*/
  68. E  operator()(edge v) const {  return LEDA_ACCESS(E,graph_map::map_read(v)); }
  69. E& operator[](edge e) {  return LEDA_ACCESS(E,graph_map::map_access(e)); }
  70. /*{Marrop    returns the variable $M(e)$. }*/
  71. };
  72. /*{Mimplementation
  73. Edge maps are implemented by an efficient hashing method based on the 
  74. internal numbering of the edges. An access operation takes expected 
  75. time $O(1)$. 
  76. }*/
  77. #endif