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/bits/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.