54 friend class MapIt; |
54 friend class MapIt; |
55 friend class ConstMapIt; |
55 friend class ConstMapIt; |
56 |
56 |
57 public: |
57 public: |
58 |
58 |
59 MapExtender(const Graph& graph) |
59 MapExtender(const Graph& graph) |
60 : Parent(graph) {} |
60 : Parent(graph) {} |
61 |
61 |
62 MapExtender(const Graph& graph, const Value& value) |
62 MapExtender(const Graph& graph, const Value& value) |
63 : Parent(graph, value) {} |
63 : Parent(graph, value) {} |
64 |
64 |
65 MapExtender& operator=(const MapExtender& cmap) { |
65 MapExtender& operator=(const MapExtender& cmap) { |
66 return operator=<MapExtender>(cmap); |
66 return operator=<MapExtender>(cmap); |
67 } |
67 } |
68 |
68 |
69 template <typename CMap> |
69 template <typename CMap> |
70 MapExtender& operator=(const CMap& cmap) { |
70 MapExtender& operator=(const CMap& cmap) { |
71 Parent::operator=(cmap); |
71 Parent::operator=(cmap); |
72 return *this; |
72 return *this; |
73 } |
73 } |
74 |
74 |
75 class MapIt : public Item { |
75 class MapIt : public Item { |
76 public: |
76 public: |
77 |
77 |
78 typedef Item Parent; |
78 typedef Item Parent; |
79 typedef typename Map::Value Value; |
79 typedef typename Map::Value Value; |
80 |
80 |
81 MapIt() {} |
81 MapIt() {} |
82 |
82 |
83 MapIt(Invalid i) : Parent(i) { } |
83 MapIt(Invalid i) : Parent(i) { } |
84 |
84 |
85 explicit MapIt(Map& _map) : map(_map) { |
85 explicit MapIt(Map& _map) : map(_map) { |
86 map.notifier()->first(*this); |
86 map.notifier()->first(*this); |
87 } |
87 } |
88 |
88 |
89 MapIt(const Map& _map, const Item& item) |
89 MapIt(const Map& _map, const Item& item) |
90 : Parent(item), map(_map) {} |
90 : Parent(item), map(_map) {} |
91 |
91 |
92 MapIt& operator++() { |
92 MapIt& operator++() { |
93 map.notifier()->next(*this); |
93 map.notifier()->next(*this); |
94 return *this; |
94 return *this; |
95 } |
95 } |
96 |
96 |
97 typename MapTraits<Map>::ConstReturnValue operator*() const { |
97 typename MapTraits<Map>::ConstReturnValue operator*() const { |
98 return map[*this]; |
98 return map[*this]; |
99 } |
99 } |
100 |
100 |
101 typename MapTraits<Map>::ReturnValue operator*() { |
101 typename MapTraits<Map>::ReturnValue operator*() { |
102 return map[*this]; |
102 return map[*this]; |
103 } |
103 } |
104 |
104 |
105 void set(const Value& value) { |
105 void set(const Value& value) { |
106 map.set(*this, value); |
106 map.set(*this, value); |
107 } |
107 } |
108 |
108 |
109 protected: |
109 protected: |
110 Map& map; |
110 Map& map; |
111 |
111 |
112 }; |
112 }; |
113 |
113 |
114 class ConstMapIt : public Item { |
114 class ConstMapIt : public Item { |
115 public: |
115 public: |
116 |
116 |
117 typedef Item Parent; |
117 typedef Item Parent; |
118 |
118 |
119 typedef typename Map::Value Value; |
119 typedef typename Map::Value Value; |
120 |
120 |
121 ConstMapIt() {} |
121 ConstMapIt() {} |
122 |
122 |
123 ConstMapIt(Invalid i) : Parent(i) { } |
123 ConstMapIt(Invalid i) : Parent(i) { } |
124 |
124 |
125 explicit ConstMapIt(Map& _map) : map(_map) { |
125 explicit ConstMapIt(Map& _map) : map(_map) { |
126 map.notifier()->first(*this); |
126 map.notifier()->first(*this); |
127 } |
127 } |
128 |
128 |
129 ConstMapIt(const Map& _map, const Item& item) |
129 ConstMapIt(const Map& _map, const Item& item) |
130 : Parent(item), map(_map) {} |
130 : Parent(item), map(_map) {} |
131 |
131 |
132 ConstMapIt& operator++() { |
132 ConstMapIt& operator++() { |
133 map.notifier()->next(*this); |
133 map.notifier()->next(*this); |
134 return *this; |
134 return *this; |
135 } |
135 } |
136 |
136 |
137 typename MapTraits<Map>::ConstReturnValue operator*() const { |
137 typename MapTraits<Map>::ConstReturnValue operator*() const { |
138 return map[*this]; |
138 return map[*this]; |
139 } |
139 } |
140 |
140 |
141 protected: |
141 protected: |
142 const Map& map; |
142 const Map& map; |
143 }; |
143 }; |
144 |
144 |
145 class ItemIt : public Item { |
145 class ItemIt : public Item { |
146 public: |
146 public: |
147 |
147 |
148 typedef Item Parent; |
148 typedef Item Parent; |
149 |
149 |
150 ItemIt() {} |
150 ItemIt() {} |
151 |
151 |
152 ItemIt(Invalid i) : Parent(i) { } |
152 ItemIt(Invalid i) : Parent(i) { } |
153 |
153 |
154 explicit ItemIt(Map& _map) : map(_map) { |
154 explicit ItemIt(Map& _map) : map(_map) { |
155 map.notifier()->first(*this); |
155 map.notifier()->first(*this); |
156 } |
156 } |
157 |
157 |
158 ItemIt(const Map& _map, const Item& item) |
158 ItemIt(const Map& _map, const Item& item) |
159 : Parent(item), map(_map) {} |
159 : Parent(item), map(_map) {} |
160 |
160 |
161 ItemIt& operator++() { |
161 ItemIt& operator++() { |
162 map.notifier()->next(*this); |
162 map.notifier()->next(*this); |
163 return *this; |
163 return *this; |
164 } |
164 } |
165 |
165 |
166 protected: |
166 protected: |
167 const Map& map; |
167 const Map& map; |
168 |
168 |
169 }; |
169 }; |
170 }; |
170 }; |
171 |
171 |
172 /// \ingroup graphbits |
172 /// \ingroup graphbits |
173 /// |
173 /// |
174 /// \brief Extender for maps which use a subset of the items. |
174 /// \brief Extender for maps which use a subset of the items. |
175 template <typename _Graph, typename _Map> |
175 template <typename _Graph, typename _Map> |
176 class SubMapExtender : public _Map { |
176 class SubMapExtender : public _Map { |
177 public: |
177 public: |
178 |
178 |
210 Item it; |
210 Item it; |
211 for (graph.first(it); it != INVALID; graph.next(it)) { |
211 for (graph.first(it); it != INVALID; graph.next(it)) { |
212 Parent::set(it, cmap[it]); |
212 Parent::set(it, cmap[it]); |
213 } |
213 } |
214 return *this; |
214 return *this; |
215 } |
215 } |
216 |
216 |
217 class MapIt : public Item { |
217 class MapIt : public Item { |
218 public: |
218 public: |
219 |
219 |
220 typedef Item Parent; |
220 typedef Item Parent; |
221 typedef typename Map::Value Value; |
221 typedef typename Map::Value Value; |
222 |
222 |
223 MapIt() {} |
223 MapIt() {} |
224 |
224 |
225 MapIt(Invalid i) : Parent(i) { } |
225 MapIt(Invalid i) : Parent(i) { } |
226 |
226 |
227 explicit MapIt(Map& _map) : map(_map) { |
227 explicit MapIt(Map& _map) : map(_map) { |
228 map.graph.first(*this); |
228 map.graph.first(*this); |
229 } |
229 } |
230 |
230 |
231 MapIt(const Map& _map, const Item& item) |
231 MapIt(const Map& _map, const Item& item) |
232 : Parent(item), map(_map) {} |
232 : Parent(item), map(_map) {} |
233 |
233 |
234 MapIt& operator++() { |
234 MapIt& operator++() { |
235 map.graph.next(*this); |
235 map.graph.next(*this); |
236 return *this; |
236 return *this; |
237 } |
237 } |
238 |
238 |
239 typename MapTraits<Map>::ConstReturnValue operator*() const { |
239 typename MapTraits<Map>::ConstReturnValue operator*() const { |
240 return map[*this]; |
240 return map[*this]; |
241 } |
241 } |
242 |
242 |
243 typename MapTraits<Map>::ReturnValue operator*() { |
243 typename MapTraits<Map>::ReturnValue operator*() { |
244 return map[*this]; |
244 return map[*this]; |
245 } |
245 } |
246 |
246 |
247 void set(const Value& value) { |
247 void set(const Value& value) { |
248 map.set(*this, value); |
248 map.set(*this, value); |
249 } |
249 } |
250 |
250 |
251 protected: |
251 protected: |
252 Map& map; |
252 Map& map; |
253 |
253 |
254 }; |
254 }; |
255 |
255 |
256 class ConstMapIt : public Item { |
256 class ConstMapIt : public Item { |
257 public: |
257 public: |
258 |
258 |
259 typedef Item Parent; |
259 typedef Item Parent; |
260 |
260 |
261 typedef typename Map::Value Value; |
261 typedef typename Map::Value Value; |
262 |
262 |
263 ConstMapIt() {} |
263 ConstMapIt() {} |
264 |
264 |
265 ConstMapIt(Invalid i) : Parent(i) { } |
265 ConstMapIt(Invalid i) : Parent(i) { } |
266 |
266 |
267 explicit ConstMapIt(Map& _map) : map(_map) { |
267 explicit ConstMapIt(Map& _map) : map(_map) { |
268 map.graph.first(*this); |
268 map.graph.first(*this); |
269 } |
269 } |
270 |
270 |
271 ConstMapIt(const Map& _map, const Item& item) |
271 ConstMapIt(const Map& _map, const Item& item) |
272 : Parent(item), map(_map) {} |
272 : Parent(item), map(_map) {} |
273 |
273 |
274 ConstMapIt& operator++() { |
274 ConstMapIt& operator++() { |
275 map.graph.next(*this); |
275 map.graph.next(*this); |
276 return *this; |
276 return *this; |
277 } |
277 } |
278 |
278 |
279 typename MapTraits<Map>::ConstReturnValue operator*() const { |
279 typename MapTraits<Map>::ConstReturnValue operator*() const { |
280 return map[*this]; |
280 return map[*this]; |
281 } |
281 } |
282 |
282 |
283 protected: |
283 protected: |
284 const Map& map; |
284 const Map& map; |
285 }; |
285 }; |
286 |
286 |
287 class ItemIt : public Item { |
287 class ItemIt : public Item { |
288 public: |
288 public: |
289 |
289 |
290 typedef Item Parent; |
290 typedef Item Parent; |
291 |
291 |
292 ItemIt() {} |
292 ItemIt() {} |
293 |
293 |
294 ItemIt(Invalid i) : Parent(i) { } |
294 ItemIt(Invalid i) : Parent(i) { } |
295 |
295 |
296 explicit ItemIt(Map& _map) : map(_map) { |
296 explicit ItemIt(Map& _map) : map(_map) { |
297 map.graph.first(*this); |
297 map.graph.first(*this); |
298 } |
298 } |
299 |
299 |
300 ItemIt(const Map& _map, const Item& item) |
300 ItemIt(const Map& _map, const Item& item) |
301 : Parent(item), map(_map) {} |
301 : Parent(item), map(_map) {} |
302 |
302 |
303 ItemIt& operator++() { |
303 ItemIt& operator++() { |
304 map.graph.next(*this); |
304 map.graph.next(*this); |
305 return *this; |
305 return *this; |
306 } |
306 } |
307 |
307 |
308 protected: |
308 protected: |
309 const Map& map; |
309 const Map& map; |
310 |
310 |
311 }; |
311 }; |
312 |
312 |
313 private: |
313 private: |
314 |
314 |
315 const Graph& graph; |
315 const Graph& graph; |
316 |
316 |
317 }; |
317 }; |
318 |
318 |
319 } |
319 } |
320 |
320 |
321 #endif |
321 #endif |