lemon/map_iterator.h
author deba
Wed, 01 Mar 2006 10:25:30 +0000
changeset 1991 d7442141d9ef
parent 1875 98698b69a902
child 1993 2115143eceea
permissions -rw-r--r--
The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.

The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.

The ResGraphAdaptor is based on this composition.
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     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.
    12  *
    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
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_MAP_ITERATOR_H
    20 #define LEMON_MAP_ITERATOR_H
    21 
    22 #include <lemon/traits.h>
    23 #include <lemon/utility.h>
    24 
    25 /// \ingroup gutils
    26 /// \file
    27 /// \brief Iterators on the maps.
    28 
    29 namespace lemon {
    30 
    31   /// \ingroup gutils
    32   ///
    33   /// \brief Iterator for maps with possibility of changing values.
    34   ///
    35   /// Iterator for maps with possibility of changing values.
    36   template <typename Graph, typename Item, typename Map>
    37   class MapIt : public ItemSetTraits<Graph, Item>::ItemIt {
    38   public:
    39       
    40     typedef typename ItemSetTraits<Graph, Item>::ItemIt Parent;
    41     
    42     typedef typename Map::Value Value;
    43     
    44     /// \brief Creates an iterator
    45     ///
    46     /// Creates an iterator for the map, which iterates on the
    47     /// given graph item set.
    48     MapIt(const Graph& _graph, Map& _map) : Parent(_graph), map(_map) {}
    49 
    50     /// \brief Gives back the map's value on the current position.
    51     ///
    52     /// Gives back the map's value on the current position.
    53     typename MapTraits<Map>::ConstReturnValue operator*() const {
    54       return map[*this];
    55     }
    56 
    57     /// \brief Gives back a reference to the map's value.
    58     ///
    59     /// Gives back a reference to the map's value on the current position.
    60     typename MapTraits<Map>::ReturnValue operator*() {
    61       return map[*this];
    62     }
    63     
    64     /// \brief Sets the value on the current position
    65     ///
    66     /// Sets the value on the current position.
    67     void set(const Value& value) {
    68       map.set(*this, value);
    69     }
    70     
    71   protected:
    72     Map& map;
    73       
    74   };
    75 
    76   /// \ingroup gutils
    77   ///
    78   /// \brief Iterator for maps with possibility of getting values.
    79   ///
    80   /// Iterator for maps with possibility of getting values.
    81   template <typename Graph, typename Item, typename Map>
    82   class ConstMapIt : public ItemSetTraits<Graph, Item>::ItemIt {
    83   public:
    84     
    85     typedef typename ItemSetTraits<Graph, Item>::ItemIt Parent;
    86 
    87     typedef typename Map::Value Value;
    88     
    89     /// \brief Creates an iterator
    90     ///
    91     /// Creates an iterator for the map, which iterates on the
    92     /// given graph item set.
    93     ConstMapIt(const Graph& _graph, const Map& _map) 
    94       : Parent(_graph), map(_map) {}
    95     
    96     /// \brief Gives back the map's value on the current position.
    97     ///
    98     /// Gives back the map's value on the current position.
    99     typename MapTraits<Map>::ConstReturnValue operator*() const {
   100       return map[*this];
   101     }
   102     
   103   protected:
   104     const Map& map;
   105   };
   106 
   107 
   108   /// \ingroup gutils
   109   ///
   110   /// \brief Iterator for maps which filters items by the values.
   111   ///
   112   /// Iterator for maps which gives back only that items which mapped
   113   /// to an given value.
   114   template <typename Graph, typename Item, typename Map>
   115   class FilterMapIt 
   116     : public ItemSetTraits<Graph, Item>::ItemIt {
   117   public:
   118     
   119     typedef typename ItemSetTraits<Graph, Item>::ItemIt Parent;
   120 
   121     typedef typename Map::Value Value;
   122     
   123     /// \brief Creates an iterator
   124     ///
   125     /// Creates an iterator for the map, which iterates on the
   126     /// given graph item set and filters all items which mapped value
   127     /// differ from \c _value.
   128     FilterMapIt(const Graph& _graph, const Map& _map, const Value& _value) 
   129       : Parent(_graph), map(_map), value(_value) {}
   130     
   131     /// \brief Increment operator
   132     ///
   133     /// Skips items which has not the given value.
   134     FilterMapIt& operator++() {
   135       Parent::operator++();
   136       while (*this != INVALID && map[*this] != value) Parent::operator++();
   137     }
   138     
   139   protected:
   140     const Map& map;
   141     Value value;
   142   };
   143 
   144   
   145 }
   146 
   147 #endif