src/hugo/vector_map.h
author deba
Wed, 08 Sep 2004 12:06:45 +0000
changeset 822 88226d9fe821
child 830 89dfa3bece81
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
     1 // -*- c++ -*-
     2 #ifndef VECTOR_MAP_H
     3 #define VECTOR_MAP_H
     4 
     5 #include <vector>
     6 
     7 #include <hugo/map_iterator.h>
     8 
     9 ///\ingroup graphmaps
    10 ///\file
    11 ///\brief Vector based graph maps.
    12 
    13 namespace hugo {
    14   
    15   /// \addtogroup graphmaps
    16   /// @{
    17   
    18   /** The ArrayMap template class is graph map structure what
    19    *  automatically updates the map when a key is added to or erased from
    20    *  the map. This map factory uses the allocators to implement 
    21    *  the container functionality. This map factory
    22    *  uses the std::vector to implement the container function.
    23    *
    24    *  The template parameter is the MapRegistry that the maps
    25    *  will belong to and the ValueType.
    26    * 
    27    * \todo It should use a faster initialization using the maxNodeId() or
    28    * maxEdgeId() function of the graph instead of iterating through each
    29    * edge/node.
    30    */
    31 	
    32   template <typename MapRegistry, typename Value>
    33   class VectorMap : public MapRegistry::MapBase {
    34   public:
    35 		
    36     /// The graph type of the maps. 
    37     typedef typename MapRegistry::Graph Graph;
    38     /// The key type of the maps.
    39     typedef typename MapRegistry::KeyType KeyType;
    40     /// The iterator to iterate on the keys.
    41     typedef typename MapRegistry::KeyIt KeyIt;
    42 
    43     /// The map type.
    44     typedef VectorMap Map;
    45     /// The MapBase of the Map which implements the core regisitry function.
    46     typedef typename MapRegistry::MapBase MapBase;
    47 
    48   private:
    49 		
    50     /// The container type of the map.
    51     typedef std::vector<Value> Container;	
    52 
    53   public:
    54 
    55 
    56     /// The value type of the map.
    57     typedef Value ValueType;
    58     /// The reference type of the map;
    59     typedef typename Container::reference ReferenceType;
    60     /// The pointer type of the map;
    61     typedef typename Container::pointer PointerType;
    62 
    63     /// The const value type of the map.
    64     typedef const Value ConstValueType;
    65     /// The const reference type of the map;
    66     typedef typename Container::const_reference ConstReferenceType;
    67     /// The pointer type of the map;
    68     typedef typename Container::const_pointer ConstPointerType;
    69 
    70     /** Default constructor for the map.
    71      */
    72     VectorMap() {}
    73 		
    74     /** Graph and Registry initialized map constructor.
    75      */
    76     VectorMap(const Graph& g, MapRegistry& r) : MapBase(g, r) {
    77       init();
    78     }
    79 
    80     /** Constructor to use default value to initialize the map. 
    81      */
    82     VectorMap(const Graph& g, MapRegistry& r, const Value& v) 
    83       : MapBase(g, r) {
    84       for (KeyIt it(*getGraph()); it != INVALID; ++it) {
    85 	int id = getGraph()->id(it);
    86 	if (id >= (int)container.size()) {
    87 	  container.resize(id + 1);
    88 	}
    89 	set(it, v);
    90       }
    91     }
    92 
    93     /** Constructor to copy a map of an other map type.
    94      */
    95     template <typename CMap> VectorMap(const CMap& copy) : MapBase(copy) {
    96       if (getGraph()) {
    97 	for (KeyIt it(*getGraph()); it != INVALID; ++it) {
    98 	  int id = getGraph()->id(it);
    99 	  if (id >= (int)container.size()) {
   100 	    container.resize(id + 1);
   101 	  }
   102 	  set(it, copy[it]);
   103 	}
   104       }
   105     }
   106 
   107     /** Assign operator to copy a map an other map type.
   108      */
   109     template <typename CMap> VectorMap& operator=(const CMap& copy) {
   110       if (getGraph()) {
   111 	destroy();
   112       } 
   113       this->MapBase::operator=(copy);
   114       if (getGraph()) {
   115 	for (KeyIt it(*getGraph()); it != INVALID; ++it) {
   116 	  int id = getGraph()->id(it);
   117 	  if (id >= (int)container.size()) {
   118 	    container.resize(id + 1);
   119 	  }
   120 	  set(it, copy[it]);
   121 	}
   122       }
   123       return *this;
   124     }
   125 
   126     /** The destructor of the map.
   127      */
   128     virtual ~VectorMap() {
   129     }
   130 		
   131     /**
   132      * The subscript operator. The map can be subscripted by the
   133      * actual keys of the graph. 
   134      */
   135     ReferenceType operator[](const KeyType& key) {
   136       int id = getGraph()->id(key);
   137       return container[id];
   138     } 
   139 		
   140     /**
   141      * The const subscript operator. The map can be subscripted by the
   142      * actual keys of the graph. 
   143      */
   144     ConstReferenceType operator[](const KeyType& key) const {
   145       int id = getGraph()->id(key);
   146       return container[id];
   147     }
   148 
   149     /** Setter function of the map. Equivalent with map[key] = val.
   150      *  This is a compatibility feature with the not dereferable maps.
   151      */
   152     void set(const KeyType& key, const ValueType& val) {
   153       int id = getGraph()->id(key);
   154       container[id] = val;
   155     }
   156 		
   157     /** Add a new key to the map. It called by the map registry.
   158      */
   159     void add(const KeyType& key) {
   160       int id = getGraph()->id(key);
   161       if (id >= (int)container.size()) {
   162 	container.resize(id + 1);
   163       }
   164     }
   165 		
   166     /** Erase a key from the map. It called by the map registry.
   167      */
   168     void erase(const KeyType& key) {}
   169 
   170     /** Clear the data structure.
   171      */
   172     void clear() { 
   173       container.clear();
   174     }
   175 
   176     /// The stl compatible pair iterator of the map.
   177     typedef MapIterator<VectorMap> Iterator;
   178     /// The stl compatible const pair iterator of the map.
   179     typedef MapConstIterator<VectorMap> ConstIterator;
   180 
   181     /** Returns the begin iterator of the map.
   182      */
   183     Iterator begin() {
   184       return Iterator(*this, KeyIt(*MapBase::getGraph()));
   185     }
   186 
   187     /** Returns the end iterator of the map.
   188      */
   189     Iterator end() {
   190       return Iterator(*this, INVALID);
   191     }
   192 
   193     /** Returns the begin ConstIterator of the map.
   194      */
   195     ConstIterator begin() const {
   196       return ConstIterator(*this, KeyIt(*MapBase::getGraph()));
   197     }
   198 
   199     /** Returns the end const_iterator of the map.
   200      */
   201     ConstIterator end() const {
   202       return ConstIterator(*this, INVALID);
   203     }
   204 
   205   private:
   206 		
   207     Container container;
   208 
   209 		
   210   };
   211   
   212   /// @}
   213   
   214 }
   215 
   216 #endif