/* -*- mode: C++; indent-tabs-mode: nil; -*-
* This file is a part of LEMON, a generic C++ optimization library.
* Copyright (C) 2003-2009
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
* (Egervary Research Group on Combinatorial Optimization, EGRES).
* Permission to use, modify and distribute this software is granted
* provided that this copyright notice appears in all copies. For
* precise terms see the accompanying LICENSE file.
* This software is provided "AS IS" with no warranty of any kind,
* express or implied, and with no claim as to its suitability for any
#ifndef LEMON_BITS_MAP_EXTENDER_H
#define LEMON_BITS_MAP_EXTENDER_H
#include <lemon/bits/traits.h>
#include <lemon/concept_check.h>
#include <lemon/concepts/maps.h>
//\brief Extenders for iterable maps.
// \brief Extender for maps
class MapExtender : public _Map {
typedef typename Parent::GraphType GraphType;
typedef typename Parent::Key Item;
typedef typename Parent::Key Key;
typedef typename Parent::Value Value;
typedef typename Parent::Reference Reference;
typedef typename Parent::ConstReference ConstReference;
MapExtender(const GraphType& graph)
MapExtender(const GraphType& graph, const Value& value)
: Parent(graph, value) {}
MapExtender& operator=(const MapExtender& cmap) {
return operator=<MapExtender>(cmap);
MapExtender& operator=(const CMap& cmap) {
class MapIt : public Item {
typedef typename Map::Value Value;
MapIt(Invalid i) : Parent(i), map(NULL) {}
explicit MapIt(Map& _map) : map(&_map) {
map->notifier()->first(*this);
MapIt(const Map& _map, const Item& item)
: Parent(item), map(&_map) {}
map->notifier()->next(*this);
typename MapTraits<Map>::ConstReturnValue operator*() const {
typename MapTraits<Map>::ReturnValue operator*() {
void set(const Value& value) {
class ConstMapIt : public Item {
typedef typename Map::Value Value;
ConstMapIt() : map(NULL) {}
ConstMapIt(Invalid i) : Parent(i), map(NULL) {}
explicit ConstMapIt(Map& _map) : map(&_map) {
map->notifier()->first(*this);
ConstMapIt(const Map& _map, const Item& item)
: Parent(item), map(_map) {}
ConstMapIt& operator++() {
map->notifier()->next(*this);
typename MapTraits<Map>::ConstReturnValue operator*() const {
class ItemIt : public Item {
ItemIt(Invalid i) : Parent(i), map(NULL) {}
explicit ItemIt(Map& _map) : map(&_map) {
map->notifier()->first(*this);
ItemIt(const Map& _map, const Item& item)
: Parent(item), map(&_map) {}
map->notifier()->next(*this);
// \brief Extender for maps which use a subset of the items.
template <typename _Graph, typename _Map>
class SubMapExtender : public _Map {
typedef _Graph GraphType;
typedef SubMapExtender Map;
typedef typename Parent::Key Item;
typedef typename Parent::Key Key;
typedef typename Parent::Value Value;
typedef typename Parent::Reference Reference;
typedef typename Parent::ConstReference ConstReference;
SubMapExtender(const GraphType& _graph)
: Parent(_graph), graph(_graph) {}
SubMapExtender(const GraphType& _graph, const Value& _value)
: Parent(_graph, _value), graph(_graph) {}
SubMapExtender& operator=(const SubMapExtender& cmap) {
return operator=<MapExtender>(cmap);
SubMapExtender& operator=(const CMap& cmap) {
checkConcept<concepts::ReadMap<Key, Value>, CMap>();
for (graph.first(it); it != INVALID; graph.next(it)) {
Parent::set(it, cmap[it]);
class MapIt : public Item {
typedef typename Map::Value Value;
MapIt(Invalid i) : Parent(i), map(NULL) { }
explicit MapIt(Map& _map) : map(&_map) {
MapIt(const Map& _map, const Item& item)
: Parent(item), map(&_map) {}
typename MapTraits<Map>::ConstReturnValue operator*() const {
typename MapTraits<Map>::ReturnValue operator*() {
void set(const Value& value) {
class ConstMapIt : public Item {
typedef typename Map::Value Value;
ConstMapIt() : map(NULL) {}
ConstMapIt(Invalid i) : Parent(i), map(NULL) { }
explicit ConstMapIt(Map& _map) : map(&_map) {
ConstMapIt(const Map& _map, const Item& item)
: Parent(item), map(&_map) {}
ConstMapIt& operator++() {
typename MapTraits<Map>::ConstReturnValue operator*() const {
class ItemIt : public Item {
ItemIt(Invalid i) : Parent(i), map(NULL) { }
explicit ItemIt(Map& _map) : map(&_map) {
ItemIt(const Map& _map, const Item& item)
: Parent(item), map(&_map) {}