1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2008
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_BITS_MAP_EXTENDER_H
20 #define LEMON_BITS_MAP_EXTENDER_H
24 #include <lemon/bits/traits.h>
26 #include <lemon/concept_check.h>
27 #include <lemon/concepts/maps.h>
30 //\brief Extenders for iterable maps.
36 // \brief Extender for maps
37 template <typename _Map>
38 class MapExtender : public _Map {
42 typedef MapExtender Map;
45 typedef typename Parent::Graph Graph;
46 typedef typename Parent::Key Item;
48 typedef typename Parent::Key Key;
49 typedef typename Parent::Value Value;
55 friend class ConstMapIt;
59 MapExtender(const Graph& graph)
62 MapExtender(const Graph& graph, const Value& value)
63 : Parent(graph, value) {}
66 MapExtender& operator=(const MapExtender& cmap) {
67 return operator=<MapExtender>(cmap);
70 template <typename CMap>
71 MapExtender& operator=(const CMap& cmap) {
72 Parent::operator=(cmap);
77 class MapIt : public Item {
81 typedef typename Map::Value Value;
83 MapIt() : map(NULL) {}
85 MapIt(Invalid i) : Parent(i), map(NULL) {}
87 explicit MapIt(Map& _map) : map(&_map) {
88 map->notifier()->first(*this);
91 MapIt(const Map& _map, const Item& item)
92 : Parent(item), map(&_map) {}
95 map->notifier()->next(*this);
99 typename MapTraits<Map>::ConstReturnValue operator*() const {
100 return (*map)[*this];
103 typename MapTraits<Map>::ReturnValue operator*() {
104 return (*map)[*this];
107 void set(const Value& value) {
108 map->set(*this, value);
116 class ConstMapIt : public Item {
121 typedef typename Map::Value Value;
123 ConstMapIt() : map(NULL) {}
125 ConstMapIt(Invalid i) : Parent(i), map(NULL) {}
127 explicit ConstMapIt(Map& _map) : map(&_map) {
128 map->notifier()->first(*this);
131 ConstMapIt(const Map& _map, const Item& item)
132 : Parent(item), map(_map) {}
134 ConstMapIt& operator++() {
135 map->notifier()->next(*this);
139 typename MapTraits<Map>::ConstReturnValue operator*() const {
147 class ItemIt : public Item {
152 ItemIt() : map(NULL) {}
154 ItemIt(Invalid i) : Parent(i), map(NULL) {}
156 explicit ItemIt(Map& _map) : map(&_map) {
157 map->notifier()->first(*this);
160 ItemIt(const Map& _map, const Item& item)
161 : Parent(item), map(&_map) {}
163 ItemIt& operator++() {
164 map->notifier()->next(*this);
174 // \ingroup graphbits
176 // \brief Extender for maps which use a subset of the items.
177 template <typename _Graph, typename _Map>
178 class SubMapExtender : public _Map {
182 typedef SubMapExtender Map;
184 typedef _Graph Graph;
186 typedef typename Parent::Key Item;
188 typedef typename Parent::Key Key;
189 typedef typename Parent::Value Value;
195 friend class ConstMapIt;
199 SubMapExtender(const Graph& _graph)
200 : Parent(_graph), graph(_graph) {}
202 SubMapExtender(const Graph& _graph, const Value& _value)
203 : Parent(_graph, _value), graph(_graph) {}
206 SubMapExtender& operator=(const SubMapExtender& cmap) {
207 return operator=<MapExtender>(cmap);
210 template <typename CMap>
211 SubMapExtender& operator=(const CMap& cmap) {
212 checkConcept<concepts::ReadMap<Key, Value>, CMap>();
214 for (graph.first(it); it != INVALID; graph.next(it)) {
215 Parent::set(it, cmap[it]);
221 class MapIt : public Item {
225 typedef typename Map::Value Value;
227 MapIt() : map(NULL) {}
229 MapIt(Invalid i) : Parent(i), map(NULL) { }
231 explicit MapIt(Map& _map) : map(&_map) {
232 map->graph.first(*this);
235 MapIt(const Map& _map, const Item& item)
236 : Parent(item), map(&_map) {}
238 MapIt& operator++() {
239 map->graph.next(*this);
243 typename MapTraits<Map>::ConstReturnValue operator*() const {
244 return (*map)[*this];
247 typename MapTraits<Map>::ReturnValue operator*() {
248 return (*map)[*this];
251 void set(const Value& value) {
252 map->set(*this, value);
260 class ConstMapIt : public Item {
265 typedef typename Map::Value Value;
267 ConstMapIt() : map(NULL) {}
269 ConstMapIt(Invalid i) : Parent(i), map(NULL) { }
271 explicit ConstMapIt(Map& _map) : map(&_map) {
272 map->graph.first(*this);
275 ConstMapIt(const Map& _map, const Item& item)
276 : Parent(item), map(&_map) {}
278 ConstMapIt& operator++() {
279 map->graph.next(*this);
283 typename MapTraits<Map>::ConstReturnValue operator*() const {
284 return (*map)[*this];
291 class ItemIt : public Item {
296 ItemIt() : map(NULL) {}
298 ItemIt(Invalid i) : Parent(i), map(NULL) { }
300 explicit ItemIt(Map& _map) : map(&_map) {
301 map->graph.first(*this);
304 ItemIt(const Map& _map, const Item& item)
305 : Parent(item), map(&_map) {}
307 ItemIt& operator++() {
308 map->graph.next(*this);