1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
 
     3  * This file is a part of LEMON, a generic C++ optimization library.
 
     5  * Copyright (C) 2003-2009
 
     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 {
 
    40     typedef typename Parent::GraphType GraphType;
 
    44     typedef MapExtender Map;
 
    45     typedef typename Parent::Key Item;
 
    47     typedef typename Parent::Key Key;
 
    48     typedef typename Parent::Value Value;
 
    49     typedef typename Parent::Reference Reference;
 
    50     typedef typename Parent::ConstReference ConstReference;
 
    52     typedef typename Parent::ReferenceMapTag ReferenceMapTag;
 
    58     friend class ConstMapIt;
 
    62     MapExtender(const GraphType& graph)
 
    65     MapExtender(const GraphType& graph, const Value& value)
 
    66       : Parent(graph, value) {}
 
    69     MapExtender& operator=(const MapExtender& cmap) {
 
    70       return operator=<MapExtender>(cmap);
 
    73     template <typename CMap>
 
    74     MapExtender& operator=(const CMap& cmap) {
 
    75       Parent::operator=(cmap);
 
    80     class MapIt : public Item {
 
    85       typedef typename Map::Value Value;
 
    87       MapIt() : map(NULL) {}
 
    89       MapIt(Invalid i) : Parent(i), map(NULL) {}
 
    91       explicit MapIt(Map& _map) : map(&_map) {
 
    92         map->notifier()->first(*this);
 
    95       MapIt(const Map& _map, const Item& item)
 
    96         : Parent(item), map(&_map) {}
 
    99         map->notifier()->next(*this);
 
   103       typename MapTraits<Map>::ConstReturnValue operator*() const {
 
   104         return (*map)[*this];
 
   107       typename MapTraits<Map>::ReturnValue operator*() {
 
   108         return (*map)[*this];
 
   111       void set(const Value& value) {
 
   112         map->set(*this, value);
 
   120     class ConstMapIt : public Item {
 
   125       typedef typename Map::Value Value;
 
   127       ConstMapIt() : map(NULL) {}
 
   129       ConstMapIt(Invalid i) : Parent(i), map(NULL) {}
 
   131       explicit ConstMapIt(Map& _map) : map(&_map) {
 
   132         map->notifier()->first(*this);
 
   135       ConstMapIt(const Map& _map, const Item& item)
 
   136         : Parent(item), map(_map) {}
 
   138       ConstMapIt& operator++() {
 
   139         map->notifier()->next(*this);
 
   143       typename MapTraits<Map>::ConstReturnValue operator*() const {
 
   151     class ItemIt : public Item {
 
   155       ItemIt() : map(NULL) {}
 
   158       ItemIt(Invalid i) : Parent(i), map(NULL) {}
 
   160       explicit ItemIt(Map& _map) : map(&_map) {
 
   161         map->notifier()->first(*this);
 
   164       ItemIt(const Map& _map, const Item& item)
 
   165         : Parent(item), map(&_map) {}
 
   167       ItemIt& operator++() {
 
   168         map->notifier()->next(*this);
 
   178   // \ingroup graphbits
 
   180   // \brief Extender for maps which use a subset of the items.
 
   181   template <typename _Graph, typename _Map>
 
   182   class SubMapExtender : public _Map {
 
   184     typedef _Graph GraphType;
 
   188     typedef SubMapExtender Map;
 
   189     typedef typename Parent::Key Item;
 
   191     typedef typename Parent::Key Key;
 
   192     typedef typename Parent::Value Value;
 
   193     typedef typename Parent::Reference Reference;
 
   194     typedef typename Parent::ConstReference ConstReference;
 
   196     typedef typename Parent::ReferenceMapTag ReferenceMapTag;
 
   202     friend class ConstMapIt;
 
   206     SubMapExtender(const GraphType& _graph)
 
   207       : Parent(_graph), graph(_graph) {}
 
   209     SubMapExtender(const GraphType& _graph, const Value& _value)
 
   210       : Parent(_graph, _value), graph(_graph) {}
 
   213     SubMapExtender& operator=(const SubMapExtender& cmap) {
 
   214       return operator=<MapExtender>(cmap);
 
   217     template <typename CMap>
 
   218     SubMapExtender& operator=(const CMap& cmap) {
 
   219       checkConcept<concepts::ReadMap<Key, Value>, CMap>();
 
   221       for (graph.first(it); it != INVALID; graph.next(it)) {
 
   222         Parent::set(it, cmap[it]);
 
   228     class MapIt : public Item {
 
   232       typedef typename Map::Value Value;
 
   234       MapIt() : map(NULL) {}
 
   236       MapIt(Invalid i) : Parent(i), map(NULL) { }
 
   238       explicit MapIt(Map& _map) : map(&_map) {
 
   239         map->graph.first(*this);
 
   242       MapIt(const Map& _map, const Item& item)
 
   243         : Parent(item), map(&_map) {}
 
   245       MapIt& operator++() {
 
   246         map->graph.next(*this);
 
   250       typename MapTraits<Map>::ConstReturnValue operator*() const {
 
   251         return (*map)[*this];
 
   254       typename MapTraits<Map>::ReturnValue operator*() {
 
   255         return (*map)[*this];
 
   258       void set(const Value& value) {
 
   259         map->set(*this, value);
 
   267     class ConstMapIt : public Item {
 
   272       typedef typename Map::Value Value;
 
   274       ConstMapIt() : map(NULL) {}
 
   276       ConstMapIt(Invalid i) : Parent(i), map(NULL) { }
 
   278       explicit ConstMapIt(Map& _map) : map(&_map) {
 
   279         map->graph.first(*this);
 
   282       ConstMapIt(const Map& _map, const Item& item)
 
   283         : Parent(item), map(&_map) {}
 
   285       ConstMapIt& operator++() {
 
   286         map->graph.next(*this);
 
   290       typename MapTraits<Map>::ConstReturnValue operator*() const {
 
   291         return (*map)[*this];
 
   298     class ItemIt : public Item {
 
   302       ItemIt() : map(NULL) {}
 
   305       ItemIt(Invalid i) : Parent(i), map(NULL) { }
 
   307       explicit ItemIt(Map& _map) : map(&_map) {
 
   308         map->graph.first(*this);
 
   311       ItemIt(const Map& _map, const Item& item)
 
   312         : Parent(item), map(&_map) {}
 
   314       ItemIt& operator++() {
 
   315         map->graph.next(*this);
 
   326     const GraphType& graph;