2 * src/lemon/vector_map.h - Part of LEMON, a generic C++ optimization library
4 * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
5 * (Egervary Combinatorial Optimization Research Group, EGRES).
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.
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
17 #ifndef LEMON_VECTOR_MAP_H
18 #define LEMON_VECTOR_MAP_H
23 #include <lemon/alteration_observer_registry.h>
27 ///\brief Vector based graph maps.
31 /// \addtogroup graphmaps
34 /// The VectorMap template class is graph map structure what
35 /// automatically updates the map when a key is added to or erased from
36 /// the map. This map factory uses the allocators to implement
37 /// the container functionality. This map factory
38 /// uses the std::vector to implement the container function.
40 /// \param Registry The AlterationObserverRegistry that will notify this map.
41 /// \param IdMap The IdMap type of the graph items.
42 /// \param Value The value type of the map.
44 /// \author Balazs Dezso
47 template <typename _Graph,
50 class VectorMap : public AlterationObserverRegistry<_Item>::ObserverBase {
53 /// The graph type of the map.
55 /// The key type of the map.
56 typedef _Item KeyType;
57 /// The id map type of the map.
58 typedef AlterationObserverRegistry<_Item> Registry;
59 /// The value type of the map.
63 typedef VectorMap Map;
64 /// The base class of the map.
65 typedef typename Registry::ObserverBase Parent;
69 /// The container type of the map.
70 typedef std::vector<Value> Container;
74 /// The value type of the map.
75 typedef Value ValueType;
76 /// The reference type of the map;
77 typedef typename Container::reference ReferenceType;
78 /// The pointer type of the map;
79 typedef typename Container::pointer PointerType;
81 /// The const value type of the map.
82 typedef const Value ConstValueType;
83 /// The const reference type of the map;
84 typedef typename Container::const_reference ConstReferenceType;
85 /// The pointer type of the map;
86 typedef typename Container::const_pointer ConstPointerType;
88 /// Constructor to attach the new map into the registry.
90 /// It construates a map and attachs it into the registry.
91 /// It adds all the items of the graph to the map.
93 VectorMap(const Graph& _g) : graph(&_g) {
94 attach(_g.getObserverRegistry(_Item()));
98 /// Constructor uses given value to initialize the map.
100 /// It construates a map uses a given value to initialize the map.
101 /// It adds all the items of the graph to the map.
103 VectorMap(const Graph& _g, const Value& _v) : graph(&_g) {
104 attach(_g.getObserverRegistry(_Item()));
105 container.resize(graph->maxId(_Item()) + 1, _v);
108 VectorMap(const VectorMap& _copy) : graph(_copy.getGraph()) {
109 if (_copy.attached()) {
110 attach(*_copy.getRegistry());
111 container = _copy.container;
115 using Parent::attach;
116 using Parent::detach;
117 using Parent::attached;
119 /** Assign operator to copy a map of the same map type.
121 VectorMap& operator=(const VectorMap& copy) {
122 if (© == this) return *this;
124 if (graph != copy.graph) {
128 if (copy.attached()) {
129 attach(*copy.getRegistry());
132 container = copy.container;
138 virtual ~VectorMap() {
144 const Graph* getGraph() const {
148 /// The subcript operator.
150 /// The subscript operator. The map can be subscripted by the
151 /// actual items of the graph.
153 ReferenceType operator[](const KeyType& key) {
154 return container[graph->id(key)];
157 /// The const subcript operator.
159 /// The const subscript operator. The map can be subscripted by the
160 /// actual items of the graph.
162 ConstReferenceType operator[](const KeyType& key) const {
163 return container[graph->id(key)];
167 /// The setter function of the map.
169 /// It the same as operator[](key) = value expression.
172 void set(const KeyType& key, const ValueType& value) {
173 (*this)[key] = value;
176 /// Adds a new key to the map.
178 /// It adds a new key to the map. It called by the observer registry
179 /// and it overrides the add() member function of the observer base.
181 void add(const KeyType& key) {
182 int id = graph->id(key);
183 if (id >= (int)container.size()) {
184 container.resize(id + 1);
188 /// Erases a key from the map.
190 /// Erase a key from the map. It called by the observer registry
191 /// and it overrides the erase() member function of the observer base.
192 void erase(const KeyType&) {}
196 /// It buildes the map. It called by the observer registry
197 /// and it overrides the build() member function of the observer base.
200 container.resize(graph->maxId(_Item()) + 1);
205 /// It erase all items from the map. It called by the observer registry
206 /// and it overrides the clear() member function of the observer base.
219 template <typename _Base>
220 class VectorMappableGraphExtender : public _Base {
223 typedef VectorMappableGraphExtender<_Base> Graph;
224 typedef _Base Parent;
226 typedef typename Parent::Node Node;
227 typedef typename Parent::NodeIt NodeIt;
228 typedef typename Parent::NodeIdMap NodeIdMap;
229 typedef typename Parent::NodeObserverRegistry NodeObserverRegistry;
231 typedef typename Parent::Edge Edge;
232 typedef typename Parent::EdgeIt EdgeIt;
233 typedef typename Parent::EdgeIdMap EdgeIdMap;
234 typedef typename Parent::EdgeObserverRegistry EdgeObserverRegistry;
238 template <typename _Value>
239 class NodeMap : public VectorMap<Graph, Node, _Value> {
241 typedef VectorMappableGraphExtender<_Base> Graph;
243 typedef typename Graph::Node Node;
245 typedef VectorMap<Graph, Node, _Value> Parent;
247 //typedef typename Parent::Graph Graph;
248 typedef typename Parent::Value Value;
250 NodeMap(const Graph& g)
252 NodeMap(const Graph& g, const Value& v)
257 template <typename _Value>
258 class EdgeMap : public VectorMap<Graph, Edge, _Value> {
260 typedef VectorMappableGraphExtender<_Base> Graph;
262 typedef typename Graph::Edge Edge;
264 typedef VectorMap<Graph, Edge, _Value> Parent;
266 //typedef typename Parent::Graph Graph;
267 typedef typename Parent::Value Value;
269 EdgeMap(const Graph& g)
271 EdgeMap(const Graph& g, const Value& v)