src/lemon/bits/vector_map.h
changeset 1435 8e85e6bbefdf
parent 1359 1581f961cfaa
equal deleted inserted replaced
2:9130e575bd35 -1:000000000000
     1 /* -*- C++ -*-
       
     2  * src/lemon/vector_map.h - Part of LEMON, a generic C++ optimization library
       
     3  *
       
     4  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
       
     5  * (Egervary Research Group on Combinatorial Optimization, EGRES).
       
     6  *
       
     7  * Permission to use, modify and distribute this software is granted
       
     8  * provided that this copyright notice appears in all copies. For
       
     9  * precise terms see the accompanying LICENSE file.
       
    10  *
       
    11  * This software is provided "AS IS" with no warranty of any kind,
       
    12  * express or implied, and with no claim as to its suitability for any
       
    13  * purpose.
       
    14  *
       
    15  */
       
    16 
       
    17 #ifndef LEMON_VECTOR_MAP_H
       
    18 #define LEMON_VECTOR_MAP_H
       
    19 
       
    20 #include <vector>
       
    21 #include <algorithm>
       
    22 
       
    23 #include <lemon/utility.h>
       
    24 #include <lemon/bits/map_iterator.h>
       
    25 #include <lemon/bits/alteration_notifier.h>
       
    26 
       
    27 ///\ingroup graphmaps
       
    28 ///\file
       
    29 ///\brief Vector based graph maps.
       
    30 
       
    31 namespace lemon {
       
    32   
       
    33   /// \addtogroup graphmaps
       
    34   /// @{
       
    35   
       
    36   /// The VectorMap template class is graph map structure what
       
    37   /// automatically updates the map when a key is added to or erased from
       
    38   /// the map. This map factory uses the allocators to implement 
       
    39   /// the container functionality. This map factory
       
    40   /// uses the std::vector to implement the container function.
       
    41   ///
       
    42   /// \param Registry The AlterationNotifier that will notify this map.
       
    43   /// \param IdMap The IdMap type of the graph items.
       
    44   /// \param Value The value type of the map.
       
    45   /// 
       
    46   /// \author Balazs Dezso
       
    47   	
       
    48 
       
    49   template <
       
    50     typename _Graph, 
       
    51     typename _Item,    
       
    52     typename _Value
       
    53     >
       
    54   class VectorMap : public AlterationNotifier<_Item>::ObserverBase {
       
    55   public:
       
    56 		
       
    57     /// The graph type of the map. 
       
    58     typedef _Graph Graph;
       
    59     /// The key type of the map.
       
    60     typedef _Item Key;
       
    61     /// The id map type of the map.
       
    62     typedef AlterationNotifier<_Item> Registry;
       
    63     /// The value type of the map.
       
    64     typedef _Value Value;
       
    65 
       
    66     /// The map type.
       
    67     typedef VectorMap Map;
       
    68     /// The base class of the map.
       
    69     typedef typename Registry::ObserverBase Parent;
       
    70 
       
    71   private:
       
    72 		
       
    73     /// The container type of the map.
       
    74     typedef std::vector<Value> Container;	
       
    75 
       
    76   public:
       
    77 
       
    78     /// The reference type of the map;
       
    79     typedef typename Container::reference Reference;
       
    80     /// The pointer type of the map;
       
    81     typedef typename Container::pointer Pointer;
       
    82 
       
    83     /// The const value type of the map.
       
    84     typedef const Value ConstValue;
       
    85     /// The const reference type of the map;
       
    86     typedef typename Container::const_reference ConstReference;
       
    87     /// The pointer type of the map;
       
    88     typedef typename Container::const_pointer ConstPointer;
       
    89 
       
    90     typedef True FullTypeTag;
       
    91 
       
    92     /// Constructor to attach the new map into the registry.
       
    93 
       
    94     /// It construates a map and attachs it into the registry.
       
    95     /// It adds all the items of the graph to the map.
       
    96      
       
    97     VectorMap(const Graph& _g) : graph(&_g) {
       
    98       attach(_g.getNotifier(_Item()));
       
    99       build();
       
   100     }
       
   101 
       
   102     /// Constructor uses given value to initialize the map. 
       
   103 
       
   104     /// It construates a map uses a given value to initialize the map. 
       
   105     /// It adds all the items of the graph to the map.
       
   106      
       
   107     VectorMap(const Graph& _g, const Value& _v) : graph(&_g) { 
       
   108       attach(_g.getNotifier(_Item()));
       
   109       container.resize(graph->maxId(_Item()) + 1, _v);
       
   110     }
       
   111 
       
   112     VectorMap(const VectorMap& _copy) 
       
   113       : Parent(), graph(_copy.getGraph()) {
       
   114       if (_copy.attached()) {
       
   115 	attach(*_copy.getRegistry());
       
   116 	container = _copy.container;
       
   117       }
       
   118     }
       
   119 
       
   120     using Parent::attach;
       
   121     using Parent::detach;
       
   122     using Parent::attached;
       
   123 
       
   124     /** Assign operator to copy a map of the same map type.
       
   125      */
       
   126     VectorMap& operator=(const VectorMap& copy) {
       
   127       if (&copy == this) return *this;
       
   128       
       
   129       if (graph != copy.graph) {
       
   130 	if (attached()) {
       
   131 	  detach();
       
   132 	}
       
   133 	if (copy.attached()) {
       
   134 	  attach(*copy.getRegistry());
       
   135 	}
       
   136       }
       
   137       container = copy.container;
       
   138 
       
   139       return *this;
       
   140     }
       
   141 
       
   142 
       
   143     virtual ~VectorMap() {
       
   144       if (attached()) {
       
   145 	detach();
       
   146       }
       
   147     }
       
   148 
       
   149     const Graph* getGraph() const {
       
   150       return graph;
       
   151     }
       
   152 
       
   153     /// The subcript operator.
       
   154 
       
   155     /// The subscript operator. The map can be subscripted by the
       
   156     /// actual items of the graph. 
       
   157      
       
   158     Reference operator[](const Key& key) {
       
   159       return container[graph->id(key)];
       
   160     } 
       
   161 		
       
   162     /// The const subcript operator.
       
   163 
       
   164     /// The const subscript operator. The map can be subscripted by the
       
   165     /// actual items of the graph. 
       
   166      
       
   167     ConstReference operator[](const Key& key) const {
       
   168       return container[graph->id(key)];
       
   169     }
       
   170 
       
   171 
       
   172     /// The setter function of the map.
       
   173 
       
   174     /// It the same as operator[](key) = value expression.
       
   175     ///
       
   176      
       
   177     void set(const Key& key, const Value& value) {
       
   178       (*this)[key] = value;
       
   179     }
       
   180 
       
   181     /// Adds a new key to the map.
       
   182 		
       
   183     /// It adds a new key to the map. It called by the observer registry
       
   184     /// and it overrides the add() member function of the observer base.
       
   185      
       
   186     void add(const Key& key) {
       
   187       int id = graph->id(key);
       
   188       if (id >= (int)container.size()) {
       
   189 	container.resize(id + 1);
       
   190       }
       
   191     }
       
   192 
       
   193     /// Erases a key from the map.
       
   194 		
       
   195     /// Erase a key from the map. It called by the observer registry
       
   196     /// and it overrides the erase() member function of the observer base.     
       
   197     void erase(const Key&) {}
       
   198 
       
   199     /// Buildes the map.
       
   200 		
       
   201     /// It buildes the map. It called by the observer registry
       
   202     /// and it overrides the build() member function of the observer base.
       
   203 
       
   204     void build() { 
       
   205       container.resize(graph->maxId(_Item()) + 1);
       
   206     }
       
   207 
       
   208     /// Clear the map.
       
   209 
       
   210     /// It erase all items from the map. It called by the observer registry
       
   211     /// and it overrides the clear() member function of the observer base.     
       
   212     void clear() { 
       
   213       container.clear();
       
   214     }
       
   215     
       
   216   private:
       
   217 		
       
   218     Container container;
       
   219     const Graph *graph;
       
   220 
       
   221   };
       
   222 
       
   223 
       
   224   template <typename _Base> 
       
   225   class VectorMappableGraphExtender : public _Base {
       
   226   public:
       
   227 
       
   228     typedef VectorMappableGraphExtender<_Base> Graph;
       
   229     typedef _Base Parent;
       
   230 
       
   231     typedef typename Parent::Node Node;
       
   232     typedef typename Parent::NodeIt NodeIt;
       
   233     typedef typename Parent::NodeIdMap NodeIdMap;
       
   234     typedef typename Parent::NodeNotifier NodeObserverRegistry;
       
   235 
       
   236     typedef typename Parent::Edge Edge;
       
   237     typedef typename Parent::EdgeIt EdgeIt;
       
   238     typedef typename Parent::EdgeIdMap EdgeIdMap;
       
   239     typedef typename Parent::EdgeNotifier EdgeObserverRegistry;
       
   240 
       
   241     
       
   242     template <typename _Value>
       
   243     class NodeMap : 
       
   244       public IterableMapExtender<VectorMap<Graph, Node, _Value> > {
       
   245     public:
       
   246       typedef VectorMappableGraphExtender<_Base> Graph;
       
   247 
       
   248       typedef typename Graph::Node Node;
       
   249 
       
   250       typedef IterableMapExtender<VectorMap<Graph, Node, _Value> > Parent;
       
   251 
       
   252       //typedef typename Parent::Graph Graph;
       
   253       typedef typename Parent::Value Value;
       
   254 
       
   255       NodeMap(const Graph& g) 
       
   256 	: Parent(g) {}
       
   257       NodeMap(const Graph& g, const Value& v) 
       
   258 	: Parent(g, v) {}
       
   259 
       
   260     };
       
   261 
       
   262     template <typename _Value>
       
   263     class EdgeMap 
       
   264       : public IterableMapExtender<VectorMap<Graph, Edge, _Value> > {
       
   265     public:
       
   266       typedef VectorMappableGraphExtender<_Base> Graph;
       
   267 
       
   268       typedef typename Graph::Edge Edge;
       
   269 
       
   270       typedef IterableMapExtender<VectorMap<Graph, Edge, _Value> > Parent;
       
   271 
       
   272       //typedef typename Parent::Graph Graph;
       
   273       typedef typename Parent::Value Value;
       
   274 
       
   275       EdgeMap(const Graph& g) 
       
   276 	: Parent(g) {}
       
   277       EdgeMap(const Graph& g, const Value& v) 
       
   278 	: Parent(g, v) {}
       
   279 
       
   280     };
       
   281     
       
   282   };
       
   283   
       
   284   /// @}
       
   285   
       
   286 }
       
   287 
       
   288 #endif