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_STATIC_MAP_H
20 #define LEMON_STATIC_MAP_H
25 #include <lemon/utility.h>
26 #include <lemon/bits/map_extender.h>
27 #include <lemon/bits/alteration_notifier.h>
28 #include <lemon/error.h>
29 #include <lemon/concept_check.h>
30 #include <lemon/concept/maps.h>
32 /// \ingroup graphmaps
35 ///\brief Static sized graph maps.
39 /// \ingroup graphmaps
41 /// \brief Graph map with static sized storage.
43 /// The StaticMap template class is graph map structure what
44 /// does not indate automatically the map when a key is added to or
45 /// erased from the map rather it throws an exception. This map factory
46 /// uses the allocators to implement the container functionality.
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
55 template <typename _Graph, typename _Item, typename _Value>
56 class StaticMap : public AlterationNotifier<_Item>::ObserverBase {
59 /// \brief Exception class for unsupported exceptions.
60 class UnsupportedOperation : public lemon::LogicError {
62 virtual const char* exceptionName() const {
63 return "lemon::StaticMap::UnsupportedOperation";
69 typedef std::vector<_Value> Container;
73 /// The graph type of the map.
75 /// The reference map tag.
76 typedef True ReferenceMapTag;
78 /// The key type of the map.
80 /// The value type of the map.
82 /// The const reference type of the map.
83 typedef typename Container::const_reference ConstReference;
84 /// The reference type of the map.
85 typedef typename Container::reference Reference;
87 typedef const Value ConstValue;
88 typedef Value* Pointer;
89 typedef const Value* ConstPointer;
91 typedef AlterationNotifier<_Item> Registry;
94 typedef StaticMap Map;
95 /// The base class of the map.
96 typedef typename Registry::ObserverBase Parent;
98 /// \brief Constructor to attach the new map into the registry.
100 /// It constructs a map and attachs it into the registry.
101 /// It adds all the items of the graph to the map.
102 StaticMap(const Graph& _g) : graph(&_g) {
103 attach(_g.getNotifier(_Item()));
107 /// \brief Constructor uses given value to initialize the map.
109 /// It constructs a map uses a given value to initialize the map.
110 /// It adds all the items of the graph to the map.
111 StaticMap(const Graph& _g, const Value& _v) : graph(&_g) {
112 attach(_g.getNotifier(_Item()));
113 unsigned size = graph->maxId(_Item()) + 1;
114 container.reserve(size);
115 container.resize(size, _v);
118 /// \brief Copy constructor
120 /// Copy constructor.
121 StaticMap(const StaticMap& _copy) : Parent(), graph(_copy.getGraph()) {
122 if (_copy.attached()) {
123 attach(*_copy.getRegistry());
124 container = _copy.container;
128 /// \brief Destrcutor
131 virtual ~StaticMap() {
141 StaticMap& operator=(const StaticMap&);
145 using Parent::attach;
146 using Parent::detach;
147 using Parent::attached;
149 const Graph* getGraph() const {
155 /// \brief The subcript operator.
157 /// The subscript operator. The map can be subscripted by the
158 /// actual items of the graph.
160 Reference operator[](const Key& key) {
161 return container[graph->id(key)];
164 /// \brief The const subcript operator.
166 /// The const subscript operator. The map can be subscripted by the
167 /// actual items of the graph.
169 ConstReference operator[](const Key& key) const {
170 return container[graph->id(key)];
174 /// \brief The setter function of the map.
176 /// It the same as operator[](key) = value expression.
178 void set(const Key& key, const Value& value) {
179 (*this)[key] = value;
184 /// \brief Adds a new key to the map.
186 /// It adds a new key to the map. It called by the observer registry
187 /// and it overrides the add() member function of the observer base.
189 void add(const Key&) {
190 throw UnsupportedOperation();
193 /// \brief Erases a key from the map.
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 throw UnsupportedOperation();
203 /// It buildes the map. It called by the observer registry
204 /// and it overrides the build() member function of the observer base.
207 int size = graph->maxId(_Item()) + 1;
208 container.reserve(size);
209 container.resize(size);
214 /// It erase all items from the map. It called by the observer registry
215 /// and it overrides the clear() member function of the observer base.