The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.
The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.
The ResGraphAdaptor is based on this composition.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
19 #ifndef LEMON_VECTOR_MAP_H
20 #define LEMON_VECTOR_MAP_H
25 #include <lemon/utility.h>
26 #include <lemon/bits/map_extender.h>
27 #include <lemon/bits/alteration_notifier.h>
28 #include <lemon/concept_check.h>
29 #include <lemon/concept/maps.h>
31 /// \ingroup graphmapfactory
34 ///\brief Vector based graph maps.
38 /// \ingroup graphmapfactory
40 /// \brief Graph map based on the std::vector storage.
42 /// The VectorMap template class is graph map structure what
43 /// automatically indates the map when a key is added to or erased from
44 /// the map. This map factory uses the allocators to implement
45 /// the container functionality. This map factory
46 /// uses the std::vector to implement the container function.
48 /// \param Registry The AlterationNotifier that will notify this map.
49 /// \param Item The item type of the graph items.
50 /// \param Value The value type of the map.
52 /// \author Balazs Dezso
59 class VectorMap : public AlterationNotifier<_Item>::ObserverBase {
62 /// The container type of the map.
63 typedef std::vector<_Value> Container;
67 /// The graph type of the map.
69 /// The reference map tag.
70 typedef True ReferenceMapTag;
72 /// The key type of the map.
74 /// The value type of the map.
77 typedef AlterationNotifier<_Item> Registry;
80 typedef VectorMap Map;
81 /// The base class of the map.
82 typedef typename Registry::ObserverBase Parent;
84 /// The reference type of the map;
85 typedef typename Container::reference Reference;
86 /// The pointer type of the map;
87 typedef typename Container::pointer Pointer;
89 /// The const value type of the map.
90 typedef const Value ConstValue;
91 /// The const reference type of the map;
92 typedef typename Container::const_reference ConstReference;
93 /// The pointer type of the map;
94 typedef typename Container::const_pointer ConstPointer;
97 /// \brief Constructor to attach the new map into the registry.
99 /// It constructs a map and attachs it into the registry.
100 /// It adds all the items of the graph to the map.
101 VectorMap(const Graph& _g) : graph(&_g) {
102 attach(_g.getNotifier(_Item()));
106 /// \brief Constructor uses given value to initialize the map.
108 /// It constructs a map uses a given value to initialize the map.
109 /// It adds all the items of the graph to the map.
110 VectorMap(const Graph& _g, const Value& _v) : graph(&_g) {
111 attach(_g.getNotifier(_Item()));
112 container.resize(graph->maxId(_Item()) + 1, _v);
115 /// \brief Copy constructor
117 /// Copy constructor.
118 VectorMap(const VectorMap& _copy)
119 : Parent(), graph(_copy.getGraph()) {
120 if (_copy.attached()) {
121 attach(*_copy.getRegistry());
122 container = _copy.container;
126 /// \brief Destrcutor
129 virtual ~VectorMap() {
138 VectorMap& operator=(const VectorMap&);
142 using Parent::attach;
143 using Parent::detach;
144 using Parent::attached;
146 const Graph* getGraph() const {
152 /// \brief The subcript operator.
154 /// The subscript operator. The map can be subscripted by the
155 /// actual items of the graph.
156 Reference operator[](const Key& key) {
157 return container[graph->id(key)];
160 /// \brief The const subcript operator.
162 /// The const subscript operator. The map can be subscripted by the
163 /// actual items of the graph.
164 ConstReference operator[](const Key& key) const {
165 return container[graph->id(key)];
169 /// \brief The setter function of the map.
171 /// It the same as operator[](key) = value expression.
172 void set(const Key& key, const Value& value) {
173 (*this)[key] = value;
178 /// \brief Adds a new key to the map.
180 /// It adds a new key to the map. It called by the observer registry
181 /// and it overrides the add() member function of the observer base.
182 virtual void add(const Key& key) {
183 int id = graph->id(key);
184 if (id >= (int)container.size()) {
185 container.resize(id + 1);
189 /// \brief Adds more new keys to the map.
191 /// It adds more new keys to the map. It called by the observer registry
192 /// and it overrides the add() member function of the observer base.
193 virtual void add(const std::vector<Key>& keys) {
194 for (int i = 0; i < (int)keys.size(); ++i) {
199 /// \brief Erase a key from the map.
201 /// Erase a key from the map. It called by the observer registry
202 /// and it overrides the erase() member function of the observer base.
203 virtual void erase(const Key&) {}
205 /// \brief Erase more keys from the map.
207 /// Erase more keys from the map. It called by the observer registry
208 /// and it overrides the erase() member function of the observer base.
209 virtual void erase(const std::vector<Key>&) {}
211 /// \brief Buildes the map.
213 /// It buildes the map. It called by the observer registry
214 /// and it overrides the build() member function of the observer base.
215 virtual void build() {
216 container.resize(graph->maxId(_Item()) + 1);
219 /// \brief Clear the map.
221 /// It erase all items from the map. It called by the observer registry
222 /// and it overrides the clear() member function of the observer base.
223 virtual void clear() {