The MapFactories have been removed from the code because
authordeba
Wed, 08 Sep 2004 12:06:45 +0000
changeset 82288226d9fe821
parent 821 283a7fe3a00e
child 823 afba7fbbb239
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.
src/hugo/array_map.h
src/hugo/array_map_factory.h
src/hugo/default_map.h
src/hugo/default_map_factory.h
src/hugo/full_graph.h
src/hugo/list_graph.h
src/hugo/map_defines.h
src/hugo/map_iterator.h
src/hugo/map_registry.h
src/hugo/smart_graph.h
src/hugo/sym_map.h
src/hugo/vector_map.h
src/hugo/vector_map_factory.h
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/hugo/array_map.h	Wed Sep 08 12:06:45 2004 +0000
     1.3 @@ -0,0 +1,285 @@
     1.4 +// -*- c++ -*-
     1.5 +#ifndef ARRAY_MAP_H
     1.6 +#define ARRAY_MAP_H
     1.7 +
     1.8 +#include <memory>
     1.9 +
    1.10 +#include <hugo/map_iterator.h>
    1.11 +
    1.12 +///\ingroup graphmaps
    1.13 +///\file
    1.14 +///\brief Graph maps that construates and destruates
    1.15 +///their elements dynamically.
    1.16 +
    1.17 +namespace hugo {
    1.18 +
    1.19 +
    1.20 +  /// \addtogroup graphmaps
    1.21 +  /// @{
    1.22 +	
    1.23 +  /** The ArrayMap template class is graph map structure what
    1.24 +   *  automatically updates the map when a key is added to or erased from
    1.25 +   *  the map. This map factory uses the allocators to implement 
    1.26 +   *  the container functionality.
    1.27 +   *
    1.28 +   *  The template parameter is the MapRegistry that the maps
    1.29 +   *  will belong to and the ValueType.
    1.30 +   */
    1.31 +
    1.32 +  template <typename MapRegistry, typename Value> 
    1.33 +  class ArrayMap : public MapRegistry::MapBase {
    1.34 +		
    1.35 +  public:
    1.36 +		
    1.37 +    /// The graph type of the maps. 
    1.38 +    typedef typename MapRegistry::Graph Graph;
    1.39 +    /// The key type of the maps.
    1.40 +    typedef typename MapRegistry::KeyType KeyType;
    1.41 +    /// The iterator to iterate on the keys.
    1.42 +    typedef typename MapRegistry::KeyIt KeyIt;
    1.43 +
    1.44 +    /// The MapBase of the Map which imlements the core regisitry function.
    1.45 +    typedef typename MapRegistry::MapBase MapBase;
    1.46 +		
    1.47 +    
    1.48 +  public:
    1.49 +
    1.50 +    /// The value type of the map.
    1.51 +    typedef Value ValueType;
    1.52 +    /// The reference type of the map;
    1.53 +    typedef Value& ReferenceType;
    1.54 +    /// The pointer type of the map;
    1.55 +    typedef Value* PointerType;
    1.56 +
    1.57 +    /// The const value type of the map.
    1.58 +    typedef const Value ConstValueType;
    1.59 +    /// The const reference type of the map;
    1.60 +    typedef const Value& ConstReferenceType;
    1.61 +    /// The pointer type of the map;
    1.62 +    typedef const Value* ConstPointerType;
    1.63 +
    1.64 +
    1.65 +    typedef std::allocator<Value> Allocator;
    1.66 +
    1.67 +	
    1.68 +    /** Default constructor for the map.
    1.69 +     */
    1.70 +    ArrayMap() : values(0), capacity(0) {}
    1.71 +			
    1.72 +    /** Graph and Registry initialized map constructor.
    1.73 +     */
    1.74 +    ArrayMap(const Graph& g, MapRegistry& r) : MapBase(g, r) {
    1.75 +      allocate_memory();
    1.76 +      for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
    1.77 +	int id = MapBase::getGraph()->id(it);
    1.78 +	allocator.construct(&(values[id]), Value());
    1.79 +      }								
    1.80 +    }
    1.81 +
    1.82 +    /** Constructor to use default value to initialize the map. 
    1.83 +     */
    1.84 +    ArrayMap(const Graph& g, MapRegistry& r, const Value& v) 
    1.85 +      : MapBase(g, r) {
    1.86 +      allocate_memory();
    1.87 +      for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
    1.88 +	int id = MapBase::getGraph()->id(it);
    1.89 +	allocator.construct(&(values[id]), v);
    1.90 +      }								
    1.91 +    }
    1.92 +
    1.93 +    /** Constructor to copy a map of the same map type.
    1.94 +     */
    1.95 +    ArrayMap(const ArrayMap& copy) : MapBase(*copy.graph, *copy.registry) {
    1.96 +      capacity = copy.capacity;
    1.97 +      if (capacity == 0) return;
    1.98 +      values = allocator.allocate(capacity);
    1.99 +      for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   1.100 +	int id = MapBase::getGraph()->id(it);
   1.101 +	allocator.construct(&(values[id]), copy.values[id]);
   1.102 +      }
   1.103 +    }
   1.104 +
   1.105 +    /** Constructor to copy a map of an other map type.
   1.106 +     */
   1.107 +    template <typename CMap> ArrayMap(const CMap& copy) 
   1.108 +      : MapBase(copy), capacity(0), values(0) {
   1.109 +      if (MapBase::getGraph()) {
   1.110 +	allocate_memory();
   1.111 +	for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   1.112 +	  set(it, copy[it]);
   1.113 +	}
   1.114 +      }
   1.115 +    }
   1.116 +
   1.117 +    /** Assign operator to copy a map of the same map type.
   1.118 +     */
   1.119 +    ArrayMap& operator=(const ArrayMap& copy) {
   1.120 +      if (&copy == this) return *this;
   1.121 +      if (capacity != 0) {
   1.122 +	MapBase::destroy();
   1.123 +	allocator.deallocate(values, capacity);
   1.124 +      }
   1.125 +      capacity = copy.capacity;
   1.126 +      if (capacity == 0) return *this;
   1.127 +      values = allocator.allocate(capacity);
   1.128 +      for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   1.129 +	int id = MapBase::getGraph()->id(it);
   1.130 +	allocator.construct(&(values[id]), copy.values[id]);
   1.131 +      }
   1.132 +      return *this;
   1.133 +    }
   1.134 +
   1.135 +    /** Assign operator to copy a map an other map type.
   1.136 +     */
   1.137 +    template <typename CMap> ArrayMap& operator=(const CMap& copy) {
   1.138 +      if (MapBase::getGraph()) {
   1.139 +	MapBase::destroy();
   1.140 +      } 
   1.141 +      MapBase::operator=(copy);
   1.142 +      if (MapBase::getGraph()) {
   1.143 +	allocate_memory();
   1.144 +	for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   1.145 +	  set(it, copy[it]);
   1.146 +	}
   1.147 +      }
   1.148 +      return *this;
   1.149 +    }
   1.150 +				
   1.151 +    /** The destructor of the map.
   1.152 +     */
   1.153 +    virtual ~ArrayMap() {
   1.154 +      if (capacity != 0) {
   1.155 +	MapBase::destroy();
   1.156 +	allocator.deallocate(values, capacity);
   1.157 +      }
   1.158 +    }
   1.159 +	
   1.160 +	
   1.161 +    /**
   1.162 +     * The subscript operator. The map can be subscripted by the
   1.163 +     * actual keys of the graph. 
   1.164 +     */
   1.165 +    ReferenceType operator[](const KeyType& key) {
   1.166 +      int id = MapBase::getGraph()->id(key);
   1.167 +      return values[id];
   1.168 +    } 
   1.169 +		
   1.170 +    /**
   1.171 +     * The const subscript operator. The map can be subscripted by the
   1.172 +     * actual keys of the graph. 
   1.173 +     */
   1.174 +    ConstReferenceType operator[](const KeyType& key) const {
   1.175 +      int id = MapBase::getGraph()->id(key);
   1.176 +      return values[id];
   1.177 +    }
   1.178 +	
   1.179 +    /** Setter function of the map. Equivalent with map[key] = val.
   1.180 +     *  This is a compatibility feature with the not dereferable maps.
   1.181 +     */
   1.182 +    void set(const KeyType& key, const ValueType& val) {
   1.183 +      int id = MapBase::getGraph()->id(key);
   1.184 +      values[id] = val;
   1.185 +    }
   1.186 +		
   1.187 +    /** Add a new key to the map. It called by the map registry.
   1.188 +     */
   1.189 +    void add(const KeyType& key) {
   1.190 +      int id = MapBase::getGraph()->id(key);
   1.191 +      if (id >= capacity) {
   1.192 +	int new_capacity = (capacity == 0 ? 1 : capacity);
   1.193 +	while (new_capacity <= id) {
   1.194 +	  new_capacity <<= 1;
   1.195 +	}
   1.196 +	Value* new_values = allocator.allocate(new_capacity);;
   1.197 +	for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   1.198 +	  int jd = MapBase::getGraph()->id(it);
   1.199 +	  if (id != jd) {
   1.200 +	    allocator.construct(&(new_values[jd]), values[jd]);
   1.201 +	    allocator.destroy(&(values[jd]));
   1.202 +	  }
   1.203 +	}
   1.204 +	if (capacity != 0) allocator.deallocate(values, capacity);
   1.205 +	values = new_values;
   1.206 +	capacity = new_capacity;
   1.207 +      }
   1.208 +      allocator.construct(&(values[id]), Value());
   1.209 +    }
   1.210 +		
   1.211 +    /** Erase a key from the map. It called by the map registry.
   1.212 +     */
   1.213 +    void erase(const KeyType& key) {
   1.214 +      int id = MapBase::getGraph()->id(key);
   1.215 +      allocator.destroy(&(values[id]));
   1.216 +    }
   1.217 +
   1.218 +    /** Clear the data structure.
   1.219 +     */
   1.220 +    void clear() {	
   1.221 +      if (capacity != 0) {
   1.222 +	MapBase::destroy();
   1.223 +	allocator.deallocate(values, capacity);
   1.224 +	capacity = 0;
   1.225 +      }
   1.226 +    }
   1.227 +
   1.228 +    /// The stl compatible pair iterator of the map.
   1.229 +    typedef MapIterator<ArrayMap> Iterator;
   1.230 +    /// The stl compatible const pair iterator of the map.
   1.231 +    typedef MapConstIterator<ArrayMap> ConstIterator;
   1.232 +
   1.233 +    /** Returns the begin iterator of the map.
   1.234 +     */
   1.235 +    Iterator begin() {
   1.236 +      return Iterator(*this, KeyIt(*MapBase::getGraph()));
   1.237 +    }
   1.238 +
   1.239 +    /** Returns the end iterator of the map.
   1.240 +     */
   1.241 +    Iterator end() {
   1.242 +      return Iterator(*this, INVALID);
   1.243 +    }
   1.244 +
   1.245 +    /** Returns the begin ConstIterator of the map.
   1.246 +     */
   1.247 +    ConstIterator begin() const {
   1.248 +      return ConstIterator(*this, KeyIt(*MapBase::getGraph()));
   1.249 +    }
   1.250 +
   1.251 +    /** Returns the end const_iterator of the map.
   1.252 +     */
   1.253 +    ConstIterator end() const {
   1.254 +      return ConstIterator(*this, INVALID);
   1.255 +    }
   1.256 +
   1.257 +  private:
   1.258 +      
   1.259 +    void allocate_memory() {
   1.260 +      int max_id = -1;
   1.261 +      for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   1.262 +	int id = MapBase::getGraph()->id(it);
   1.263 +	if (id > max_id) {
   1.264 +	  max_id = id;
   1.265 +	}			
   1.266 +      }
   1.267 +      if (max_id == -1) {
   1.268 +	capacity = 0;
   1.269 +	values = 0;
   1.270 +	return;
   1.271 +      }
   1.272 +      capacity = 1;
   1.273 +      while (capacity <= max_id) {
   1.274 +	capacity <<= 1;
   1.275 +      }
   1.276 +      values = allocator.allocate(capacity);	
   1.277 +    }      
   1.278 +
   1.279 +    int capacity;
   1.280 +    Value* values;
   1.281 +    Allocator allocator;
   1.282 +  };		
   1.283 +
   1.284 +/// @}
   1.285 +
   1.286 +}
   1.287 +
   1.288 +#endif
     2.1 --- a/src/hugo/array_map_factory.h	Wed Sep 08 11:58:06 2004 +0000
     2.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.3 @@ -1,444 +0,0 @@
     2.4 -// -*- c++ -*-
     2.5 -#ifndef ARRAY_MAP_FACTORY_H
     2.6 -#define ARRAY_MAP_FACTORY_H
     2.7 -
     2.8 -#include <memory>
     2.9 -
    2.10 -#include <hugo/extended_pair.h>
    2.11 -
    2.12 -///\ingroup graphmapfactory
    2.13 -///\file
    2.14 -///\brief Graph maps that construates and destruates
    2.15 -///their elements dynamically.
    2.16 -
    2.17 -namespace hugo {
    2.18 -
    2.19 -
    2.20 -/// \addtogroup graphmapfactory
    2.21 -/// @{
    2.22 -	
    2.23 -  /** The ArrayMapFactory template class is a factory class
    2.24 -   *  to create maps for the edge and nodes. This map factory
    2.25 -   *  uses the allocators to implement the container function.
    2.26 -   *
    2.27 -   *  The template parameter is the MapRegistry that the maps
    2.28 -   *  will belong to.
    2.29 -   */
    2.30 -
    2.31 -  template <typename MapRegistry> 
    2.32 -  class ArrayMapFactory {
    2.33 -		
    2.34 -  public:
    2.35 -		
    2.36 -    /// The graph type of the maps. 
    2.37 -    typedef typename MapRegistry::Graph Graph;
    2.38 -    /// The key type of the maps.
    2.39 -    typedef typename MapRegistry::KeyType KeyType;
    2.40 -    /// The iterator to iterate on the keys.
    2.41 -    typedef typename MapRegistry::KeyIt KeyIt;
    2.42 -
    2.43 -    /// The MapBase of the Map which imlements the core regisitry function.
    2.44 -    typedef typename MapRegistry::MapBase MapBase;
    2.45 -		
    2.46 -    /** The template Map type.
    2.47 -     */
    2.48 -    template <typename V, typename A = std::allocator<V> > 
    2.49 -    class Map : public MapBase {
    2.50 -    
    2.51 -      public:
    2.52 -
    2.53 -      /// The value type of the map.
    2.54 -      typedef V ValueType;
    2.55 -
    2.56 -      /// The value type of the map.
    2.57 -      typedef V Value;
    2.58 -      /// The reference type of the map;
    2.59 -      typedef Value& Reference;
    2.60 -      /// The pointer type of the map;
    2.61 -      typedef Value* Pointer;
    2.62 -
    2.63 -      /// The const value type of the map.
    2.64 -      typedef const Value ConstValue;
    2.65 -      /// The const reference type of the map;
    2.66 -      typedef const Value& ConstReference;
    2.67 -      /// The pointer type of the map;
    2.68 -      typedef const Value* ConstPointer;
    2.69 -
    2.70 -
    2.71 -      typedef A Allocator;
    2.72 -
    2.73 -	
    2.74 -      /** Default constructor for the map.
    2.75 -       */
    2.76 -      Map() : values(0), capacity(0) {}
    2.77 -			
    2.78 -      /** Graph and Registry initialized map constructor.
    2.79 -       */
    2.80 -      Map(const Graph& g, MapRegistry& r) : MapBase(g, r) {
    2.81 -	allocate_memory();
    2.82 -	for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
    2.83 -	  int id = MapBase::getGraph()->id(it);
    2.84 -	  allocator.construct(&(values[id]), Value());
    2.85 -	}								
    2.86 -      }
    2.87 -
    2.88 -      /** Constructor to use default value to initialize the map. 
    2.89 -       */
    2.90 -      Map(const Graph& g, MapRegistry& r, const Value& v) : MapBase(g, r) {
    2.91 -	allocate_memory();
    2.92 -	for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
    2.93 -	  int id = MapBase::getGraph()->id(it);
    2.94 -	  allocator.construct(&(values[id]), v);
    2.95 -	}								
    2.96 -      }
    2.97 -
    2.98 -      /** Constructor to copy a map of the same map type.
    2.99 -       */
   2.100 -      Map(const Map& copy) : MapBase(*copy.graph, *copy.registry) {
   2.101 -	capacity = copy.capacity;
   2.102 -	if (capacity == 0) return;
   2.103 -	values = allocator.allocate(capacity);
   2.104 -	for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   2.105 -	  int id = MapBase::getGraph()->id(it);
   2.106 -	  allocator.construct(&(values[id]), copy.values[id]);
   2.107 -	}
   2.108 -      }
   2.109 -
   2.110 -      /** Constructor to copy a map of an other map type.
   2.111 -       */
   2.112 -      template <typename CMap> Map(const CMap& copy) 
   2.113 -	: MapBase(copy), capacity(0), values(0) {
   2.114 -	if (MapBase::getGraph()) {
   2.115 -	  allocate_memory();
   2.116 -	  for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   2.117 -	    set(it, copy[it]);
   2.118 -	  }
   2.119 -	}
   2.120 -      }
   2.121 -
   2.122 -      /** Assign operator to copy a map of the same map type.
   2.123 -       */
   2.124 -      Map& operator=(const Map& copy) {
   2.125 -	if (&copy == this) return *this;
   2.126 -	if (capacity != 0) {
   2.127 -	  MapBase::destroy();
   2.128 -	  allocator.deallocate(values, capacity);
   2.129 -	}
   2.130 -	capacity = copy.capacity;
   2.131 -	if (capacity == 0) return *this;
   2.132 -	values = allocator.allocate(capacity);
   2.133 -	for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   2.134 -	  int id = MapBase::getGraph()->id(it);
   2.135 -	  allocator.construct(&(values[id]), copy.values[id]);
   2.136 -	}
   2.137 -	return *this;
   2.138 -      }
   2.139 -
   2.140 -      /** Assign operator to copy a map an other map type.
   2.141 -       */
   2.142 -      template <typename CMap> Map& operator=(const CMap& copy) {
   2.143 -	if (MapBase::getGraph()) {
   2.144 -	  MapBase::destroy();
   2.145 -	} 
   2.146 -	MapBase::operator=(copy);
   2.147 -	if (MapBase::getGraph()) {
   2.148 -	  allocate_memory();
   2.149 -	  for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   2.150 -	    set(it, copy[it]);
   2.151 -	  }
   2.152 -	}
   2.153 -	return *this;
   2.154 -      }
   2.155 -				
   2.156 -      /** The destructor of the map.
   2.157 -       */
   2.158 -      virtual ~Map() {
   2.159 -	if (capacity != 0) {
   2.160 -	  MapBase::destroy();
   2.161 -	  allocator.deallocate(values, capacity);
   2.162 -	}
   2.163 -      }
   2.164 -	
   2.165 -	
   2.166 -      /**
   2.167 -       * The subscript operator. The map can be subscripted by the
   2.168 -       * actual keys of the graph. 
   2.169 -       */
   2.170 -      Value& operator[](const KeyType& key) {
   2.171 -	int id = MapBase::getGraph()->id(key);
   2.172 -	return values[id];
   2.173 -      } 
   2.174 -		
   2.175 -      /**
   2.176 -       * The const subscript operator. The map can be subscripted by the
   2.177 -       * actual keys of the graph. 
   2.178 -       */
   2.179 -      const Value& operator[](const KeyType& key) const {
   2.180 -	int id = MapBase::getGraph()->id(key);
   2.181 -	return values[id];
   2.182 -      }
   2.183 -	
   2.184 -      /** Setter function of the map. Equivalent with map[key] = val.
   2.185 -       *  This is a compatibility feature with the not dereferable maps.
   2.186 -       */
   2.187 -      void set(const KeyType& key, const Value& val) {
   2.188 -	int id = MapBase::getGraph()->id(key);
   2.189 -	values[id] = val;
   2.190 -      }
   2.191 -		
   2.192 -      /** Add a new key to the map. It called by the map registry.
   2.193 -       */
   2.194 -      void add(const KeyType& key) {
   2.195 -	int id = MapBase::getGraph()->id(key);
   2.196 -	if (id >= capacity) {
   2.197 -	  int new_capacity = (capacity == 0 ? 1 : capacity);
   2.198 -	  while (new_capacity <= id) {
   2.199 -	    new_capacity <<= 1;
   2.200 -	  }
   2.201 -	  Value* new_values = allocator.allocate(new_capacity);;
   2.202 -	  for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   2.203 -	    int jd = MapBase::getGraph()->id(it);
   2.204 -	    if (id != jd) {
   2.205 -	      allocator.construct(&(new_values[jd]), values[jd]);
   2.206 -	      allocator.destroy(&(values[jd]));
   2.207 -	    }
   2.208 -	  }
   2.209 -	  if (capacity != 0) allocator.deallocate(values, capacity);
   2.210 -	  values = new_values;
   2.211 -	  capacity = new_capacity;
   2.212 -	}
   2.213 -	allocator.construct(&(values[id]), Value());
   2.214 -      }
   2.215 -		
   2.216 -      /** Erase a key from the map. It called by the map registry.
   2.217 -       */
   2.218 -      void erase(const KeyType& key) {
   2.219 -	int id = MapBase::getGraph()->id(key);
   2.220 -	allocator.destroy(&(values[id]));
   2.221 -      }
   2.222 -
   2.223 -      /** Clear the data structure.
   2.224 -       */
   2.225 -      void clear() {	
   2.226 -	if (capacity != 0) {
   2.227 -	  MapBase::destroy();
   2.228 -	  allocator.deallocate(values, capacity);
   2.229 -	  capacity = 0;
   2.230 -	}
   2.231 -      }
   2.232 -
   2.233 -      class iterator;
   2.234 -      class const_iterator;
   2.235 -	
   2.236 -      /** Compatible iterator with the stl maps' iterators.
   2.237 -       *  It iterates on pairs of a key and a value.
   2.238 -       */
   2.239 -      class iterator {
   2.240 -	friend class Map;
   2.241 -	friend class const_iterator;
   2.242 -      private:
   2.243 -
   2.244 -	/** Private constructor to initalize the the iterators returned
   2.245 -	 *  by the begin() and end().
   2.246 -	 */
   2.247 -	iterator (Map& pmap, const KeyIt& pit) : map(&pmap), it(pit) {}
   2.248 -
   2.249 -      public:
   2.250 -
   2.251 -	/** Default constructor. 
   2.252 -	 */
   2.253 -	iterator() {}
   2.254 -
   2.255 -	typedef extended_pair<const KeyType&, const KeyType&, 
   2.256 -			      Value&, Value&> Reference;
   2.257 -
   2.258 -	/** Dereference operator for map.
   2.259 -	 */	 
   2.260 -	Reference operator*() {
   2.261 -	  return Reference(it, (*map)[it]);
   2.262 -	}
   2.263 -
   2.264 -	class Pointer {
   2.265 -	  friend class iterator;
   2.266 -	private:
   2.267 -	  Reference data;
   2.268 -	  Pointer(const KeyType& key, Value& val) : data(key, val) {}
   2.269 -	public:
   2.270 -	  Reference* operator->() {return &data;}
   2.271 -	};
   2.272 -
   2.273 -	/** Arrow operator for map.
   2.274 -	 */	 
   2.275 -	Pointer operator->() {
   2.276 -	  return Pointer(it, ((*map)[it])); 
   2.277 -	}
   2.278 -
   2.279 -	/** The pre increment operator of the map.
   2.280 -	 */
   2.281 -	iterator& operator++() { 
   2.282 -	  ++it; 
   2.283 -	  return *this; 
   2.284 -	}
   2.285 -
   2.286 -	/** The post increment operator of the map.
   2.287 -	 */
   2.288 -	iterator operator++(int) { 
   2.289 -	  iterator tmp(it); 
   2.290 -	  ++it; 
   2.291 -	  return tmp; 
   2.292 -	}
   2.293 -
   2.294 -	/** The equality operator of the map.
   2.295 -	 */
   2.296 -	bool operator==(const_iterator p_it) {
   2.297 -	  return p_it.it == it;
   2.298 -	}
   2.299 -	
   2.300 -	/** The not-equality operator of the map.
   2.301 -	 */
   2.302 -	bool operator!=(const_iterator p_it) {
   2.303 -	  return !(*this == p_it);
   2.304 -	}
   2.305 -
   2.306 -	
   2.307 -      private:
   2.308 -	Map* map;
   2.309 -	KeyIt it;
   2.310 -      };
   2.311 -
   2.312 -      /** Returns the begin iterator of the map.
   2.313 -       */
   2.314 -      iterator begin() {
   2.315 -	return iterator(*this, KeyIt(*MapBase::getGraph()));
   2.316 -      }
   2.317 -
   2.318 -      /** Returns the end iterator of the map.
   2.319 -       */
   2.320 -      iterator end() {
   2.321 -	return iterator(*this, INVALID);
   2.322 -      }
   2.323 -
   2.324 -      class const_iterator {
   2.325 -	friend class Map;
   2.326 -	friend class iterator;
   2.327 -      private:
   2.328 -
   2.329 -	/** Private constructor to initalize the the iterators returned
   2.330 -	 *  by the begin() and end().
   2.331 -	 */
   2.332 -	const_iterator (const Map& pmap, const KeyIt& pit) 
   2.333 -	  : map(&pmap), it(pit) {}
   2.334 -
   2.335 -      public:
   2.336 -
   2.337 -	/** Default constructor. 
   2.338 -	 */
   2.339 -	const_iterator() {}
   2.340 -
   2.341 -	/** Constructor to convert iterator to const_iterator.
   2.342 -	 */
   2.343 -	const_iterator(iterator p_it) : map(p_it.map), it(p_it.it) {}
   2.344 -      
   2.345 -	typedef extended_pair<const KeyType&, const KeyType&, 
   2.346 -	  const Value&, const Value&> Reference;
   2.347 -
   2.348 -	/** Dereference operator for map.
   2.349 -	 */	 
   2.350 -	Reference operator*() {
   2.351 -	  return Reference(it, (*map)[it]);
   2.352 -	}
   2.353 -
   2.354 -
   2.355 -	class Pointer {
   2.356 -	  friend class const_iterator;
   2.357 -	private:
   2.358 -	  Reference data;
   2.359 -	  Pointer(const KeyType& key, const Value& val) : data(key, val) {}
   2.360 -	public:
   2.361 -	  Reference* operator->() {return &data;}
   2.362 -	};
   2.363 -
   2.364 -	/** Arrow operator for map.
   2.365 -	 */	 
   2.366 -	Pointer operator->() {
   2.367 -	  return Pointer(it, ((*map)[it])); 
   2.368 -	}
   2.369 -
   2.370 -	/** The pre increment operator of the map.
   2.371 -	 */
   2.372 -	const_iterator& operator++() { 
   2.373 -	  ++it; 
   2.374 -	  return *this; 
   2.375 -	}
   2.376 -
   2.377 -	/** The post increment operator of the map.
   2.378 -	 */
   2.379 -	const_iterator operator++(int) { 
   2.380 -	  const_iterator tmp(it); 
   2.381 -	  ++it; 
   2.382 -	  return tmp; 
   2.383 -	}
   2.384 -
   2.385 -	/** The equality operator of the map.
   2.386 -	 */
   2.387 -	bool operator==(const_iterator p_it) {
   2.388 -	  return p_it.it == it;
   2.389 -	}
   2.390 -	
   2.391 -	/** The not-equality operator of the map.
   2.392 -	 */
   2.393 -	bool operator!=(const_iterator p_it) {
   2.394 -	  return !(*this == p_it);
   2.395 -	}
   2.396 -	
   2.397 -
   2.398 -      private:
   2.399 -	const Map* map;
   2.400 -	KeyIt it;
   2.401 -      };
   2.402 -
   2.403 -      /** Returns the begin const_iterator of the map.
   2.404 -       */
   2.405 -      const_iterator begin() const {
   2.406 -	return const_iterator(*this, KeyIt(*MapBase::getGraph()));
   2.407 -      }
   2.408 -
   2.409 -      /** Returns the end const_iterator of the map.
   2.410 -       */
   2.411 -      const_iterator end() const {
   2.412 -	return const_iterator(*this, INVALID);
   2.413 -      }
   2.414 -
   2.415 -    private:
   2.416 -      
   2.417 -      void allocate_memory() {
   2.418 -	int max_id = -1;
   2.419 -	for (KeyIt it(*MapBase::getGraph()); it != INVALID; ++it) {
   2.420 -	  int id = MapBase::getGraph()->id(it);
   2.421 -	  if (id > max_id) {
   2.422 -	    max_id = id;
   2.423 -	  }			
   2.424 -	}
   2.425 -	if (max_id == -1) {
   2.426 -	  capacity = 0;
   2.427 -	  values = 0;
   2.428 -	  return;
   2.429 -	}
   2.430 -	capacity = 1;
   2.431 -	while (capacity <= max_id) {
   2.432 -	  capacity <<= 1;
   2.433 -	}
   2.434 -	values = allocator.allocate(capacity);	
   2.435 -      }      
   2.436 -
   2.437 -      int capacity;
   2.438 -      Value* values;
   2.439 -      Allocator allocator;
   2.440 -    };		
   2.441 -  };
   2.442 -
   2.443 -/// @}
   2.444 -
   2.445 -}
   2.446 -
   2.447 -#endif
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/src/hugo/default_map.h	Wed Sep 08 12:06:45 2004 +0000
     3.3 @@ -0,0 +1,115 @@
     3.4 +// -*- c++ -*-
     3.5 +#ifndef DEFAULT_MAP_H
     3.6 +#define DEFAULT_MAP_H
     3.7 +
     3.8 +
     3.9 +#include <hugo/array_map.h>
    3.10 +#include <hugo/vector_map.h>
    3.11 +
    3.12 +///\ingroup graphmaps
    3.13 +///\file
    3.14 +///\brief Graph maps that construates and destruates
    3.15 +///their elements dynamically.
    3.16 +
    3.17 +namespace hugo {
    3.18 +
    3.19 +/// \addtogroup graphmaps
    3.20 +/// @{
    3.21 +
    3.22 +  /** The ArrayMap template class is graph map structure what
    3.23 +   *  automatically updates the map when a key is added to or erased from
    3.24 +   *  the map. This map uses the VectorMap if the ValueType is a primitive
    3.25 +   *  type and the ArrayMap for the other cases.
    3.26 +   *
    3.27 +   *  The template parameter is the MapRegistry that the maps
    3.28 +   *  will belong to and the ValueType.
    3.29 +   */
    3.30 +
    3.31 +
    3.32 +  /** Macro to implement the DefaultMap.
    3.33 +   */
    3.34 +#define DEFAULT_MAP_BODY(DynMap, Value) \
    3.35 +  { \
    3.36 +    typedef DynMap<MapRegistry, Value> MapImpl; \
    3.37 +  \
    3.38 +  public: \
    3.39 +  \
    3.40 +    typedef typename MapRegistry::Graph Graph; \
    3.41 +  \
    3.42 +    DefaultMap() : MapImpl() {} \
    3.43 +  \
    3.44 +    DefaultMap(const Graph& g, MapRegistry& r) : MapImpl(g, r) {} \
    3.45 +  \
    3.46 +    DefaultMap(const Graph& g, MapRegistry& r, const Value& v) \
    3.47 +      : MapImpl(g, r, v) {} \
    3.48 +  \
    3.49 +    DefaultMap(const DefaultMap& copy) \
    3.50 +      : MapImpl(static_cast<const MapImpl&>(copy)) {} \
    3.51 +  \
    3.52 +    template <typename CMap> DefaultMap(const CMap& copy) : MapImpl(copy) {} \
    3.53 +  \
    3.54 +    DefaultMap& operator=(const DefaultMap& copy) { \
    3.55 +      MapImpl::operator=(static_cast<const MapImpl&>(copy)); \
    3.56 +      return *this; \
    3.57 +    } \
    3.58 +  \
    3.59 +    template <typename CMap> DefaultMap& operator=(const CMap& copy) { \
    3.60 +      MapImpl::operator=(copy); \
    3.61 +      return *this; \
    3.62 +    } \
    3.63 +  \
    3.64 +  };
    3.65 +
    3.66 +
    3.67 +  template <typename MapRegistry, typename Type>
    3.68 +  class DefaultMap : public ArrayMap<MapRegistry, Type> 
    3.69 +  DEFAULT_MAP_BODY(ArrayMap, Type);
    3.70 +
    3.71 +  template <typename MapRegistry>
    3.72 +  class DefaultMap<MapRegistry, bool> 
    3.73 +    : public VectorMap<MapRegistry, bool> 
    3.74 +  DEFAULT_MAP_BODY(VectorMap, bool);
    3.75 +
    3.76 +  template <typename MapRegistry>
    3.77 +  class DefaultMap<MapRegistry, char> 
    3.78 +    : public VectorMap<MapRegistry, char> 
    3.79 +  DEFAULT_MAP_BODY(VectorMap, char);
    3.80 +
    3.81 +  template <typename MapRegistry>
    3.82 +  class DefaultMap<MapRegistry, int> 
    3.83 +    : public VectorMap<MapRegistry, int> 
    3.84 +  DEFAULT_MAP_BODY(VectorMap, int);
    3.85 +
    3.86 +  template <typename MapRegistry>
    3.87 +  class DefaultMap<MapRegistry, short> 
    3.88 +    : public VectorMap<MapRegistry, short> 
    3.89 +  DEFAULT_MAP_BODY(VectorMap, short);
    3.90 +
    3.91 +  template <typename MapRegistry>
    3.92 +  class DefaultMap<MapRegistry, long> 
    3.93 +    : public VectorMap<MapRegistry, long> 
    3.94 +  DEFAULT_MAP_BODY(VectorMap, long);
    3.95 +
    3.96 +  template <typename MapRegistry>
    3.97 +  class DefaultMap<MapRegistry, float> 
    3.98 +    : public VectorMap<MapRegistry, float> 
    3.99 +  DEFAULT_MAP_BODY(VectorMap, float);
   3.100 +
   3.101 +  template <typename MapRegistry>
   3.102 +  class DefaultMap<MapRegistry, double> 
   3.103 +    : public VectorMap<MapRegistry, double> 
   3.104 +  DEFAULT_MAP_BODY(VectorMap, double);
   3.105 +
   3.106 +  template <typename MapRegistry>
   3.107 +  class DefaultMap<MapRegistry, long double> 
   3.108 +    : public VectorMap<MapRegistry, long double> 
   3.109 +  DEFAULT_MAP_BODY(VectorMap, long double);
   3.110 +
   3.111 +  template <typename MapRegistry, typename Type>
   3.112 +  class DefaultMap<MapRegistry, Type*>
   3.113 +    : public VectorMap<MapRegistry, Type*> 
   3.114 +  DEFAULT_MAP_BODY(VectorMap, Type*);
   3.115 +
   3.116 +}
   3.117 +
   3.118 +#endif
     4.1 --- a/src/hugo/default_map_factory.h	Wed Sep 08 11:58:06 2004 +0000
     4.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.3 @@ -1,181 +0,0 @@
     4.4 -// -*- c++ -*-
     4.5 -#ifndef DEFAULT_MAP_FACTORY_H
     4.6 -#define DEFAULT_MAP_FACTORY_H
     4.7 -
     4.8 -
     4.9 -#include <hugo/array_map_factory.h>
    4.10 -#include <hugo/vector_map_factory.h>
    4.11 -
    4.12 -///\ingroup graphmapfactory
    4.13 -///\file
    4.14 -///\brief Graph maps that construates and destruates
    4.15 -///their elements dynamically.
    4.16 -
    4.17 -namespace hugo {
    4.18 -
    4.19 -/// \addtogroup graphmapfactory
    4.20 -/// @{
    4.21 -
    4.22 -#define DEFAULT_MAP_BODY(Factory, Val) \
    4.23 -  { \
    4.24 -    typedef typename Factory<MapRegistry>::template Map<Val> MapImpl; \
    4.25 -  \
    4.26 -  public: \
    4.27 -  \
    4.28 -    typedef typename MapRegistry::Graph Graph; \
    4.29 -    typedef typename MapRegistry::KeyType KeyType; \
    4.30 -    typedef typename MapRegistry::KeyIt KeyIt; \
    4.31 -    typedef Val Value; \
    4.32 -  \
    4.33 -    typedef typename MapRegistry::MapBase MapBase; \
    4.34 -  \
    4.35 -    DefaultMap() : MapImpl() {} \
    4.36 -  \
    4.37 -    DefaultMap(const Graph& g, MapRegistry& r) : MapImpl(g, r) {} \
    4.38 -  \
    4.39 -    DefaultMap(const Graph& g, MapRegistry& r, const Value& v) \
    4.40 -      : MapImpl(g, r, v) {} \
    4.41 -  \
    4.42 -    DefaultMap(const DefaultMap& copy) \
    4.43 -      : MapImpl(static_cast<const MapImpl&>(copy)) {} \
    4.44 -  \
    4.45 -    template <typename CMap> DefaultMap(const CMap& copy) : MapImpl(copy) {} \
    4.46 -  \
    4.47 -    DefaultMap& operator=(const DefaultMap& copy) { \
    4.48 -      MapImpl::operator=(static_cast<const MapImpl&>(copy)); \
    4.49 -      return *this; \
    4.50 -    } \
    4.51 -  \
    4.52 -    template <typename CMap> DefaultMap& operator=(const CMap& copy) { \
    4.53 -      MapImpl::operator=(copy); \
    4.54 -      return *this; \
    4.55 -    } \
    4.56 -  \
    4.57 -  };
    4.58 -
    4.59 -
    4.60 -  template <typename MapRegistry, typename Type>
    4.61 -  class DefaultMap : public ArrayMapFactory<MapRegistry>::template Map<Type> 
    4.62 -  DEFAULT_MAP_BODY(ArrayMapFactory, Type);
    4.63 -
    4.64 -  template <typename MapRegistry>
    4.65 -  class DefaultMap<MapRegistry, bool> 
    4.66 -    : public VectorMapFactory<MapRegistry>::template Map<bool> 
    4.67 -  DEFAULT_MAP_BODY(VectorMapFactory, bool);
    4.68 -
    4.69 -  template <typename MapRegistry>
    4.70 -  class DefaultMap<MapRegistry, char> 
    4.71 -    : public VectorMapFactory<MapRegistry>::template Map<char> 
    4.72 -  DEFAULT_MAP_BODY(VectorMapFactory, char);
    4.73 -
    4.74 -  template <typename MapRegistry>
    4.75 -  class DefaultMap<MapRegistry, int> 
    4.76 -    : public VectorMapFactory<MapRegistry>::template Map<int> 
    4.77 -  DEFAULT_MAP_BODY(VectorMapFactory, int);
    4.78 -
    4.79 -  template <typename MapRegistry>
    4.80 -  class DefaultMap<MapRegistry, short> 
    4.81 -    : public VectorMapFactory<MapRegistry>::template Map<short> 
    4.82 -  DEFAULT_MAP_BODY(VectorMapFactory, short);
    4.83 -
    4.84 -  template <typename MapRegistry>
    4.85 -  class DefaultMap<MapRegistry, long> 
    4.86 -    : public VectorMapFactory<MapRegistry>::template Map<long> 
    4.87 -  DEFAULT_MAP_BODY(VectorMapFactory, long);
    4.88 -
    4.89 -  template <typename MapRegistry>
    4.90 -  class DefaultMap<MapRegistry, float> 
    4.91 -    : public VectorMapFactory<MapRegistry>::template Map<float> 
    4.92 -  DEFAULT_MAP_BODY(VectorMapFactory, float);
    4.93 -
    4.94 -  template <typename MapRegistry>
    4.95 -  class DefaultMap<MapRegistry, double> 
    4.96 -    : public VectorMapFactory<MapRegistry>::template Map<double> 
    4.97 -  DEFAULT_MAP_BODY(VectorMapFactory, double);
    4.98 -
    4.99 -  template <typename MapRegistry>
   4.100 -  class DefaultMap<MapRegistry, long double> 
   4.101 -    : public VectorMapFactory<MapRegistry>::template Map<long double> 
   4.102 -  DEFAULT_MAP_BODY(VectorMapFactory, long double);
   4.103 -
   4.104 -  template <typename MapRegistry, typename Type>
   4.105 -  class DefaultMap<MapRegistry, Type*>
   4.106 -    : public VectorMapFactory<MapRegistry>::template Map<Type*> 
   4.107 -  DEFAULT_MAP_BODY(VectorMapFactory, Type*);
   4.108 -
   4.109 -
   4.110 -  /** The DefaultMapFactory template class is a factory class
   4.111 -   *  to create maps for the edge and nodes. This map factory
   4.112 -   *  uses the VectorMapFactory if the ValueType is a primitive
   4.113 -   *  type and the ArrayMapFactory for the other cases.
   4.114 -   *
   4.115 -   *  The template parameter is the MapRegistry that the maps
   4.116 -   *  will belong to.
   4.117 -   */
   4.118 -
   4.119 -  template <typename MapRegistry>
   4.120 -  class DefaultMapFactory {
   4.121 -		
   4.122 -  public:
   4.123 -    /// The graph type of the maps. 
   4.124 -    typedef typename MapRegistry::Graph Graph;
   4.125 -    /// The key type of the maps.
   4.126 -    typedef typename MapRegistry::KeyType KeyType;
   4.127 -    /// The iterator to iterate on the keys.
   4.128 -    typedef typename MapRegistry::KeyIt KeyIt;
   4.129 -
   4.130 -    /// The MapBase of the Map which imlements the core regisitry function.
   4.131 -    typedef typename MapRegistry::MapBase MapBase;
   4.132 -		
   4.133 -
   4.134 -    /** The template Map type.
   4.135 -     */
   4.136 -    template <typename V> 
   4.137 -    class Map : public DefaultMap<MapRegistry, V> {
   4.138 -
   4.139 -      typedef DefaultMap<MapRegistry, V> MapImpl;
   4.140 -
   4.141 -    public:
   4.142 -      
   4.143 -      typedef V Value;
   4.144 -
   4.145 -      /** Default constructor for the map.
   4.146 -       */
   4.147 -      Map() : MapImpl() {}
   4.148 -
   4.149 -      /** Graph and Registry initialized map constructor.
   4.150 -       */
   4.151 -      Map(const Graph& g, MapRegistry& r) : MapImpl(g, r) {}
   4.152 -
   4.153 -      /** Constructor to use default value to initialize the map. 
   4.154 -       */
   4.155 -      Map(const Graph& g, MapRegistry& r, const Value& v) : MapImpl(g, r, v) {}
   4.156 -
   4.157 -      /** Constructor to copy a map of the same map type.
   4.158 -       */
   4.159 -      Map(const Map& copy) : MapImpl(static_cast<const MapImpl&>(copy)) {}
   4.160 -
   4.161 -      /** Constructor to copy a map of an other map type.
   4.162 -       */
   4.163 -      template <typename CMap> Map(const CMap& copy) : MapImpl(copy) {}
   4.164 -
   4.165 -      /** Assign operator to copy a map of the same map type.
   4.166 -       */
   4.167 -      Map& operator=(const Map& copy) {
   4.168 -	MapImpl::operator=(static_cast<const MapImpl&>(copy));
   4.169 -	return *this;
   4.170 -      }
   4.171 -
   4.172 -      /** Assign operator to copy a map an other map type.
   4.173 -       */
   4.174 -      template <typename CMap> Map& operator=(const CMap& copy) {
   4.175 -	MapImpl::operator=(copy);
   4.176 -	return *this;
   4.177 -      }
   4.178 -
   4.179 -    };
   4.180 -
   4.181 -  };
   4.182 -}
   4.183 -
   4.184 -#endif
     5.1 --- a/src/hugo/full_graph.h	Wed Sep 08 11:58:06 2004 +0000
     5.2 +++ b/src/hugo/full_graph.h	Wed Sep 08 12:06:45 2004 +0000
     5.3 @@ -13,7 +13,9 @@
     5.4  #include <hugo/invalid.h>
     5.5  
     5.6  #include <hugo/map_registry.h>
     5.7 -#include <hugo/default_map_factory.h>
     5.8 +#include <hugo/default_map.h>
     5.9 +
    5.10 +#include <hugo/map_defines.h>
    5.11  
    5.12  namespace hugo {
    5.13  
    5.14 @@ -47,8 +49,11 @@
    5.15      class OutEdgeIt;
    5.16      class InEdgeIt;
    5.17      
    5.18 +
    5.19 +    /// Creating map registries.
    5.20      CREATE_MAP_REGISTRIES;
    5.21 -    CREATE_MAPS(DefaultMapFactory);
    5.22 +    /// Creating node and edge maps.
    5.23 +    CREATE_MAPS(DefaultMap);
    5.24      
    5.25    public:
    5.26  
     6.1 --- a/src/hugo/list_graph.h	Wed Sep 08 11:58:06 2004 +0000
     6.2 +++ b/src/hugo/list_graph.h	Wed Sep 08 12:06:45 2004 +0000
     6.3 @@ -13,9 +13,9 @@
     6.4  #include <hugo/invalid.h>
     6.5  
     6.6  #include <hugo/map_registry.h>
     6.7 -#include <hugo/default_map_factory.h>
     6.8 +#include <hugo/default_map.h>
     6.9  
    6.10 -#include <hugo/sym_map_factory.h>
    6.11 +#include <hugo/sym_map.h>
    6.12  
    6.13  #include <hugo/map_defines.h>
    6.14  
    6.15 @@ -79,8 +79,10 @@
    6.16      class OutEdgeIt;
    6.17      class InEdgeIt;
    6.18  
    6.19 +    /// Creating map registries.
    6.20      CREATE_MAP_REGISTRIES;
    6.21 -    CREATE_MAPS(DefaultMapFactory);
    6.22 +    /// Creating node and edge maps.
    6.23 +    CREATE_MAPS(DefaultMap);
    6.24  
    6.25    public:
    6.26  
    6.27 @@ -443,12 +445,13 @@
    6.28  
    6.29      typedef SymListGraph Graph;
    6.30  
    6.31 -    KEEP_NODE_MAP(ListGraph);
    6.32 -    KEEP_EDGE_MAP(ListGraph);
    6.33 +    /// Importing maps from the base class ListGraph.
    6.34 +    KEEP_MAPS(ListGraph, SymListGraph);
    6.35  
    6.36 +    /// Creating symmetric map registry.
    6.37      CREATE_SYM_EDGE_MAP_REGISTRY;
    6.38 -    CREATE_SYM_EDGE_MAP_FACTORY(DefaultMapFactory);
    6.39 -    IMPORT_SYM_EDGE_MAP(SymEdgeMapFactory);
    6.40 +    /// Creating symmetric edge map.
    6.41 +    CREATE_SYM_EDGE_MAP(DefaultMap);
    6.42  
    6.43      SymListGraph() : ListGraph() { }
    6.44      SymListGraph(const ListGraph &_g) : ListGraph(_g) { }
    6.45 @@ -529,8 +532,40 @@
    6.46      class OutEdgeIt;
    6.47      class InEdgeIt;
    6.48      
    6.49 -    CREATE_MAP_REGISTRIES;
    6.50 -    CREATE_MAPS(DefaultMapFactory);
    6.51 +    /// Creating node map registry.
    6.52 +    CREATE_NODE_MAP_REGISTRY;
    6.53 +    /// Creating node maps.
    6.54 +    CREATE_NODE_MAP(DefaultMap);
    6.55 +
    6.56 +    /// Creating empty map structure for edges.
    6.57 +    template <typename Value>
    6.58 +    class EdgeMap {
    6.59 +    public:
    6.60 +      EdgeMap() {}
    6.61 +      EdgeMap(const Graph&) {}
    6.62 +      EdgeMap(const Graph&, const Value&) {}
    6.63 +
    6.64 +      EdgeMap(const EdgeMap&) {}
    6.65 +      template <typename CMap> EdgeMap(const CMap&) {}
    6.66 +
    6.67 +      EdgeMap& operator=(const EdgeMap&) {}
    6.68 +      template <typename CMap> EdgeMap& operator=(const CMap&) {}
    6.69 +      
    6.70 +      class ConstIterator {
    6.71 +      public:
    6.72 +	bool operator==(const ConstIterator&) {return true;}
    6.73 +	bool operator!=(const ConstIterator&) {return false;}
    6.74 +      };
    6.75 +
    6.76 +      typedef ConstIterator Iterator;
    6.77 +      
    6.78 +      Iterator begin() { return Iterator();}
    6.79 +      Iterator end() { return Iterator();}
    6.80 +
    6.81 +      ConstIterator begin() const { return ConstIterator();}
    6.82 +      ConstIterator end() const { return ConstIterator();}
    6.83 +
    6.84 +    };
    6.85      
    6.86    public:
    6.87  
    6.88 @@ -848,9 +883,13 @@
    6.89      class InEdgeIt;
    6.90  
    6.91  
    6.92 +    /// Creating edge map registry.
    6.93      CREATE_EDGE_MAP_REGISTRY;
    6.94 -    CREATE_EDGE_MAP_FACTORY(DefaultMapFactory);
    6.95 -    IMPORT_EDGE_MAP(EdgeMapFactory);
    6.96 +    /// Creating edge maps.
    6.97 +    CREATE_EDGE_MAP(DefaultMap);
    6.98 +
    6.99 +    /// Importing node maps from the NodeGraphType.
   6.100 +    IMPORT_NODE_MAP(NodeGraphType, graph.G, EdgeSet, graph);
   6.101      
   6.102      
   6.103    public:
   6.104 @@ -1090,42 +1129,7 @@
   6.105  	: Edge(_G.nodes[v].first_in), G(&_G) { }
   6.106        InEdgeIt &operator++() { n=G->edges[n].next_in; return *this; }
   6.107      };
   6.108 -
   6.109      
   6.110 -    template <typename V> class NodeMap 
   6.111 -      : public NodeGraphType::template NodeMap<V>
   6.112 -    {
   6.113 -      //This is a must, the constructors need it.
   6.114 -      typedef typename NodeGraphType::template NodeMap<V> MapImpl;
   6.115 -      typedef V Value;
   6.116 -    public:
   6.117 -      NodeMap() : MapImpl() {}
   6.118 -      
   6.119 -      NodeMap(const EdgeSet& graph) 
   6.120 -	: MapImpl(graph.G) { }
   6.121 -
   6.122 -      NodeMap(const EdgeSet& graph, const Value& value) 
   6.123 -	: MapImpl(graph.G, value) { }
   6.124 -
   6.125 -      NodeMap(const NodeMap& copy) 
   6.126 -	: MapImpl(static_cast<const MapImpl&>(copy)) {}
   6.127 -
   6.128 -      template<typename CMap>
   6.129 -      NodeMap(const CMap& copy)
   6.130 -	: MapImpl(copy) { }
   6.131 -
   6.132 -      NodeMap& operator=(const NodeMap& copy) {
   6.133 -	MapImpl::operator=(static_cast<const MapImpl&>(copy));
   6.134 -	return *this;
   6.135 -      }
   6.136 -
   6.137 -      template <typename CMap>
   6.138 -      NodeMap& operator=(const CMap& copy) {
   6.139 -	MapImpl::operator=(copy);
   6.140 -	return *this;
   6.141 -      }
   6.142 -
   6.143 -    };
   6.144    };
   6.145  
   6.146    template<typename GG>
     7.1 --- a/src/hugo/map_defines.h	Wed Sep 08 11:58:06 2004 +0000
     7.2 +++ b/src/hugo/map_defines.h	Wed Sep 08 12:06:45 2004 +0000
     7.3 @@ -2,7 +2,7 @@
     7.4  #ifndef MAP_DEFINES_H
     7.5  #define MAP_DEFINES_H
     7.6  
     7.7 -///\ingroup graphmapfactory
     7.8 +///\ingroup graphmaps
     7.9  ///\file
    7.10  ///\brief Defines to help creating graph maps.
    7.11  
    7.12 @@ -29,38 +29,22 @@
    7.13  CREATE_NODE_MAP_REGISTRY \
    7.14  CREATE_EDGE_MAP_REGISTRY
    7.15  
    7.16 -/** Creates a concrete factory type from a template map
    7.17 - *  factory to use as node map factory.
    7.18 - */
    7.19 -#define CREATE_NODE_MAP_FACTORY(TemplateFactory) \
    7.20 -typedef TemplateFactory<NodeMapRegistry> NodeMapFactory;
    7.21 -
    7.22 -/** Creates a concrete factory type from a template map
    7.23 - *  factory to use as edge map factory.
    7.24 - */
    7.25 -#define CREATE_EDGE_MAP_FACTORY(TemplateFactory) \
    7.26 -typedef TemplateFactory<EdgeMapRegistry> EdgeMapFactory;
    7.27 -
    7.28 -/** Creates both map factories.
    7.29 - */
    7.30 -#define CREATE_MAP_FACTORIES(TemplateFactory) \
    7.31 -CREATE_NODE_MAP_FACTORY(TemplateFactory) \
    7.32 -CREATE_EDGE_MAP_FACTORY(TemplateFactory) 
    7.33 -
    7.34 -/** Import a map from a concrete map factory. The import method is
    7.35 +/** Creates a map from a template map. The import method is
    7.36   *  an overloading of the map type.
    7.37   *  The reason to use these macro is that the c++ does not support
    7.38   *  the template typedefs. If a future release of the c++ 
    7.39   *  supports this feature it should be fixed.
    7.40   */
    7.41 -#define IMPORT_NODE_MAP(Factory) \
    7.42 -template <typename V> \
    7.43 -class NodeMap : public Factory::template Map<V> { \
    7.44 -typedef typename Factory::template Map<V> MapImpl; \
    7.45 +#define CREATE_NODE_MAP(DynMap) \
    7.46 +template <typename Value> \
    7.47 +class NodeMap : public DynMap<NodeMapRegistry, Value> { \
    7.48 +typedef DynMap<NodeMapRegistry, Value> MapImpl; \
    7.49  public: \
    7.50  NodeMap() {} \
    7.51 -NodeMap(const Graph& g) : MapImpl(g, g.node_maps) {} \
    7.52 -NodeMap(const Graph& g, const V& v) : MapImpl(g, g.node_maps, v) {} \
    7.53 +NodeMap(const typename MapImpl::Graph& g) \
    7.54 +  : MapImpl(g, g.node_maps) {} \
    7.55 +NodeMap(const typename MapImpl::Graph& g, const Value& v) \
    7.56 +  : MapImpl(g, g.node_maps, v) {} \
    7.57  NodeMap(const NodeMap& copy) : MapImpl(static_cast<const MapImpl&>(copy)) {} \
    7.58  template <typename CMap> NodeMap(const CMap& copy) : MapImpl(copy) {} \
    7.59  NodeMap& operator=(const NodeMap& copy) { \
    7.60 @@ -73,20 +57,22 @@
    7.61  } \
    7.62  };
    7.63  
    7.64 -/** Import a map from a concrete map factory. The import method is
    7.65 +/** Creates a map from a template map. The import method is
    7.66   *  an overloading of the map type.
    7.67   *  The reason to use these macro is that the c++ does not support
    7.68   *  the template typedefs. If a future release of the c++ 
    7.69   *  supports this feature it should be fixed.
    7.70   */
    7.71 -#define IMPORT_EDGE_MAP(Factory) \
    7.72 -template <typename V> \
    7.73 -class EdgeMap : public Factory::template Map<V> { \
    7.74 -typedef typename Factory::template Map<V> MapImpl; \
    7.75 +#define CREATE_EDGE_MAP(DynMap) \
    7.76 +template <typename Value> \
    7.77 +class EdgeMap : public DynMap<EdgeMapRegistry, Value> { \
    7.78 +typedef DynMap<EdgeMapRegistry, Value> MapImpl; \
    7.79  public: \
    7.80  EdgeMap() {} \
    7.81 -EdgeMap(const Graph& g) : MapImpl(g, g.edge_maps) {} \
    7.82 -EdgeMap(const Graph& g, const V& v) : MapImpl(g, g.edge_maps, v) {} \
    7.83 +EdgeMap(const typename MapImpl::Graph& g) \
    7.84 +  : MapImpl(g, g.edge_maps) {} \
    7.85 +EdgeMap(const typename MapImpl::Graph& g, const Value& v) \
    7.86 +  : MapImpl(g, g.edge_maps, v) {} \
    7.87  EdgeMap(const EdgeMap& copy) : MapImpl(static_cast<const MapImpl&>(copy)) {} \
    7.88  template <typename CMap> EdgeMap(const CMap& copy) : MapImpl(copy) {} \
    7.89  EdgeMap& operator=(const EdgeMap& copy) { \
    7.90 @@ -99,12 +85,11 @@
    7.91  } \
    7.92  };
    7.93  
    7.94 -/** This macro creates both map factories and imports both maps.
    7.95 +/** This macro creates both maps.
    7.96   */
    7.97 -#define CREATE_MAPS(TemplateFactory) \
    7.98 -CREATE_MAP_FACTORIES(TemplateFactory) \
    7.99 -IMPORT_NODE_MAP(NodeMapFactory) \
   7.100 -IMPORT_EDGE_MAP(EdgeMapFactory)
   7.101 +#define CREATE_MAPS(DynMap) \
   7.102 +CREATE_NODE_MAP(DynMap) \
   7.103 +CREATE_EDGE_MAP(DynMap)
   7.104  
   7.105  /** This macro creates MapRegistry for Symmetric Edge Maps.
   7.106   */
   7.107 @@ -113,109 +98,119 @@
   7.108  typedef MapRegistry<Graph, Edge, SymEdgeIt> SymEdgeMapRegistry; \
   7.109  mutable EdgeMapRegistry sym_edge_maps;
   7.110  
   7.111 -/** Creates a concrete factory type from a template map
   7.112 - *  factory to use as edge map factory.
   7.113 - */
   7.114 -#define CREATE_SYM_EDGE_MAP_FACTORY(TemplateFactory) \
   7.115 -typedef SymMapFactory<SymEdgeMapRegistry, TemplateFactory > \
   7.116 -SymEdgeMapFactory;
   7.117  
   7.118 -/** Import a map from a concrete map factory. The import method is
   7.119 +/** Creates a map from a template map. The import method is
   7.120   *  an overloading of the map type.
   7.121   *  The reason to use these macro is that the c++ does not support
   7.122   *  the template typedefs. If a future release of the c++ 
   7.123   *  supports this feature it should be fixed.
   7.124   */
   7.125 -#define IMPORT_SYM_EDGE_MAP(Factory) \
   7.126 -template <typename V> \
   7.127 -class SymEdgeMap : public Factory::template Map<V> { \
   7.128 -typedef typename Factory::template Map<V> MapImpl; \
   7.129 -public: \
   7.130 -SymEdgeMap() {} \
   7.131 -SymEdgeMap(const Graph& g) : MapImpl(g, g.sym_edge_maps) {} \
   7.132 -SymEdgeMap(const Graph& g, const V& v) : MapImpl(g, g.sym_edge_maps, v) {} \
   7.133 -SymEdgeMap(const SymEdgeMap& copy) \
   7.134 -  : MapImpl(static_cast<const MapImpl&>(copy)) {} \
   7.135 -template <typename CMap> SymEdgeMap(const CMap& copy) : MapImpl(copy) {} \
   7.136 -SymEdgeMap& operator=(const SymEdgeMap& copy) { \
   7.137 -  MapImpl::operator=(static_cast<const MapImpl&>(copy));\
   7.138 -  return *this; \
   7.139 -} \
   7.140 -template <typename CMap> SymEdgeMap& operator=(const CMap& copy) { \
   7.141 -  MapImpl::operator=(copy);\
   7.142 -  return *this; \
   7.143 -} \
   7.144 +#define CREATE_SYM_EDGE_MAP(DynMap) \
   7.145 +template <typename Value> \
   7.146 +class SymEdgeMap : public SymMap<DynMap, SymEdgeMapRegistry, Value> { \
   7.147 +  typedef SymMap<DynMap, SymEdgeMapRegistry, Value> MapImpl; \
   7.148 + public: \
   7.149 +\
   7.150 +  SymEdgeMap() {} \
   7.151 +\
   7.152 +  SymEdgeMap(const typename MapImpl::Graph& g) \
   7.153 +    : MapImpl(g, g.sym_edge_maps) {} \
   7.154 +\
   7.155 +  SymEdgeMap(const typename MapImpl::Graph& g, const Value& v) \
   7.156 +    : MapImpl(g, g.sym_edge_maps, v) {} \
   7.157 +\
   7.158 +  SymEdgeMap(const SymEdgeMap& copy) \
   7.159 +    : MapImpl(static_cast<const MapImpl&>(copy)) {} \
   7.160 +\
   7.161 +  template <typename CMap> SymEdgeMap(const CMap& copy) : MapImpl(copy) {} \
   7.162 +  SymEdgeMap& operator=(const SymEdgeMap& copy) { \
   7.163 +    MapImpl::operator=(static_cast<const MapImpl&>(copy));\
   7.164 +    return *this; \
   7.165 +  } \
   7.166 +\
   7.167 +  template <typename CMap> SymEdgeMap& operator=(const CMap& copy) { \
   7.168 +    MapImpl::operator=(copy);\
   7.169 +    return *this; \
   7.170 +  } \
   7.171  };
   7.172  
   7.173  
   7.174 -#define KEEP_NODE_MAP(GraphBase) \
   7.175 -    template <typename V> class NodeMap \
   7.176 -      : public GraphBase::template NodeMap<V> \
   7.177 -    { \
   7.178 -      typedef typename GraphBase::template NodeMap<V> MapImpl; \
   7.179 -      typedef V Value; \
   7.180 -    public: \
   7.181 -      NodeMap() : MapImpl() {} \
   7.182 +/** This is a macro to import an node map into a graph class.
   7.183 + */
   7.184 +#define IMPORT_NODE_MAP(From, from, To, to) \
   7.185 +template <typename Value> \
   7.186 +class NodeMap \
   7.187 +  : public From::template NodeMap<Value> { \
   7.188 +  typedef typename From::template NodeMap<Value> MapImpl; \
   7.189 + public: \
   7.190 +   NodeMap() : MapImpl() {} \
   7.191  \
   7.192 -      NodeMap(const Graph& graph) \
   7.193 -	: MapImpl(static_cast<const GraphBase&>(graph)) { } \
   7.194 +   NodeMap(const To& to) \
   7.195 +     : MapImpl(static_cast<const From&>(from)) { } \
   7.196  \
   7.197 -      NodeMap(const Graph& graph, const Value& value) \
   7.198 -	: MapImpl(static_cast<const GraphBase&>(graph), value) { } \
   7.199 +   NodeMap(const To& to, const Value& value) \
   7.200 +     : MapImpl(static_cast<const From&>(from), value) { } \
   7.201  \
   7.202 -      NodeMap(const NodeMap& copy) \
   7.203 -	: MapImpl(static_cast<const MapImpl&>(copy)) {} \
   7.204 +   NodeMap(const NodeMap& copy) \
   7.205 +     : MapImpl(static_cast<const MapImpl&>(copy)) {} \
   7.206  \
   7.207 -      template<typename CMap> \
   7.208 -      NodeMap(const CMap& copy) \
   7.209 -	: MapImpl(copy) {} \
   7.210 +   template<typename CMap> \
   7.211 +   NodeMap(const CMap& copy) \
   7.212 +     : MapImpl(copy) {} \
   7.213  \
   7.214 -      NodeMap& operator=(const NodeMap& copy) { \
   7.215 -	MapImpl::operator=(static_cast<const MapImpl&>(copy)); \
   7.216 -	return *this; \
   7.217 -      } \
   7.218 +   NodeMap& operator=(const NodeMap& copy) { \
   7.219 +     MapImpl::operator=(static_cast<const MapImpl&>(copy)); \
   7.220 +     return *this; \
   7.221 +   } \
   7.222  \
   7.223 -      template <typename CMap> \
   7.224 -      NodeMap& operator=(const CMap& copy) { \
   7.225 -	MapImpl::operator=(copy); \
   7.226 -	return *this; \
   7.227 -      } \
   7.228 -    };
   7.229 +   template <typename CMap> \
   7.230 +   NodeMap& operator=(const CMap& copy) { \
   7.231 +     MapImpl::operator=(copy); \
   7.232 +     return *this; \
   7.233 +   } \
   7.234 +};
   7.235  
   7.236 -#define KEEP_EDGE_MAP(GraphBase) \
   7.237 -    template <typename V> class EdgeMap \
   7.238 -      : public GraphBase::template EdgeMap<V> \
   7.239 -    { \
   7.240 -      typedef typename GraphBase::template EdgeMap<V> MapImpl; \
   7.241 -      typedef V Value; \
   7.242 -    public: \
   7.243 -      EdgeMap() : MapImpl() {} \
   7.244 +/** This is a macro to import an edge map into a graph class.
   7.245 + */
   7.246 +#define IMPORT_EDGE_MAP(From, from, To, to) \
   7.247 +template <typename Value> \
   7.248 +class EdgeMap \
   7.249 +  : public From::template EdgeMap<Value> { \
   7.250 +  typedef typename From::template EdgeMap<Value> MapImpl; \
   7.251 + public: \
   7.252 +   EdgeMap() : MapImpl() {} \
   7.253  \
   7.254 -      EdgeMap(const Graph& graph) \
   7.255 -	: MapImpl(static_cast<const GraphBase&>(graph)) { } \
   7.256 +   EdgeMap(const To& to) \
   7.257 +     : MapImpl(static_cast<const From&>(from)) { } \
   7.258  \
   7.259 -      EdgeMap(const Graph& graph, const Value& value) \
   7.260 -	: MapImpl(static_cast<const GraphBase&>(graph), value) { } \
   7.261 +   EdgeMap(const To& to, const Value& value) \
   7.262 +     : MapImpl(static_cast<const From&>(from), value) { } \
   7.263  \
   7.264 -      EdgeMap(const EdgeMap& copy) \
   7.265 -	: MapImpl(static_cast<const MapImpl&>(copy)) {} \
   7.266 +   EdgeMap(const EdgeMap& copy) \
   7.267 +     : MapImpl(static_cast<const MapImpl&>(copy)) {} \
   7.268  \
   7.269 -      template<typename CMap> \
   7.270 -      EdgeMap(const CMap& copy) \
   7.271 -	: MapImpl(copy) {} \
   7.272 +   template<typename CMap> \
   7.273 +   EdgeMap(const CMap& copy) \
   7.274 +     : MapImpl(copy) {} \
   7.275  \
   7.276 -      EdgeMap& operator=(const EdgeMap& copy) { \
   7.277 -	MapImpl::operator=(static_cast<const MapImpl&>(copy)); \
   7.278 -	return *this; \
   7.279 -      } \
   7.280 +   EdgeMap& operator=(const EdgeMap& copy) { \
   7.281 +     MapImpl::operator=(static_cast<const MapImpl&>(copy)); \
   7.282 +     return *this; \
   7.283 +   } \
   7.284  \
   7.285 -      template <typename CMap> \
   7.286 -      EdgeMap& operator=(const CMap& copy) { \
   7.287 -	MapImpl::operator=(copy); \
   7.288 -	return *this; \
   7.289 -      } \
   7.290 -    };
   7.291 +   template <typename CMap> \
   7.292 +   EdgeMap& operator=(const CMap& copy) { \
   7.293 +     MapImpl::operator=(copy); \
   7.294 +     return *this; \
   7.295 +   } \
   7.296 +};
   7.297  
   7.298 +
   7.299 +/** This is a macro to keep the node and edge maps for a graph class.
   7.300 + */
   7.301 +#define KEEP_MAPS(From, To) \
   7.302 +IMPORT_EDGE_MAP(From, graph, To, graph) \
   7.303 +IMPORT_NODE_MAP(From, graph, To, graph)
   7.304    
   7.305  /// @}
   7.306    
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/src/hugo/map_iterator.h	Wed Sep 08 12:06:45 2004 +0000
     8.3 @@ -0,0 +1,243 @@
     8.4 +// -*- c++ -*-
     8.5 +#ifndef MAP_ITERATOR_H
     8.6 +#define MAP_ITERATOR_H
     8.7 +
     8.8 +#include <hugo/extended_pair.h>
     8.9 +
    8.10 +namespace hugo {
    8.11 +
    8.12 +
    8.13 +  template <typename Map>
    8.14 +  class MapIterator;
    8.15 +
    8.16 +  template <typename Map>
    8.17 +  class MapConstIterator;
    8.18 +
    8.19 +  /** Compatible iterator with the stl maps' iterators.
    8.20 +   *  It iterates on pairs of a key and a value.
    8.21 +   */
    8.22 +  template <typename Map>  
    8.23 +  class MapIterator {
    8.24 +    //    friend class Map;
    8.25 +    friend class MapConstIterator<Map>;
    8.26 +
    8.27 +  public:
    8.28 +
    8.29 +    /// The key type of the iterator.
    8.30 +    typedef typename Map::KeyType KeyType;
    8.31 +    /// The iterator to iterate on the keys.
    8.32 +    typedef typename Map::KeyIt KeyIt;
    8.33 +
    8.34 +    /// The value type of the iterator.
    8.35 +    typedef typename Map::ValueType ValueType;
    8.36 +    /// The reference type of the iterator.
    8.37 +    typedef typename Map::ReferenceType ReferenceType;
    8.38 +    /// The pointer type of the iterator.
    8.39 +    typedef typename Map::PointerType PointerType;
    8.40 +
    8.41 +    /// The const value type of the iterator.
    8.42 +    typedef typename Map::ConstValueType ConstValueType;
    8.43 +    /// The const reference type of the iterator.
    8.44 +    typedef typename Map::ConstReferenceType ConstReferenceType;
    8.45 +    /// The pointer type of the iterator.
    8.46 +    typedef typename Map::ConstPointerType ConstPointerType;
    8.47 +    
    8.48 +  public:
    8.49 +
    8.50 +    /** Constructor to initalize the the iterators returned
    8.51 +     *  by the begin() and end().
    8.52 +     */
    8.53 +    MapIterator (Map& pmap, const KeyIt& pit) 
    8.54 +      : map(&pmap), it(pit) {}
    8.55 +
    8.56 +  public:
    8.57 +
    8.58 +    /** Default constructor. 
    8.59 +     */
    8.60 +    MapIterator() {}
    8.61 +
    8.62 +    typedef extended_pair<const KeyType&, const KeyType&, 
    8.63 +      ReferenceType, ReferenceType> PairReferenceType;
    8.64 +
    8.65 +    /** Dereference operator for map.
    8.66 +     */	 
    8.67 +    PairReferenceType operator*() {
    8.68 +      return PairReferenceType(it, (*map)[it]);
    8.69 +    }
    8.70 +
    8.71 +    class PairPointerType {
    8.72 +      friend class MapIterator;
    8.73 +    private:
    8.74 +      PairReferenceType data;
    8.75 +      PairPointerType(const KeyType& key, ReferenceType val) 
    8.76 +	: data(key, val) {}
    8.77 +    public:
    8.78 +      PairReferenceType* operator->() {return &data;}
    8.79 +    };
    8.80 +
    8.81 +    /** Arrow operator for map.
    8.82 +     */	 
    8.83 +    PairPointerType operator->() {
    8.84 +      return PairPointerType(it, ((*map)[it])); 
    8.85 +    }
    8.86 +
    8.87 +    /** The pre increment operator of the map.
    8.88 +     */
    8.89 +    MapIterator& operator++() { 
    8.90 +      ++it; 
    8.91 +      return *this; 
    8.92 +    }
    8.93 +
    8.94 +    /** The post increment operator of the map.
    8.95 +     */
    8.96 +    MapIterator operator++(int) { 
    8.97 +      MapIterator tmp(it); 
    8.98 +      ++it; 
    8.99 +      return tmp; 
   8.100 +    }
   8.101 +
   8.102 +    /** The equality operator of the map.
   8.103 +     */
   8.104 +    bool operator==(const MapIterator& p_it) const {
   8.105 +      return p_it.it == it;
   8.106 +    }
   8.107 +	
   8.108 +    /** The not-equality operator of the map.
   8.109 +     */
   8.110 +    bool operator!=(const MapIterator& p_it) const {
   8.111 +      return !(*this == p_it);
   8.112 +    }
   8.113 +
   8.114 +    /** The equality operator of the map.
   8.115 +     */
   8.116 +    bool operator==(const MapConstIterator<Map>& p_it) const {
   8.117 +      return p_it.it == it;
   8.118 +    }
   8.119 +	
   8.120 +    /** The not-equality operator of the map.
   8.121 +     */
   8.122 +    bool operator!=(const MapConstIterator<Map>& p_it) const {
   8.123 +      return !(*this == p_it);
   8.124 +    }
   8.125 +	
   8.126 +  private:
   8.127 +    Map* map;
   8.128 +    KeyIt it;
   8.129 +  };
   8.130 +
   8.131 +  /** Compatible iterator with the stl maps' iterators.
   8.132 +   *  It iterates on pairs of a key and a value.
   8.133 +   */
   8.134 +  template <typename Map>
   8.135 +  class MapConstIterator {
   8.136 +    // friend class Map;
   8.137 +    friend class MapIterator<Map>;
   8.138 +
   8.139 +  public:
   8.140 +
   8.141 +    /// The key type of the iterator.
   8.142 +    typedef typename Map::KeyType KeyType;
   8.143 +    /// The iterator to iterate on the keys.
   8.144 +    typedef typename Map::KeyIt KeyIt;
   8.145 +
   8.146 +    /// The value type of the iterator.
   8.147 +    typedef typename Map::ValueType ValueType;
   8.148 +    /// The reference type of the iterator.
   8.149 +    typedef typename Map::ReferenceType ReferenceType;
   8.150 +    /// The pointer type of the iterator.
   8.151 +    typedef typename Map::PointerType PointerType;
   8.152 +
   8.153 +    /// The const value type of the iterator.
   8.154 +    typedef typename Map::ConstValueType ConstValueType;
   8.155 +    /// The const reference type of the iterator.
   8.156 +    typedef typename Map::ConstReferenceType ConstReferenceType;
   8.157 +    /// The pointer type of the iterator.
   8.158 +    typedef typename Map::ConstPointerType ConstPointerType;
   8.159 +
   8.160 +  public:    
   8.161 +
   8.162 +    /** Constructor to initalize the the iterators returned
   8.163 +     *  by the begin() and end().
   8.164 +     */
   8.165 +
   8.166 +    MapConstIterator (const Map& pmap, const KeyIt& pit) 
   8.167 +      : map(&pmap), it(pit) {}
   8.168 +
   8.169 +  public:
   8.170 +
   8.171 +    /** Default constructor. 
   8.172 +     */
   8.173 +    MapConstIterator() {}
   8.174 +
   8.175 +    typedef extended_pair<const KeyType&, const KeyType&, 
   8.176 +      ConstReferenceType, ConstReferenceType> PairReferenceType;
   8.177 +
   8.178 +    /** Dereference operator for map.
   8.179 +     */	 
   8.180 +    PairReferenceType operator*() {
   8.181 +      return PairReferenceType(it, (*map)[it]);
   8.182 +    }
   8.183 +
   8.184 +    class PairPointerType {
   8.185 +      friend class MapConstIterator;
   8.186 +    private:
   8.187 +      PairReferenceType data;
   8.188 +      PairPointerType(const KeyType& key, ConstReferenceType val) 
   8.189 +	: data(key, val) {}
   8.190 +    public:
   8.191 +      PairReferenceType* operator->() {return &data;}
   8.192 +    };
   8.193 +
   8.194 +    /** Arrow operator for map.
   8.195 +     */	 
   8.196 +    PairPointerType operator->() {
   8.197 +      return PairPointerType(it, ((*map)[it])); 
   8.198 +    }
   8.199 +
   8.200 +    /** The pre increment operator of the map.
   8.201 +     */
   8.202 +    MapConstIterator& operator++() { 
   8.203 +      ++it; 
   8.204 +      return *this; 
   8.205 +    }
   8.206 +
   8.207 +    /** The post increment operator of the map.
   8.208 +     */
   8.209 +    MapConstIterator operator++(int) { 
   8.210 +      MapConstIterator<Map> tmp(it); 
   8.211 +      ++it; 
   8.212 +      return tmp; 
   8.213 +    }
   8.214 +
   8.215 +    /** The equality operator of the map.
   8.216 +     */
   8.217 +    bool operator==(const MapIterator<Map>& p_it) const {
   8.218 +      return p_it.it == it;
   8.219 +    }
   8.220 +	
   8.221 +    /** The not-equality operator of the map.
   8.222 +     */
   8.223 +    bool operator!=(const MapIterator<Map>& p_it) const {
   8.224 +      return !(*this == p_it);
   8.225 +    }
   8.226 +
   8.227 +    /** The equality operator of the map.
   8.228 +     */
   8.229 +    bool operator==(const MapConstIterator& p_it) const {
   8.230 +      return p_it.it == it;
   8.231 +    }
   8.232 +	
   8.233 +    /** The not-equality operator of the map.
   8.234 +     */
   8.235 +    bool operator!=(const MapConstIterator& p_it) const {
   8.236 +      return !(*this == p_it);
   8.237 +    }
   8.238 +	
   8.239 +  private:
   8.240 +    const Map* map;
   8.241 +    KeyIt it;
   8.242 +  };
   8.243 +
   8.244 +}
   8.245 +
   8.246 +#endif
     9.1 --- a/src/hugo/map_registry.h	Wed Sep 08 11:58:06 2004 +0000
     9.2 +++ b/src/hugo/map_registry.h	Wed Sep 08 12:06:45 2004 +0000
     9.3 @@ -28,8 +28,6 @@
     9.4      typedef K KeyType;
     9.5      typedef KIt KeyIt;
     9.6  	
     9.7 -
     9.8 -
     9.9      /**
    9.10       * MapBase is the base class of the registered maps.
    9.11       * It defines the core modification operations on the maps and
    10.1 --- a/src/hugo/smart_graph.h	Wed Sep 08 11:58:06 2004 +0000
    10.2 +++ b/src/hugo/smart_graph.h	Wed Sep 08 12:06:45 2004 +0000
    10.3 @@ -12,8 +12,9 @@
    10.4  
    10.5  #include <hugo/invalid.h>
    10.6  
    10.7 -#include <hugo/default_map_factory.h>
    10.8 -#include <hugo/sym_map_factory.h>
    10.9 +#include <hugo/default_map.h>
   10.10 +#include <hugo/sym_map.h>
   10.11 +
   10.12  #include <hugo/map_registry.h>
   10.13  
   10.14  #include <hugo/map_defines.h>
   10.15 @@ -72,8 +73,10 @@
   10.16      class OutEdgeIt;
   10.17      class InEdgeIt;
   10.18      
   10.19 +    /// Creating map registries.
   10.20      CREATE_MAP_REGISTRIES;
   10.21 -    CREATE_MAPS(DefaultMapFactory);
   10.22 +    /// Creating node and edge maps.
   10.23 +    CREATE_MAPS(DefaultMap);
   10.24      
   10.25    public:
   10.26  
   10.27 @@ -314,12 +317,14 @@
   10.28    public:
   10.29      typedef SymSmartGraph Graph;
   10.30  
   10.31 -    KEEP_NODE_MAP(SmartGraph);
   10.32 -    KEEP_EDGE_MAP(SmartGraph);
   10.33 +    /// Importing maps from the base class ListGraph.
   10.34 +    KEEP_MAPS(SmartGraph, SymSmartGraph);
   10.35  
   10.36 +    /// Creating symmetric map registry.
   10.37      CREATE_SYM_EDGE_MAP_REGISTRY;
   10.38 -    CREATE_SYM_EDGE_MAP_FACTORY(DefaultMapFactory);
   10.39 -    IMPORT_SYM_EDGE_MAP(SymEdgeMapFactory);
   10.40 +    /// Creating symmetric edge map.
   10.41 +    CREATE_SYM_EDGE_MAP(DefaultMap);
   10.42 +
   10.43  
   10.44      SymSmartGraph() : SmartGraph() { }
   10.45      SymSmartGraph(const SmartGraph &_g) : SmartGraph(_g) { }
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/src/hugo/sym_map.h	Wed Sep 08 12:06:45 2004 +0000
    11.3 @@ -0,0 +1,170 @@
    11.4 +// -*- c++ -*-
    11.5 +#ifndef SYM_MAP_H
    11.6 +#define SYM_MAP_H
    11.7 +
    11.8 +///\ingroup graphmaps
    11.9 +///\file
   11.10 +///\brief Graph maps that construates and destruates
   11.11 +///their elements dynamically.
   11.12 +
   11.13 +namespace hugo {
   11.14 +
   11.15 +/// \addtogroup graphmaps
   11.16 +/// @{
   11.17 +
   11.18 +  /** The SymEdgeIt is wrapper class for the EdgeIt. It can be used to
   11.19 +   *  iterate on the symmetric maps when all of the edge - reverse edge pair
   11.20 +   *  has different parity.
   11.21 +   */
   11.22 +
   11.23 +  template <typename Graph, typename Edge, typename EdgeIt>
   11.24 +  class SymEdgeIt : public EdgeIt {
   11.25 +  public:
   11.26 +
   11.27 +    /** Default constructor.
   11.28 +     */
   11.29 +    SymEdgeIt() 
   11.30 +      : EdgeIt() {}
   11.31 +
   11.32 +    /** Graph initialized constructor.
   11.33 +     */
   11.34 +    SymEdgeIt(const Graph& graph) 
   11.35 +      : EdgeIt(graph) {
   11.36 +      while ( (n & 1) && n != -1) {
   11.37 +	EdgeIt::operator++();
   11.38 +      }
   11.39 +    }
   11.40 +
   11.41 +    /** Creating invelid SymEdgeIt.
   11.42 +     */
   11.43 +    SymEdgeIt(Invalid invalid) 
   11.44 +      : EdgeIt(invalid) {}
   11.45 +
   11.46 +    /** SymEdgeIt from the given Edge.
   11.47 +     */
   11.48 +    SymEdgeIt(const Graph& graph, const Edge& edge)
   11.49 +      : EdgeIt(graph, edge) {
   11.50 +      while ( (n & 1) && n != -1) {
   11.51 +	EdgeIt::operator++();
   11.52 +      }
   11.53 +    }
   11.54 +
   11.55 +    /** Increase operator.
   11.56 +     */
   11.57 +    SymEdgeIt& operator++() {
   11.58 +      EdgeIt::operator++();
   11.59 +      while ( (n & 1) && n != -1) {
   11.60 +	EdgeIt::operator++();
   11.61 +      }
   11.62 +      return *this;
   11.63 +    }
   11.64 +  };
   11.65 +
   11.66 +  /** The SymMap template class is graph map structure what
   11.67 +   *  wraps an other map structure to use as symmetric map structure.
   11.68 +   *
   11.69 +   *  The template parameter is the MapRegistry that the maps
   11.70 +   *  will belong to and the ValueType.
   11.71 +   */
   11.72 +  template <template <typename, typename> class DynMap, 
   11.73 +	    typename MapRegistry, typename Value>
   11.74 +  class SymMap : public DynMap<MapRegistry, Value>{
   11.75 +
   11.76 +  private:
   11.77 +
   11.78 +    typedef DynMap<MapRegistry, Value> MapImpl;
   11.79 +
   11.80 +  public:
   11.81 +		
   11.82 +    /// The graph type of the maps. 
   11.83 +    typedef typename MapRegistry::Graph Graph;
   11.84 +
   11.85 +    typedef typename MapImpl::KeyType KeyType;
   11.86 +
   11.87 +  public:
   11.88 +
   11.89 +
   11.90 +    /** Default constructor for the map.
   11.91 +     */
   11.92 +    SymMap() : MapImpl() {}
   11.93 +
   11.94 +    /** Graph and Registry initialized map constructor.
   11.95 +     */
   11.96 +    SymMap(const Graph& g, MapRegistry& r) : MapImpl(g, r) {}
   11.97 +
   11.98 +    /** Constructor to use default value to initialize the map. 
   11.99 +     */
  11.100 +    SymMap(const Graph& g, MapRegistry& r, const Value& v) 
  11.101 +      : MapImpl(g, r, v) {}
  11.102 +
  11.103 +    /** Constructor to copy a map of the same map type.
  11.104 +     */
  11.105 +    SymMap(const SymMap& copy) 
  11.106 +      : MapImpl(static_cast<const MapImpl&>(copy)) {}
  11.107 +
  11.108 +    /** Constructor to copy a map of an other map type.
  11.109 +     */
  11.110 +    template <typename CMap> SymMap(const CMap& copy) 
  11.111 +      : MapImpl(copy) {}
  11.112 +
  11.113 +    /** Assign operator to copy a map of the same map type.
  11.114 +     */
  11.115 +    SymMap& operator=(const SymMap& copy) {
  11.116 +      MapImpl::operator=(static_cast<const MapImpl&>(copy));
  11.117 +      return *this;
  11.118 +    }
  11.119 +
  11.120 +    /** Assign operator to copy a map of an other map type.
  11.121 +     */
  11.122 +    template <typename CMap> SymMap& operator=(const CMap& copy) {
  11.123 +      MapImpl::operator=(copy);
  11.124 +      return *this;
  11.125 +    }
  11.126 +   
  11.127 +    /**
  11.128 +     * The subscript operator. The map can be subscripted by the
  11.129 +     * actual keys of the graph. 
  11.130 +     */
  11.131 +    typename MapImpl::ReferenceType operator[](const KeyType& key) {
  11.132 +      int id = MapImpl::getGraph()->id(key);	
  11.133 +      return MapImpl::operator[](id >> 1);
  11.134 +    } 
  11.135 +		
  11.136 +    /**
  11.137 +     * The const subscript operator. The map can be subscripted by the
  11.138 +     * actual keys of the graph. 
  11.139 +     */
  11.140 +    typename MapImpl::ConstReferenceType operator[](const KeyType& key) const {
  11.141 +      int id = MapImpl::getGraph()->id(key);
  11.142 +      return MapImpl::operator[](id >> 1);
  11.143 +    }
  11.144 +	
  11.145 +    /** Setter function of the map. Equivalent with map[key] = val.
  11.146 +     *  This is a compatibility feature with the not dereferable maps.
  11.147 +     */
  11.148 +    void set(const KeyType& key, const typename MapImpl::ValueType& val) {
  11.149 +      int id = MapImpl::getGraph()->id(key);
  11.150 +      MapImpl::operator[](id >> 1) = val;
  11.151 +    }
  11.152 +		
  11.153 +    /** Add a new key to the map. It called by the map registry.
  11.154 +     */
  11.155 +    void add(const KeyType& key) {
  11.156 +      int id = MapImpl::getGraph()->id(key);
  11.157 +      if (id & 1) return;
  11.158 +      MapImpl::add(key);
  11.159 +    }
  11.160 +		
  11.161 +    /** Erase a key from the map. It called by the map registry.
  11.162 +     */
  11.163 +    void erase(const KeyType& key) {
  11.164 +      int id = MapImpl::getGraph()->id(key);
  11.165 +      if (id & 1) return;
  11.166 +      MapImpl::add(key);
  11.167 +    }
  11.168 +  };
  11.169 +
  11.170 +  /// @}
  11.171 +}
  11.172 +
  11.173 +#endif
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/src/hugo/vector_map.h	Wed Sep 08 12:06:45 2004 +0000
    12.3 @@ -0,0 +1,216 @@
    12.4 +// -*- c++ -*-
    12.5 +#ifndef VECTOR_MAP_H
    12.6 +#define VECTOR_MAP_H
    12.7 +
    12.8 +#include <vector>
    12.9 +
   12.10 +#include <hugo/map_iterator.h>
   12.11 +
   12.12 +///\ingroup graphmaps
   12.13 +///\file
   12.14 +///\brief Vector based graph maps.
   12.15 +
   12.16 +namespace hugo {
   12.17 +  
   12.18 +  /// \addtogroup graphmaps
   12.19 +  /// @{
   12.20 +  
   12.21 +  /** The ArrayMap template class is graph map structure what
   12.22 +   *  automatically updates the map when a key is added to or erased from
   12.23 +   *  the map. This map factory uses the allocators to implement 
   12.24 +   *  the container functionality. This map factory
   12.25 +   *  uses the std::vector to implement the container function.
   12.26 +   *
   12.27 +   *  The template parameter is the MapRegistry that the maps
   12.28 +   *  will belong to and the ValueType.
   12.29 +   * 
   12.30 +   * \todo It should use a faster initialization using the maxNodeId() or
   12.31 +   * maxEdgeId() function of the graph instead of iterating through each
   12.32 +   * edge/node.
   12.33 +   */
   12.34 +	
   12.35 +  template <typename MapRegistry, typename Value>
   12.36 +  class VectorMap : public MapRegistry::MapBase {
   12.37 +  public:
   12.38 +		
   12.39 +    /// The graph type of the maps. 
   12.40 +    typedef typename MapRegistry::Graph Graph;
   12.41 +    /// The key type of the maps.
   12.42 +    typedef typename MapRegistry::KeyType KeyType;
   12.43 +    /// The iterator to iterate on the keys.
   12.44 +    typedef typename MapRegistry::KeyIt KeyIt;
   12.45 +
   12.46 +    /// The map type.
   12.47 +    typedef VectorMap Map;
   12.48 +    /// The MapBase of the Map which implements the core regisitry function.
   12.49 +    typedef typename MapRegistry::MapBase MapBase;
   12.50 +
   12.51 +  private:
   12.52 +		
   12.53 +    /// The container type of the map.
   12.54 +    typedef std::vector<Value> Container;	
   12.55 +
   12.56 +  public:
   12.57 +
   12.58 +
   12.59 +    /// The value type of the map.
   12.60 +    typedef Value ValueType;
   12.61 +    /// The reference type of the map;
   12.62 +    typedef typename Container::reference ReferenceType;
   12.63 +    /// The pointer type of the map;
   12.64 +    typedef typename Container::pointer PointerType;
   12.65 +
   12.66 +    /// The const value type of the map.
   12.67 +    typedef const Value ConstValueType;
   12.68 +    /// The const reference type of the map;
   12.69 +    typedef typename Container::const_reference ConstReferenceType;
   12.70 +    /// The pointer type of the map;
   12.71 +    typedef typename Container::const_pointer ConstPointerType;
   12.72 +
   12.73 +    /** Default constructor for the map.
   12.74 +     */
   12.75 +    VectorMap() {}
   12.76 +		
   12.77 +    /** Graph and Registry initialized map constructor.
   12.78 +     */
   12.79 +    VectorMap(const Graph& g, MapRegistry& r) : MapBase(g, r) {
   12.80 +      init();
   12.81 +    }
   12.82 +
   12.83 +    /** Constructor to use default value to initialize the map. 
   12.84 +     */
   12.85 +    VectorMap(const Graph& g, MapRegistry& r, const Value& v) 
   12.86 +      : MapBase(g, r) {
   12.87 +      for (KeyIt it(*getGraph()); it != INVALID; ++it) {
   12.88 +	int id = getGraph()->id(it);
   12.89 +	if (id >= (int)container.size()) {
   12.90 +	  container.resize(id + 1);
   12.91 +	}
   12.92 +	set(it, v);
   12.93 +      }
   12.94 +    }
   12.95 +
   12.96 +    /** Constructor to copy a map of an other map type.
   12.97 +     */
   12.98 +    template <typename CMap> VectorMap(const CMap& copy) : MapBase(copy) {
   12.99 +      if (getGraph()) {
  12.100 +	for (KeyIt it(*getGraph()); it != INVALID; ++it) {
  12.101 +	  int id = getGraph()->id(it);
  12.102 +	  if (id >= (int)container.size()) {
  12.103 +	    container.resize(id + 1);
  12.104 +	  }
  12.105 +	  set(it, copy[it]);
  12.106 +	}
  12.107 +      }
  12.108 +    }
  12.109 +
  12.110 +    /** Assign operator to copy a map an other map type.
  12.111 +     */
  12.112 +    template <typename CMap> VectorMap& operator=(const CMap& copy) {
  12.113 +      if (getGraph()) {
  12.114 +	destroy();
  12.115 +      } 
  12.116 +      this->MapBase::operator=(copy);
  12.117 +      if (getGraph()) {
  12.118 +	for (KeyIt it(*getGraph()); it != INVALID; ++it) {
  12.119 +	  int id = getGraph()->id(it);
  12.120 +	  if (id >= (int)container.size()) {
  12.121 +	    container.resize(id + 1);
  12.122 +	  }
  12.123 +	  set(it, copy[it]);
  12.124 +	}
  12.125 +      }
  12.126 +      return *this;
  12.127 +    }
  12.128 +
  12.129 +    /** The destructor of the map.
  12.130 +     */
  12.131 +    virtual ~VectorMap() {
  12.132 +    }
  12.133 +		
  12.134 +    /**
  12.135 +     * The subscript operator. The map can be subscripted by the
  12.136 +     * actual keys of the graph. 
  12.137 +     */
  12.138 +    ReferenceType operator[](const KeyType& key) {
  12.139 +      int id = getGraph()->id(key);
  12.140 +      return container[id];
  12.141 +    } 
  12.142 +		
  12.143 +    /**
  12.144 +     * The const subscript operator. The map can be subscripted by the
  12.145 +     * actual keys of the graph. 
  12.146 +     */
  12.147 +    ConstReferenceType operator[](const KeyType& key) const {
  12.148 +      int id = getGraph()->id(key);
  12.149 +      return container[id];
  12.150 +    }
  12.151 +
  12.152 +    /** Setter function of the map. Equivalent with map[key] = val.
  12.153 +     *  This is a compatibility feature with the not dereferable maps.
  12.154 +     */
  12.155 +    void set(const KeyType& key, const ValueType& val) {
  12.156 +      int id = getGraph()->id(key);
  12.157 +      container[id] = val;
  12.158 +    }
  12.159 +		
  12.160 +    /** Add a new key to the map. It called by the map registry.
  12.161 +     */
  12.162 +    void add(const KeyType& key) {
  12.163 +      int id = getGraph()->id(key);
  12.164 +      if (id >= (int)container.size()) {
  12.165 +	container.resize(id + 1);
  12.166 +      }
  12.167 +    }
  12.168 +		
  12.169 +    /** Erase a key from the map. It called by the map registry.
  12.170 +     */
  12.171 +    void erase(const KeyType& key) {}
  12.172 +
  12.173 +    /** Clear the data structure.
  12.174 +     */
  12.175 +    void clear() { 
  12.176 +      container.clear();
  12.177 +    }
  12.178 +
  12.179 +    /// The stl compatible pair iterator of the map.
  12.180 +    typedef MapIterator<VectorMap> Iterator;
  12.181 +    /// The stl compatible const pair iterator of the map.
  12.182 +    typedef MapConstIterator<VectorMap> ConstIterator;
  12.183 +
  12.184 +    /** Returns the begin iterator of the map.
  12.185 +     */
  12.186 +    Iterator begin() {
  12.187 +      return Iterator(*this, KeyIt(*MapBase::getGraph()));
  12.188 +    }
  12.189 +
  12.190 +    /** Returns the end iterator of the map.
  12.191 +     */
  12.192 +    Iterator end() {
  12.193 +      return Iterator(*this, INVALID);
  12.194 +    }
  12.195 +
  12.196 +    /** Returns the begin ConstIterator of the map.
  12.197 +     */
  12.198 +    ConstIterator begin() const {
  12.199 +      return ConstIterator(*this, KeyIt(*MapBase::getGraph()));
  12.200 +    }
  12.201 +
  12.202 +    /** Returns the end const_iterator of the map.
  12.203 +     */
  12.204 +    ConstIterator end() const {
  12.205 +      return ConstIterator(*this, INVALID);
  12.206 +    }
  12.207 +
  12.208 +  private:
  12.209 +		
  12.210 +    Container container;
  12.211 +
  12.212 +		
  12.213 +  };
  12.214 +  
  12.215 +  /// @}
  12.216 +  
  12.217 +}
  12.218 +
  12.219 +#endif
    13.1 --- a/src/hugo/vector_map_factory.h	Wed Sep 08 11:58:06 2004 +0000
    13.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.3 @@ -1,373 +0,0 @@
    13.4 -// -*- c++ -*-
    13.5 -#ifndef VECTOR_MAP_H
    13.6 -#define VECTOR_MAP_H
    13.7 -
    13.8 -#include <vector>
    13.9 -
   13.10 -#include <hugo/extended_pair.h>
   13.11 -
   13.12 -///\ingroup graphmapfactory
   13.13 -///\file
   13.14 -///\brief Vector based graph maps.
   13.15 -
   13.16 -namespace hugo {
   13.17 -  
   13.18 -  /// \addtogroup graphmapfactory
   13.19 -  /// @{
   13.20 -  
   13.21 -  /** The VectorMapFactory template class is a factory class
   13.22 -   *  to create maps for the edge and nodes. This map factory
   13.23 -   *  uses the std::vector to implement the container function.
   13.24 -   *
   13.25 -   *  The template parameter is the MapRegistry that the maps
   13.26 -   *  will belong to.
   13.27 -   * 
   13.28 -   * \todo It should use a faster initialization using the maxNodeId() or
   13.29 -   * maxEdgeId() function of the graph istead of iterating through each
   13.30 -   * edge/node.
   13.31 -   */
   13.32 -	
   13.33 -  template <typename MapRegistry>
   13.34 -  class VectorMapFactory {
   13.35 -  public:
   13.36 -		
   13.37 -    /// The graph type of the maps. 
   13.38 -    typedef typename MapRegistry::Graph Graph;
   13.39 -    /// The key type of the maps.
   13.40 -    typedef typename MapRegistry::KeyType KeyType;
   13.41 -    /// The iterator to iterate on the keys.
   13.42 -    typedef typename MapRegistry::KeyIt KeyIt;
   13.43 -
   13.44 -    /// The MapBase of the Map which imlements the core regisitry function.
   13.45 -    typedef typename MapRegistry::MapBase MapBase;
   13.46 -
   13.47 -		
   13.48 -    /** The template Map type.
   13.49 -     */
   13.50 -    template <typename V> 
   13.51 -    class Map : public MapBase {
   13.52 -
   13.53 -      typedef std::vector<V> Container;	
   13.54 -
   13.55 -    public:
   13.56 -
   13.57 -      /// The value type of the map.
   13.58 -      typedef V ValueType;
   13.59 -
   13.60 -      /// The value type of the map.
   13.61 -      typedef V Value;
   13.62 -      /// The reference type of the map;
   13.63 -      typedef typename Container::reference Reference;
   13.64 -      /// The pointer type of the map;
   13.65 -      typedef typename Container::pointer Pointer;
   13.66 -
   13.67 -      /// The const value type of the map.
   13.68 -      typedef const Value ConstValue;
   13.69 -      /// The const reference type of the map;
   13.70 -      typedef typename Container::const_reference ConstReference;
   13.71 -      /// The pointer type of the map;
   13.72 -      typedef typename Container::const_pointer ConstPointer;
   13.73 -
   13.74 -      /** Default constructor for the map.
   13.75 -       */
   13.76 -      Map() {}
   13.77 -		
   13.78 -      /** Graph and Registry initialized map constructor.
   13.79 -       */
   13.80 -      Map(const Graph& g, MapRegistry& r) : MapBase(g, r) {
   13.81 -	init();
   13.82 -      }
   13.83 -
   13.84 -      /** Constructor to use default value to initialize the map. 
   13.85 -       */
   13.86 -      Map(const Graph& g, MapRegistry& r, const Value& v) : MapBase(g, r) {
   13.87 -	for (KeyIt it(*getGraph()); it != INVALID; ++it) {
   13.88 -          int id = getGraph()->id(it);
   13.89 -	  if (id >= (int)container.size()) {
   13.90 -	    container.resize(id + 1);
   13.91 -	  }
   13.92 -	  set(it, v);
   13.93 -        }
   13.94 -      }
   13.95 -
   13.96 -      /** Constructor to copy a map of an other map type.
   13.97 -       */
   13.98 -      template <typename CMap> Map(const CMap& copy) : MapBase(copy) {
   13.99 -	if (getGraph()) {
  13.100 -	  for (KeyIt it(*getGraph()); it != INVALID; ++it) {
  13.101 -	    int id = getGraph()->id(it);
  13.102 -	    if (id >= (int)container.size()) {
  13.103 -	      container.resize(id + 1);
  13.104 -	    }
  13.105 -	    set(it, copy[it]);
  13.106 -	  }
  13.107 -	}
  13.108 -      }
  13.109 -
  13.110 -      /** Assign operator to copy a map an other map type.
  13.111 -       */
  13.112 -      template <typename CMap> Map& operator=(const CMap& copy) {
  13.113 -	if (getGraph()) {
  13.114 -	  destroy();
  13.115 -	} 
  13.116 -	this->MapBase::operator=(copy);
  13.117 -	if (getGraph()) {
  13.118 -	  for (KeyIt it(*getGraph()); it != INVALID; ++it) {
  13.119 -	    int id = getGraph()->id(it);
  13.120 -	    if (id >= (int)container.size()) {
  13.121 -	      container.resize(id + 1);
  13.122 -	    }
  13.123 -	    set(it, copy[it]);
  13.124 -	  }
  13.125 -	}
  13.126 -	return *this;
  13.127 -      }
  13.128 -
  13.129 -      /** The destructor of the map.
  13.130 -       */
  13.131 -      virtual ~Map() {
  13.132 -      }
  13.133 -		
  13.134 -      /**
  13.135 -       * The subscript operator. The map can be subscripted by the
  13.136 -       * actual keys of the graph. 
  13.137 -       */
  13.138 -      Reference operator[](const KeyType& key) {
  13.139 -	int id = getGraph()->id(key);
  13.140 -	return container[id];
  13.141 -      } 
  13.142 -		
  13.143 -      /**
  13.144 -       * The const subscript operator. The map can be subscripted by the
  13.145 -       * actual keys of the graph. 
  13.146 -       */
  13.147 -      ConstReference operator[](const KeyType& key) const {
  13.148 -	int id = getGraph()->id(key);
  13.149 -	return container[id];
  13.150 -      }
  13.151 -
  13.152 -      /** Setter function of the map. Equivalent with map[key] = val.
  13.153 -       *  This is a compatibility feature with the not dereferable maps.
  13.154 -       */
  13.155 -      void set(const KeyType& key, const Value& val) {
  13.156 -	int id = getGraph()->id(key);
  13.157 -	container[id] = val;
  13.158 -      }
  13.159 -		
  13.160 -      /** Add a new key to the map. It called by the map registry.
  13.161 -       */
  13.162 -      void add(const KeyType& key) {
  13.163 -	int id = getGraph()->id(key);
  13.164 -	if (id >= (int)container.size()) {
  13.165 -	  container.resize(id + 1);
  13.166 -	}
  13.167 -      }
  13.168 -		
  13.169 -      /** Erase a key from the map. It called by the map registry.
  13.170 -       */
  13.171 -      void erase(const KeyType& key) {}
  13.172 -
  13.173 -      /** Clear the data structure.
  13.174 -       */
  13.175 -      void clear() { 
  13.176 -	container.clear();
  13.177 -      }
  13.178 -
  13.179 -      class iterator;
  13.180 -      class const_iterator;
  13.181 -
  13.182 -      /** Compatible iterator with the stl maps' iterators.
  13.183 -       *  It iterates on pairs of a key and a value.
  13.184 -       */
  13.185 -      class iterator {
  13.186 -	friend class Map;
  13.187 -	friend class const_iterator;
  13.188 -      private:
  13.189 -
  13.190 -	/** Private constructor to initalize the the iterators returned
  13.191 -	 *  by the begin() and end().
  13.192 -	 */
  13.193 -	iterator (Map& pmap, const KeyIt& pit) : map(&pmap), it(pit) {}
  13.194 -
  13.195 -      public:
  13.196 -
  13.197 -	/** Default constructor. 
  13.198 -	 */
  13.199 -	iterator() {}
  13.200 -
  13.201 -	typedef extended_pair<const KeyType&, const KeyType&, 
  13.202 -			      Map::Reference, Map::Reference> Reference;
  13.203 -
  13.204 -	/** Dereference operator for map.
  13.205 -	 */	 
  13.206 -	Reference operator*() {
  13.207 -	  return Reference(it, (*map)[it]);
  13.208 -	}
  13.209 -
  13.210 -	class Pointer {
  13.211 -	  friend class iterator;
  13.212 -	private:
  13.213 -	  Reference data;
  13.214 -	  Pointer(const KeyType& key, Map::Reference val) : data(key, val) {}
  13.215 -	public:
  13.216 -	  Reference* operator->() {return &data;}
  13.217 -	};
  13.218 -
  13.219 -	/** Arrow operator for map.
  13.220 -	 */	 
  13.221 -	Pointer operator->() {
  13.222 -	  return Pointer(it, ((*map)[it])); 
  13.223 -	}
  13.224 -
  13.225 -	/** The pre increment operator of the map.
  13.226 -	 */
  13.227 -	iterator& operator++() { 
  13.228 -	  ++it; 
  13.229 -	  return *this; 
  13.230 -	}
  13.231 -
  13.232 -	/** The post increment operator of the map.
  13.233 -	 */
  13.234 -	iterator operator++(int) { 
  13.235 -	  iterator tmp(it); 
  13.236 -	  ++it; 
  13.237 -	  return tmp; 
  13.238 -	}
  13.239 -
  13.240 -	/** The equality operator of the map.
  13.241 -	 */
  13.242 -	bool operator==(const_iterator p_it) {
  13.243 -	  return p_it.it == it;
  13.244 -	}
  13.245 -	
  13.246 -	/** The not-equality operator of the map.
  13.247 -	 */
  13.248 -	bool operator!=(const_iterator p_it) {
  13.249 -	  return !(*this == p_it);
  13.250 -	}
  13.251 -
  13.252 -	
  13.253 -      private:
  13.254 -	Map* map;
  13.255 -	KeyIt it;
  13.256 -      };
  13.257 -
  13.258 -      /** Returns the begin iterator of the map.
  13.259 -       */
  13.260 -      iterator begin() {
  13.261 -	return iterator(*this, KeyIt(*getGraph()));
  13.262 -      }
  13.263 -
  13.264 -      /** Returns the end iterator of the map.
  13.265 -       */
  13.266 -      iterator end() {
  13.267 -	return iterator(*this, INVALID);
  13.268 -      }
  13.269 -
  13.270 -      class const_iterator {
  13.271 -	friend class Map;
  13.272 -	friend class iterator;
  13.273 -      private:
  13.274 -
  13.275 -	/** Private constructor to initalize the the iterators returned
  13.276 -	 *  by the begin() and end().
  13.277 -	 */
  13.278 -	const_iterator (const Map& pmap, const KeyIt& pit) 
  13.279 -	  : map(&pmap), it(pit) {}
  13.280 -
  13.281 -      public:
  13.282 -
  13.283 -	/** Default constructor. 
  13.284 -	 */
  13.285 -	const_iterator() {}
  13.286 -
  13.287 -	/** Constructor to convert iterator to const_iterator.
  13.288 -	 */
  13.289 -	const_iterator(iterator p_it) : map(p_it.map), it(p_it.it) {}
  13.290 -      
  13.291 -	typedef extended_pair<const KeyType&, const KeyType&, 
  13.292 -	  Map::ConstReference, Map::ConstReference> Reference;
  13.293 -
  13.294 -	/** Dereference operator for map.
  13.295 -	 */	 
  13.296 -	Reference operator*() {
  13.297 -	  return Reference(it, (*map)[it]);
  13.298 -	}
  13.299 -
  13.300 -
  13.301 -	class Pointer {
  13.302 -	  friend class const_iterator;
  13.303 -	private:
  13.304 -	  Reference data;
  13.305 -	  Pointer(const KeyType& key, Map::ConstReference val) 
  13.306 -	    : data(key, val) {}
  13.307 -	public:
  13.308 -	  Reference* operator->() {return &data;}
  13.309 -	};
  13.310 -
  13.311 -	/** Arrow operator for map.
  13.312 -	 */	 
  13.313 -	Pointer operator->() {
  13.314 -	  return Pointer(it, ((*map)[it])); 
  13.315 -	}
  13.316 -
  13.317 -	/** The pre increment operator of the map.
  13.318 -	 */
  13.319 -	const_iterator& operator++() { 
  13.320 -	  ++it; 
  13.321 -	  return *this; 
  13.322 -	}
  13.323 -
  13.324 -	/** The post increment operator of the map.
  13.325 -	 */
  13.326 -	const_iterator operator++(int) { 
  13.327 -	  const_iterator tmp(it); 
  13.328 -	  ++it; 
  13.329 -	  return tmp; 
  13.330 -	}
  13.331 -
  13.332 -	/** The equality operator of the map.
  13.333 -	 */
  13.334 -	bool operator==(const_iterator p_it) {
  13.335 -	  return p_it.it == it;
  13.336 -	}
  13.337 -	
  13.338 -	/** The not-equality operator of the map.
  13.339 -	 */
  13.340 -	bool operator!=(const_iterator p_it) {
  13.341 -	  return !(*this == p_it);
  13.342 -	}
  13.343 -	
  13.344 -
  13.345 -      private:
  13.346 -	const Map* map;
  13.347 -	KeyIt it;
  13.348 -      };
  13.349 -
  13.350 -      /** Returns the begin const_iterator of the map.
  13.351 -       */
  13.352 -      const_iterator begin() const {
  13.353 -	return const_iterator(*this, KeyIt(*getGraph()));
  13.354 -      }
  13.355 -
  13.356 -      /** Returns the end const_iterator of the map.
  13.357 -       */
  13.358 -      const_iterator end() const {
  13.359 -	return const_iterator(*this, INVALID);
  13.360 -      }
  13.361 -
  13.362 -      private:
  13.363 -		
  13.364 -      Container container;
  13.365 -
  13.366 -    };
  13.367 -		
  13.368 -  };
  13.369 -
  13.370 -  
  13.371 -  /// @}
  13.372 -  
  13.373 -
  13.374 -}
  13.375 -
  13.376 -#endif