lemon/maps.h
author Balazs Dezso <deba@inf.elte.hu>
Thu, 24 Jun 2010 09:27:53 +0200
changeset 982 bb70ad62c95f
parent 631 33c6b6e755cd
child 731 7b1a6e963018
child 740 7bda7860e0a8
child 763 f47b6c94577e
permissions -rw-r--r--
Fix critical bug in preflow (#372)

The wrong transition between the bound decrease and highest active
heuristics caused the bug. The last node chosen in bound decrease mode
is used in the first iteration in highest active mode.
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     5  * Copyright (C) 2003-2009
     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_MAPS_H
    20 #define LEMON_MAPS_H
    21 
    22 #include <iterator>
    23 #include <functional>
    24 #include <vector>
    25 
    26 #include <lemon/core.h>
    27 
    28 ///\file
    29 ///\ingroup maps
    30 ///\brief Miscellaneous property maps
    31 
    32 #include <map>
    33 
    34 namespace lemon {
    35 
    36   /// \addtogroup maps
    37   /// @{
    38 
    39   /// Base class of maps.
    40 
    41   /// Base class of maps. It provides the necessary type definitions
    42   /// required by the map %concepts.
    43   template<typename K, typename V>
    44   class MapBase {
    45   public:
    46     /// \brief The key type of the map.
    47     typedef K Key;
    48     /// \brief The value type of the map.
    49     /// (The type of objects associated with the keys).
    50     typedef V Value;
    51   };
    52 
    53 
    54   /// Null map. (a.k.a. DoNothingMap)
    55 
    56   /// This map can be used if you have to provide a map only for
    57   /// its type definitions, or if you have to provide a writable map,
    58   /// but data written to it is not required (i.e. it will be sent to
    59   /// <tt>/dev/null</tt>).
    60   /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
    61   ///
    62   /// \sa ConstMap
    63   template<typename K, typename V>
    64   class NullMap : public MapBase<K, V> {
    65   public:
    66     ///\e
    67     typedef K Key;
    68     ///\e
    69     typedef V Value;
    70 
    71     /// Gives back a default constructed element.
    72     Value operator[](const Key&) const { return Value(); }
    73     /// Absorbs the value.
    74     void set(const Key&, const Value&) {}
    75   };
    76 
    77   /// Returns a \c NullMap class
    78 
    79   /// This function just returns a \c NullMap class.
    80   /// \relates NullMap
    81   template <typename K, typename V>
    82   NullMap<K, V> nullMap() {
    83     return NullMap<K, V>();
    84   }
    85 
    86 
    87   /// Constant map.
    88 
    89   /// This \ref concepts::ReadMap "readable map" assigns a specified
    90   /// value to each key.
    91   ///
    92   /// In other aspects it is equivalent to \c NullMap.
    93   /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
    94   /// concept, but it absorbs the data written to it.
    95   ///
    96   /// The simplest way of using this map is through the constMap()
    97   /// function.
    98   ///
    99   /// \sa NullMap
   100   /// \sa IdentityMap
   101   template<typename K, typename V>
   102   class ConstMap : public MapBase<K, V> {
   103   private:
   104     V _value;
   105   public:
   106     ///\e
   107     typedef K Key;
   108     ///\e
   109     typedef V Value;
   110 
   111     /// Default constructor
   112 
   113     /// Default constructor.
   114     /// The value of the map will be default constructed.
   115     ConstMap() {}
   116 
   117     /// Constructor with specified initial value
   118 
   119     /// Constructor with specified initial value.
   120     /// \param v The initial value of the map.
   121     ConstMap(const Value &v) : _value(v) {}
   122 
   123     /// Gives back the specified value.
   124     Value operator[](const Key&) const { return _value; }
   125 
   126     /// Absorbs the value.
   127     void set(const Key&, const Value&) {}
   128 
   129     /// Sets the value that is assigned to each key.
   130     void setAll(const Value &v) {
   131       _value = v;
   132     }
   133 
   134     template<typename V1>
   135     ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
   136   };
   137 
   138   /// Returns a \c ConstMap class
   139 
   140   /// This function just returns a \c ConstMap class.
   141   /// \relates ConstMap
   142   template<typename K, typename V>
   143   inline ConstMap<K, V> constMap(const V &v) {
   144     return ConstMap<K, V>(v);
   145   }
   146 
   147   template<typename K, typename V>
   148   inline ConstMap<K, V> constMap() {
   149     return ConstMap<K, V>();
   150   }
   151 
   152 
   153   template<typename T, T v>
   154   struct Const {};
   155 
   156   /// Constant map with inlined constant value.
   157 
   158   /// This \ref concepts::ReadMap "readable map" assigns a specified
   159   /// value to each key.
   160   ///
   161   /// In other aspects it is equivalent to \c NullMap.
   162   /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
   163   /// concept, but it absorbs the data written to it.
   164   ///
   165   /// The simplest way of using this map is through the constMap()
   166   /// function.
   167   ///
   168   /// \sa NullMap
   169   /// \sa IdentityMap
   170   template<typename K, typename V, V v>
   171   class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
   172   public:
   173     ///\e
   174     typedef K Key;
   175     ///\e
   176     typedef V Value;
   177 
   178     /// Constructor.
   179     ConstMap() {}
   180 
   181     /// Gives back the specified value.
   182     Value operator[](const Key&) const { return v; }
   183 
   184     /// Absorbs the value.
   185     void set(const Key&, const Value&) {}
   186   };
   187 
   188   /// Returns a \c ConstMap class with inlined constant value
   189 
   190   /// This function just returns a \c ConstMap class with inlined
   191   /// constant value.
   192   /// \relates ConstMap
   193   template<typename K, typename V, V v>
   194   inline ConstMap<K, Const<V, v> > constMap() {
   195     return ConstMap<K, Const<V, v> >();
   196   }
   197 
   198 
   199   /// Identity map.
   200 
   201   /// This \ref concepts::ReadMap "read-only map" gives back the given
   202   /// key as value without any modification.
   203   ///
   204   /// \sa ConstMap
   205   template <typename T>
   206   class IdentityMap : public MapBase<T, T> {
   207   public:
   208     ///\e
   209     typedef T Key;
   210     ///\e
   211     typedef T Value;
   212 
   213     /// Gives back the given value without any modification.
   214     Value operator[](const Key &k) const {
   215       return k;
   216     }
   217   };
   218 
   219   /// Returns an \c IdentityMap class
   220 
   221   /// This function just returns an \c IdentityMap class.
   222   /// \relates IdentityMap
   223   template<typename T>
   224   inline IdentityMap<T> identityMap() {
   225     return IdentityMap<T>();
   226   }
   227 
   228 
   229   /// \brief Map for storing values for integer keys from the range
   230   /// <tt>[0..size-1]</tt>.
   231   ///
   232   /// This map is essentially a wrapper for \c std::vector. It assigns
   233   /// values to integer keys from the range <tt>[0..size-1]</tt>.
   234   /// It can be used with some data structures, for example
   235   /// \c UnionFind, \c BinHeap, when the used items are small
   236   /// integers. This map conforms the \ref concepts::ReferenceMap
   237   /// "ReferenceMap" concept.
   238   ///
   239   /// The simplest way of using this map is through the rangeMap()
   240   /// function.
   241   template <typename V>
   242   class RangeMap : public MapBase<int, V> {
   243     template <typename V1>
   244     friend class RangeMap;
   245   private:
   246 
   247     typedef std::vector<V> Vector;
   248     Vector _vector;
   249 
   250   public:
   251 
   252     /// Key type
   253     typedef int Key;
   254     /// Value type
   255     typedef V Value;
   256     /// Reference type
   257     typedef typename Vector::reference Reference;
   258     /// Const reference type
   259     typedef typename Vector::const_reference ConstReference;
   260 
   261     typedef True ReferenceMapTag;
   262 
   263   public:
   264 
   265     /// Constructor with specified default value.
   266     RangeMap(int size = 0, const Value &value = Value())
   267       : _vector(size, value) {}
   268 
   269     /// Constructs the map from an appropriate \c std::vector.
   270     template <typename V1>
   271     RangeMap(const std::vector<V1>& vector)
   272       : _vector(vector.begin(), vector.end()) {}
   273 
   274     /// Constructs the map from another \c RangeMap.
   275     template <typename V1>
   276     RangeMap(const RangeMap<V1> &c)
   277       : _vector(c._vector.begin(), c._vector.end()) {}
   278 
   279     /// Returns the size of the map.
   280     int size() {
   281       return _vector.size();
   282     }
   283 
   284     /// Resizes the map.
   285 
   286     /// Resizes the underlying \c std::vector container, so changes the
   287     /// keyset of the map.
   288     /// \param size The new size of the map. The new keyset will be the
   289     /// range <tt>[0..size-1]</tt>.
   290     /// \param value The default value to assign to the new keys.
   291     void resize(int size, const Value &value = Value()) {
   292       _vector.resize(size, value);
   293     }
   294 
   295   private:
   296 
   297     RangeMap& operator=(const RangeMap&);
   298 
   299   public:
   300 
   301     ///\e
   302     Reference operator[](const Key &k) {
   303       return _vector[k];
   304     }
   305 
   306     ///\e
   307     ConstReference operator[](const Key &k) const {
   308       return _vector[k];
   309     }
   310 
   311     ///\e
   312     void set(const Key &k, const Value &v) {
   313       _vector[k] = v;
   314     }
   315   };
   316 
   317   /// Returns a \c RangeMap class
   318 
   319   /// This function just returns a \c RangeMap class.
   320   /// \relates RangeMap
   321   template<typename V>
   322   inline RangeMap<V> rangeMap(int size = 0, const V &value = V()) {
   323     return RangeMap<V>(size, value);
   324   }
   325 
   326   /// \brief Returns a \c RangeMap class created from an appropriate
   327   /// \c std::vector
   328 
   329   /// This function just returns a \c RangeMap class created from an
   330   /// appropriate \c std::vector.
   331   /// \relates RangeMap
   332   template<typename V>
   333   inline RangeMap<V> rangeMap(const std::vector<V> &vector) {
   334     return RangeMap<V>(vector);
   335   }
   336 
   337 
   338   /// Map type based on \c std::map
   339 
   340   /// This map is essentially a wrapper for \c std::map with addition
   341   /// that you can specify a default value for the keys that are not
   342   /// stored actually. This value can be different from the default
   343   /// contructed value (i.e. \c %Value()).
   344   /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
   345   /// concept.
   346   ///
   347   /// This map is useful if a default value should be assigned to most of
   348   /// the keys and different values should be assigned only to a few
   349   /// keys (i.e. the map is "sparse").
   350   /// The name of this type also refers to this important usage.
   351   ///
   352   /// Apart form that this map can be used in many other cases since it
   353   /// is based on \c std::map, which is a general associative container.
   354   /// However keep in mind that it is usually not as efficient as other
   355   /// maps.
   356   ///
   357   /// The simplest way of using this map is through the sparseMap()
   358   /// function.
   359   template <typename K, typename V, typename Comp = std::less<K> >
   360   class SparseMap : public MapBase<K, V> {
   361     template <typename K1, typename V1, typename C1>
   362     friend class SparseMap;
   363   public:
   364 
   365     /// Key type
   366     typedef K Key;
   367     /// Value type
   368     typedef V Value;
   369     /// Reference type
   370     typedef Value& Reference;
   371     /// Const reference type
   372     typedef const Value& ConstReference;
   373 
   374     typedef True ReferenceMapTag;
   375 
   376   private:
   377 
   378     typedef std::map<K, V, Comp> Map;
   379     Map _map;
   380     Value _value;
   381 
   382   public:
   383 
   384     /// \brief Constructor with specified default value.
   385     SparseMap(const Value &value = Value()) : _value(value) {}
   386     /// \brief Constructs the map from an appropriate \c std::map, and
   387     /// explicitly specifies a default value.
   388     template <typename V1, typename Comp1>
   389     SparseMap(const std::map<Key, V1, Comp1> &map,
   390               const Value &value = Value())
   391       : _map(map.begin(), map.end()), _value(value) {}
   392 
   393     /// \brief Constructs the map from another \c SparseMap.
   394     template<typename V1, typename Comp1>
   395     SparseMap(const SparseMap<Key, V1, Comp1> &c)
   396       : _map(c._map.begin(), c._map.end()), _value(c._value) {}
   397 
   398   private:
   399 
   400     SparseMap& operator=(const SparseMap&);
   401 
   402   public:
   403 
   404     ///\e
   405     Reference operator[](const Key &k) {
   406       typename Map::iterator it = _map.lower_bound(k);
   407       if (it != _map.end() && !_map.key_comp()(k, it->first))
   408         return it->second;
   409       else
   410         return _map.insert(it, std::make_pair(k, _value))->second;
   411     }
   412 
   413     ///\e
   414     ConstReference operator[](const Key &k) const {
   415       typename Map::const_iterator it = _map.find(k);
   416       if (it != _map.end())
   417         return it->second;
   418       else
   419         return _value;
   420     }
   421 
   422     ///\e
   423     void set(const Key &k, const Value &v) {
   424       typename Map::iterator it = _map.lower_bound(k);
   425       if (it != _map.end() && !_map.key_comp()(k, it->first))
   426         it->second = v;
   427       else
   428         _map.insert(it, std::make_pair(k, v));
   429     }
   430 
   431     ///\e
   432     void setAll(const Value &v) {
   433       _value = v;
   434       _map.clear();
   435     }
   436   };
   437 
   438   /// Returns a \c SparseMap class
   439 
   440   /// This function just returns a \c SparseMap class with specified
   441   /// default value.
   442   /// \relates SparseMap
   443   template<typename K, typename V, typename Compare>
   444   inline SparseMap<K, V, Compare> sparseMap(const V& value = V()) {
   445     return SparseMap<K, V, Compare>(value);
   446   }
   447 
   448   template<typename K, typename V>
   449   inline SparseMap<K, V, std::less<K> > sparseMap(const V& value = V()) {
   450     return SparseMap<K, V, std::less<K> >(value);
   451   }
   452 
   453   /// \brief Returns a \c SparseMap class created from an appropriate
   454   /// \c std::map
   455 
   456   /// This function just returns a \c SparseMap class created from an
   457   /// appropriate \c std::map.
   458   /// \relates SparseMap
   459   template<typename K, typename V, typename Compare>
   460   inline SparseMap<K, V, Compare>
   461     sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
   462   {
   463     return SparseMap<K, V, Compare>(map, value);
   464   }
   465 
   466   /// @}
   467 
   468   /// \addtogroup map_adaptors
   469   /// @{
   470 
   471   /// Composition of two maps
   472 
   473   /// This \ref concepts::ReadMap "read-only map" returns the
   474   /// composition of two given maps. That is to say, if \c m1 is of
   475   /// type \c M1 and \c m2 is of \c M2, then for
   476   /// \code
   477   ///   ComposeMap<M1, M2> cm(m1,m2);
   478   /// \endcode
   479   /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
   480   ///
   481   /// The \c Key type of the map is inherited from \c M2 and the
   482   /// \c Value type is from \c M1.
   483   /// \c M2::Value must be convertible to \c M1::Key.
   484   ///
   485   /// The simplest way of using this map is through the composeMap()
   486   /// function.
   487   ///
   488   /// \sa CombineMap
   489   template <typename M1, typename M2>
   490   class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
   491     const M1 &_m1;
   492     const M2 &_m2;
   493   public:
   494     ///\e
   495     typedef typename M2::Key Key;
   496     ///\e
   497     typedef typename M1::Value Value;
   498 
   499     /// Constructor
   500     ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
   501 
   502     ///\e
   503     typename MapTraits<M1>::ConstReturnValue
   504     operator[](const Key &k) const { return _m1[_m2[k]]; }
   505   };
   506 
   507   /// Returns a \c ComposeMap class
   508 
   509   /// This function just returns a \c ComposeMap class.
   510   ///
   511   /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
   512   /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
   513   /// will be equal to <tt>m1[m2[x]]</tt>.
   514   ///
   515   /// \relates ComposeMap
   516   template <typename M1, typename M2>
   517   inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
   518     return ComposeMap<M1, M2>(m1, m2);
   519   }
   520 
   521 
   522   /// Combination of two maps using an STL (binary) functor.
   523 
   524   /// This \ref concepts::ReadMap "read-only map" takes two maps and a
   525   /// binary functor and returns the combination of the two given maps
   526   /// using the functor.
   527   /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
   528   /// and \c f is of \c F, then for
   529   /// \code
   530   ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
   531   /// \endcode
   532   /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
   533   ///
   534   /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
   535   /// must be convertible to \c M2::Key) and the \c Value type is \c V.
   536   /// \c M2::Value and \c M1::Value must be convertible to the
   537   /// corresponding input parameter of \c F and the return type of \c F
   538   /// must be convertible to \c V.
   539   ///
   540   /// The simplest way of using this map is through the combineMap()
   541   /// function.
   542   ///
   543   /// \sa ComposeMap
   544   template<typename M1, typename M2, typename F,
   545            typename V = typename F::result_type>
   546   class CombineMap : public MapBase<typename M1::Key, V> {
   547     const M1 &_m1;
   548     const M2 &_m2;
   549     F _f;
   550   public:
   551     ///\e
   552     typedef typename M1::Key Key;
   553     ///\e
   554     typedef V Value;
   555 
   556     /// Constructor
   557     CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
   558       : _m1(m1), _m2(m2), _f(f) {}
   559     ///\e
   560     Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
   561   };
   562 
   563   /// Returns a \c CombineMap class
   564 
   565   /// This function just returns a \c CombineMap class.
   566   ///
   567   /// For example, if \c m1 and \c m2 are both maps with \c double
   568   /// values, then
   569   /// \code
   570   ///   combineMap(m1,m2,std::plus<double>())
   571   /// \endcode
   572   /// is equivalent to
   573   /// \code
   574   ///   addMap(m1,m2)
   575   /// \endcode
   576   ///
   577   /// This function is specialized for adaptable binary function
   578   /// classes and C++ functions.
   579   ///
   580   /// \relates CombineMap
   581   template<typename M1, typename M2, typename F, typename V>
   582   inline CombineMap<M1, M2, F, V>
   583   combineMap(const M1 &m1, const M2 &m2, const F &f) {
   584     return CombineMap<M1, M2, F, V>(m1,m2,f);
   585   }
   586 
   587   template<typename M1, typename M2, typename F>
   588   inline CombineMap<M1, M2, F, typename F::result_type>
   589   combineMap(const M1 &m1, const M2 &m2, const F &f) {
   590     return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
   591   }
   592 
   593   template<typename M1, typename M2, typename K1, typename K2, typename V>
   594   inline CombineMap<M1, M2, V (*)(K1, K2), V>
   595   combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
   596     return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
   597   }
   598 
   599 
   600   /// Converts an STL style (unary) functor to a map
   601 
   602   /// This \ref concepts::ReadMap "read-only map" returns the value
   603   /// of a given functor. Actually, it just wraps the functor and
   604   /// provides the \c Key and \c Value typedefs.
   605   ///
   606   /// Template parameters \c K and \c V will become its \c Key and
   607   /// \c Value. In most cases they have to be given explicitly because
   608   /// a functor typically does not provide \c argument_type and
   609   /// \c result_type typedefs.
   610   /// Parameter \c F is the type of the used functor.
   611   ///
   612   /// The simplest way of using this map is through the functorToMap()
   613   /// function.
   614   ///
   615   /// \sa MapToFunctor
   616   template<typename F,
   617            typename K = typename F::argument_type,
   618            typename V = typename F::result_type>
   619   class FunctorToMap : public MapBase<K, V> {
   620     F _f;
   621   public:
   622     ///\e
   623     typedef K Key;
   624     ///\e
   625     typedef V Value;
   626 
   627     /// Constructor
   628     FunctorToMap(const F &f = F()) : _f(f) {}
   629     ///\e
   630     Value operator[](const Key &k) const { return _f(k); }
   631   };
   632 
   633   /// Returns a \c FunctorToMap class
   634 
   635   /// This function just returns a \c FunctorToMap class.
   636   ///
   637   /// This function is specialized for adaptable binary function
   638   /// classes and C++ functions.
   639   ///
   640   /// \relates FunctorToMap
   641   template<typename K, typename V, typename F>
   642   inline FunctorToMap<F, K, V> functorToMap(const F &f) {
   643     return FunctorToMap<F, K, V>(f);
   644   }
   645 
   646   template <typename F>
   647   inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
   648     functorToMap(const F &f)
   649   {
   650     return FunctorToMap<F, typename F::argument_type,
   651       typename F::result_type>(f);
   652   }
   653 
   654   template <typename K, typename V>
   655   inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
   656     return FunctorToMap<V (*)(K), K, V>(f);
   657   }
   658 
   659 
   660   /// Converts a map to an STL style (unary) functor
   661 
   662   /// This class converts a map to an STL style (unary) functor.
   663   /// That is it provides an <tt>operator()</tt> to read its values.
   664   ///
   665   /// For the sake of convenience it also works as a usual
   666   /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
   667   /// and the \c Key and \c Value typedefs also exist.
   668   ///
   669   /// The simplest way of using this map is through the mapToFunctor()
   670   /// function.
   671   ///
   672   ///\sa FunctorToMap
   673   template <typename M>
   674   class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
   675     const M &_m;
   676   public:
   677     ///\e
   678     typedef typename M::Key Key;
   679     ///\e
   680     typedef typename M::Value Value;
   681 
   682     typedef typename M::Key argument_type;
   683     typedef typename M::Value result_type;
   684 
   685     /// Constructor
   686     MapToFunctor(const M &m) : _m(m) {}
   687     ///\e
   688     Value operator()(const Key &k) const { return _m[k]; }
   689     ///\e
   690     Value operator[](const Key &k) const { return _m[k]; }
   691   };
   692 
   693   /// Returns a \c MapToFunctor class
   694 
   695   /// This function just returns a \c MapToFunctor class.
   696   /// \relates MapToFunctor
   697   template<typename M>
   698   inline MapToFunctor<M> mapToFunctor(const M &m) {
   699     return MapToFunctor<M>(m);
   700   }
   701 
   702 
   703   /// \brief Map adaptor to convert the \c Value type of a map to
   704   /// another type using the default conversion.
   705 
   706   /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
   707   /// "readable map" to another type using the default conversion.
   708   /// The \c Key type of it is inherited from \c M and the \c Value
   709   /// type is \c V.
   710   /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
   711   ///
   712   /// The simplest way of using this map is through the convertMap()
   713   /// function.
   714   template <typename M, typename V>
   715   class ConvertMap : public MapBase<typename M::Key, V> {
   716     const M &_m;
   717   public:
   718     ///\e
   719     typedef typename M::Key Key;
   720     ///\e
   721     typedef V Value;
   722 
   723     /// Constructor
   724 
   725     /// Constructor.
   726     /// \param m The underlying map.
   727     ConvertMap(const M &m) : _m(m) {}
   728 
   729     ///\e
   730     Value operator[](const Key &k) const { return _m[k]; }
   731   };
   732 
   733   /// Returns a \c ConvertMap class
   734 
   735   /// This function just returns a \c ConvertMap class.
   736   /// \relates ConvertMap
   737   template<typename V, typename M>
   738   inline ConvertMap<M, V> convertMap(const M &map) {
   739     return ConvertMap<M, V>(map);
   740   }
   741 
   742 
   743   /// Applies all map setting operations to two maps
   744 
   745   /// This map has two \ref concepts::WriteMap "writable map" parameters
   746   /// and each write request will be passed to both of them.
   747   /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
   748   /// operations will return the corresponding values of \c M1.
   749   ///
   750   /// The \c Key and \c Value types are inherited from \c M1.
   751   /// The \c Key and \c Value of \c M2 must be convertible from those
   752   /// of \c M1.
   753   ///
   754   /// The simplest way of using this map is through the forkMap()
   755   /// function.
   756   template<typename  M1, typename M2>
   757   class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
   758     M1 &_m1;
   759     M2 &_m2;
   760   public:
   761     ///\e
   762     typedef typename M1::Key Key;
   763     ///\e
   764     typedef typename M1::Value Value;
   765 
   766     /// Constructor
   767     ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
   768     /// Returns the value associated with the given key in the first map.
   769     Value operator[](const Key &k) const { return _m1[k]; }
   770     /// Sets the value associated with the given key in both maps.
   771     void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
   772   };
   773 
   774   /// Returns a \c ForkMap class
   775 
   776   /// This function just returns a \c ForkMap class.
   777   /// \relates ForkMap
   778   template <typename M1, typename M2>
   779   inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
   780     return ForkMap<M1,M2>(m1,m2);
   781   }
   782 
   783 
   784   /// Sum of two maps
   785 
   786   /// This \ref concepts::ReadMap "read-only map" returns the sum
   787   /// of the values of the two given maps.
   788   /// Its \c Key and \c Value types are inherited from \c M1.
   789   /// The \c Key and \c Value of \c M2 must be convertible to those of
   790   /// \c M1.
   791   ///
   792   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
   793   /// \code
   794   ///   AddMap<M1,M2> am(m1,m2);
   795   /// \endcode
   796   /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
   797   ///
   798   /// The simplest way of using this map is through the addMap()
   799   /// function.
   800   ///
   801   /// \sa SubMap, MulMap, DivMap
   802   /// \sa ShiftMap, ShiftWriteMap
   803   template<typename M1, typename M2>
   804   class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
   805     const M1 &_m1;
   806     const M2 &_m2;
   807   public:
   808     ///\e
   809     typedef typename M1::Key Key;
   810     ///\e
   811     typedef typename M1::Value Value;
   812 
   813     /// Constructor
   814     AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
   815     ///\e
   816     Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
   817   };
   818 
   819   /// Returns an \c AddMap class
   820 
   821   /// This function just returns an \c AddMap class.
   822   ///
   823   /// For example, if \c m1 and \c m2 are both maps with \c double
   824   /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
   825   /// <tt>m1[x]+m2[x]</tt>.
   826   ///
   827   /// \relates AddMap
   828   template<typename M1, typename M2>
   829   inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
   830     return AddMap<M1, M2>(m1,m2);
   831   }
   832 
   833 
   834   /// Difference of two maps
   835 
   836   /// This \ref concepts::ReadMap "read-only map" returns the difference
   837   /// of the values of the two given maps.
   838   /// Its \c Key and \c Value types are inherited from \c M1.
   839   /// The \c Key and \c Value of \c M2 must be convertible to those of
   840   /// \c M1.
   841   ///
   842   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
   843   /// \code
   844   ///   SubMap<M1,M2> sm(m1,m2);
   845   /// \endcode
   846   /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
   847   ///
   848   /// The simplest way of using this map is through the subMap()
   849   /// function.
   850   ///
   851   /// \sa AddMap, MulMap, DivMap
   852   template<typename M1, typename M2>
   853   class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
   854     const M1 &_m1;
   855     const M2 &_m2;
   856   public:
   857     ///\e
   858     typedef typename M1::Key Key;
   859     ///\e
   860     typedef typename M1::Value Value;
   861 
   862     /// Constructor
   863     SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
   864     ///\e
   865     Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
   866   };
   867 
   868   /// Returns a \c SubMap class
   869 
   870   /// This function just returns a \c SubMap class.
   871   ///
   872   /// For example, if \c m1 and \c m2 are both maps with \c double
   873   /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
   874   /// <tt>m1[x]-m2[x]</tt>.
   875   ///
   876   /// \relates SubMap
   877   template<typename M1, typename M2>
   878   inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
   879     return SubMap<M1, M2>(m1,m2);
   880   }
   881 
   882 
   883   /// Product of two maps
   884 
   885   /// This \ref concepts::ReadMap "read-only map" returns the product
   886   /// of the values of the two given maps.
   887   /// Its \c Key and \c Value types are inherited from \c M1.
   888   /// The \c Key and \c Value of \c M2 must be convertible to those of
   889   /// \c M1.
   890   ///
   891   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
   892   /// \code
   893   ///   MulMap<M1,M2> mm(m1,m2);
   894   /// \endcode
   895   /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
   896   ///
   897   /// The simplest way of using this map is through the mulMap()
   898   /// function.
   899   ///
   900   /// \sa AddMap, SubMap, DivMap
   901   /// \sa ScaleMap, ScaleWriteMap
   902   template<typename M1, typename M2>
   903   class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
   904     const M1 &_m1;
   905     const M2 &_m2;
   906   public:
   907     ///\e
   908     typedef typename M1::Key Key;
   909     ///\e
   910     typedef typename M1::Value Value;
   911 
   912     /// Constructor
   913     MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
   914     ///\e
   915     Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
   916   };
   917 
   918   /// Returns a \c MulMap class
   919 
   920   /// This function just returns a \c MulMap class.
   921   ///
   922   /// For example, if \c m1 and \c m2 are both maps with \c double
   923   /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
   924   /// <tt>m1[x]*m2[x]</tt>.
   925   ///
   926   /// \relates MulMap
   927   template<typename M1, typename M2>
   928   inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
   929     return MulMap<M1, M2>(m1,m2);
   930   }
   931 
   932 
   933   /// Quotient of two maps
   934 
   935   /// This \ref concepts::ReadMap "read-only map" returns the quotient
   936   /// of the values of the two given maps.
   937   /// Its \c Key and \c Value types are inherited from \c M1.
   938   /// The \c Key and \c Value of \c M2 must be convertible to those of
   939   /// \c M1.
   940   ///
   941   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
   942   /// \code
   943   ///   DivMap<M1,M2> dm(m1,m2);
   944   /// \endcode
   945   /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
   946   ///
   947   /// The simplest way of using this map is through the divMap()
   948   /// function.
   949   ///
   950   /// \sa AddMap, SubMap, MulMap
   951   template<typename M1, typename M2>
   952   class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
   953     const M1 &_m1;
   954     const M2 &_m2;
   955   public:
   956     ///\e
   957     typedef typename M1::Key Key;
   958     ///\e
   959     typedef typename M1::Value Value;
   960 
   961     /// Constructor
   962     DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
   963     ///\e
   964     Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
   965   };
   966 
   967   /// Returns a \c DivMap class
   968 
   969   /// This function just returns a \c DivMap class.
   970   ///
   971   /// For example, if \c m1 and \c m2 are both maps with \c double
   972   /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
   973   /// <tt>m1[x]/m2[x]</tt>.
   974   ///
   975   /// \relates DivMap
   976   template<typename M1, typename M2>
   977   inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
   978     return DivMap<M1, M2>(m1,m2);
   979   }
   980 
   981 
   982   /// Shifts a map with a constant.
   983 
   984   /// This \ref concepts::ReadMap "read-only map" returns the sum of
   985   /// the given map and a constant value (i.e. it shifts the map with
   986   /// the constant). Its \c Key and \c Value are inherited from \c M.
   987   ///
   988   /// Actually,
   989   /// \code
   990   ///   ShiftMap<M> sh(m,v);
   991   /// \endcode
   992   /// is equivalent to
   993   /// \code
   994   ///   ConstMap<M::Key, M::Value> cm(v);
   995   ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
   996   /// \endcode
   997   ///
   998   /// The simplest way of using this map is through the shiftMap()
   999   /// function.
  1000   ///
  1001   /// \sa ShiftWriteMap
  1002   template<typename M, typename C = typename M::Value>
  1003   class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
  1004     const M &_m;
  1005     C _v;
  1006   public:
  1007     ///\e
  1008     typedef typename M::Key Key;
  1009     ///\e
  1010     typedef typename M::Value Value;
  1011 
  1012     /// Constructor
  1013 
  1014     /// Constructor.
  1015     /// \param m The undelying map.
  1016     /// \param v The constant value.
  1017     ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
  1018     ///\e
  1019     Value operator[](const Key &k) const { return _m[k]+_v; }
  1020   };
  1021 
  1022   /// Shifts a map with a constant (read-write version).
  1023 
  1024   /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
  1025   /// of the given map and a constant value (i.e. it shifts the map with
  1026   /// the constant). Its \c Key and \c Value are inherited from \c M.
  1027   /// It makes also possible to write the map.
  1028   ///
  1029   /// The simplest way of using this map is through the shiftWriteMap()
  1030   /// function.
  1031   ///
  1032   /// \sa ShiftMap
  1033   template<typename M, typename C = typename M::Value>
  1034   class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
  1035     M &_m;
  1036     C _v;
  1037   public:
  1038     ///\e
  1039     typedef typename M::Key Key;
  1040     ///\e
  1041     typedef typename M::Value Value;
  1042 
  1043     /// Constructor
  1044 
  1045     /// Constructor.
  1046     /// \param m The undelying map.
  1047     /// \param v The constant value.
  1048     ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
  1049     ///\e
  1050     Value operator[](const Key &k) const { return _m[k]+_v; }
  1051     ///\e
  1052     void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
  1053   };
  1054 
  1055   /// Returns a \c ShiftMap class
  1056 
  1057   /// This function just returns a \c ShiftMap class.
  1058   ///
  1059   /// For example, if \c m is a map with \c double values and \c v is
  1060   /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
  1061   /// <tt>m[x]+v</tt>.
  1062   ///
  1063   /// \relates ShiftMap
  1064   template<typename M, typename C>
  1065   inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
  1066     return ShiftMap<M, C>(m,v);
  1067   }
  1068 
  1069   /// Returns a \c ShiftWriteMap class
  1070 
  1071   /// This function just returns a \c ShiftWriteMap class.
  1072   ///
  1073   /// For example, if \c m is a map with \c double values and \c v is
  1074   /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
  1075   /// <tt>m[x]+v</tt>.
  1076   /// Moreover it makes also possible to write the map.
  1077   ///
  1078   /// \relates ShiftWriteMap
  1079   template<typename M, typename C>
  1080   inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
  1081     return ShiftWriteMap<M, C>(m,v);
  1082   }
  1083 
  1084 
  1085   /// Scales a map with a constant.
  1086 
  1087   /// This \ref concepts::ReadMap "read-only map" returns the value of
  1088   /// the given map multiplied from the left side with a constant value.
  1089   /// Its \c Key and \c Value are inherited from \c M.
  1090   ///
  1091   /// Actually,
  1092   /// \code
  1093   ///   ScaleMap<M> sc(m,v);
  1094   /// \endcode
  1095   /// is equivalent to
  1096   /// \code
  1097   ///   ConstMap<M::Key, M::Value> cm(v);
  1098   ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
  1099   /// \endcode
  1100   ///
  1101   /// The simplest way of using this map is through the scaleMap()
  1102   /// function.
  1103   ///
  1104   /// \sa ScaleWriteMap
  1105   template<typename M, typename C = typename M::Value>
  1106   class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
  1107     const M &_m;
  1108     C _v;
  1109   public:
  1110     ///\e
  1111     typedef typename M::Key Key;
  1112     ///\e
  1113     typedef typename M::Value Value;
  1114 
  1115     /// Constructor
  1116 
  1117     /// Constructor.
  1118     /// \param m The undelying map.
  1119     /// \param v The constant value.
  1120     ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
  1121     ///\e
  1122     Value operator[](const Key &k) const { return _v*_m[k]; }
  1123   };
  1124 
  1125   /// Scales a map with a constant (read-write version).
  1126 
  1127   /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
  1128   /// the given map multiplied from the left side with a constant value.
  1129   /// Its \c Key and \c Value are inherited from \c M.
  1130   /// It can also be used as write map if the \c / operator is defined
  1131   /// between \c Value and \c C and the given multiplier is not zero.
  1132   ///
  1133   /// The simplest way of using this map is through the scaleWriteMap()
  1134   /// function.
  1135   ///
  1136   /// \sa ScaleMap
  1137   template<typename M, typename C = typename M::Value>
  1138   class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
  1139     M &_m;
  1140     C _v;
  1141   public:
  1142     ///\e
  1143     typedef typename M::Key Key;
  1144     ///\e
  1145     typedef typename M::Value Value;
  1146 
  1147     /// Constructor
  1148 
  1149     /// Constructor.
  1150     /// \param m The undelying map.
  1151     /// \param v The constant value.
  1152     ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
  1153     ///\e
  1154     Value operator[](const Key &k) const { return _v*_m[k]; }
  1155     ///\e
  1156     void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
  1157   };
  1158 
  1159   /// Returns a \c ScaleMap class
  1160 
  1161   /// This function just returns a \c ScaleMap class.
  1162   ///
  1163   /// For example, if \c m is a map with \c double values and \c v is
  1164   /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
  1165   /// <tt>v*m[x]</tt>.
  1166   ///
  1167   /// \relates ScaleMap
  1168   template<typename M, typename C>
  1169   inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
  1170     return ScaleMap<M, C>(m,v);
  1171   }
  1172 
  1173   /// Returns a \c ScaleWriteMap class
  1174 
  1175   /// This function just returns a \c ScaleWriteMap class.
  1176   ///
  1177   /// For example, if \c m is a map with \c double values and \c v is
  1178   /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
  1179   /// <tt>v*m[x]</tt>.
  1180   /// Moreover it makes also possible to write the map.
  1181   ///
  1182   /// \relates ScaleWriteMap
  1183   template<typename M, typename C>
  1184   inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
  1185     return ScaleWriteMap<M, C>(m,v);
  1186   }
  1187 
  1188 
  1189   /// Negative of a map
  1190 
  1191   /// This \ref concepts::ReadMap "read-only map" returns the negative
  1192   /// of the values of the given map (using the unary \c - operator).
  1193   /// Its \c Key and \c Value are inherited from \c M.
  1194   ///
  1195   /// If M::Value is \c int, \c double etc., then
  1196   /// \code
  1197   ///   NegMap<M> neg(m);
  1198   /// \endcode
  1199   /// is equivalent to
  1200   /// \code
  1201   ///   ScaleMap<M> neg(m,-1);
  1202   /// \endcode
  1203   ///
  1204   /// The simplest way of using this map is through the negMap()
  1205   /// function.
  1206   ///
  1207   /// \sa NegWriteMap
  1208   template<typename M>
  1209   class NegMap : public MapBase<typename M::Key, typename M::Value> {
  1210     const M& _m;
  1211   public:
  1212     ///\e
  1213     typedef typename M::Key Key;
  1214     ///\e
  1215     typedef typename M::Value Value;
  1216 
  1217     /// Constructor
  1218     NegMap(const M &m) : _m(m) {}
  1219     ///\e
  1220     Value operator[](const Key &k) const { return -_m[k]; }
  1221   };
  1222 
  1223   /// Negative of a map (read-write version)
  1224 
  1225   /// This \ref concepts::ReadWriteMap "read-write map" returns the
  1226   /// negative of the values of the given map (using the unary \c -
  1227   /// operator).
  1228   /// Its \c Key and \c Value are inherited from \c M.
  1229   /// It makes also possible to write the map.
  1230   ///
  1231   /// If M::Value is \c int, \c double etc., then
  1232   /// \code
  1233   ///   NegWriteMap<M> neg(m);
  1234   /// \endcode
  1235   /// is equivalent to
  1236   /// \code
  1237   ///   ScaleWriteMap<M> neg(m,-1);
  1238   /// \endcode
  1239   ///
  1240   /// The simplest way of using this map is through the negWriteMap()
  1241   /// function.
  1242   ///
  1243   /// \sa NegMap
  1244   template<typename M>
  1245   class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
  1246     M &_m;
  1247   public:
  1248     ///\e
  1249     typedef typename M::Key Key;
  1250     ///\e
  1251     typedef typename M::Value Value;
  1252 
  1253     /// Constructor
  1254     NegWriteMap(M &m) : _m(m) {}
  1255     ///\e
  1256     Value operator[](const Key &k) const { return -_m[k]; }
  1257     ///\e
  1258     void set(const Key &k, const Value &v) { _m.set(k, -v); }
  1259   };
  1260 
  1261   /// Returns a \c NegMap class
  1262 
  1263   /// This function just returns a \c NegMap class.
  1264   ///
  1265   /// For example, if \c m is a map with \c double values, then
  1266   /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
  1267   ///
  1268   /// \relates NegMap
  1269   template <typename M>
  1270   inline NegMap<M> negMap(const M &m) {
  1271     return NegMap<M>(m);
  1272   }
  1273 
  1274   /// Returns a \c NegWriteMap class
  1275 
  1276   /// This function just returns a \c NegWriteMap class.
  1277   ///
  1278   /// For example, if \c m is a map with \c double values, then
  1279   /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
  1280   /// Moreover it makes also possible to write the map.
  1281   ///
  1282   /// \relates NegWriteMap
  1283   template <typename M>
  1284   inline NegWriteMap<M> negWriteMap(M &m) {
  1285     return NegWriteMap<M>(m);
  1286   }
  1287 
  1288 
  1289   /// Absolute value of a map
  1290 
  1291   /// This \ref concepts::ReadMap "read-only map" returns the absolute
  1292   /// value of the values of the given map.
  1293   /// Its \c Key and \c Value are inherited from \c M.
  1294   /// \c Value must be comparable to \c 0 and the unary \c -
  1295   /// operator must be defined for it, of course.
  1296   ///
  1297   /// The simplest way of using this map is through the absMap()
  1298   /// function.
  1299   template<typename M>
  1300   class AbsMap : public MapBase<typename M::Key, typename M::Value> {
  1301     const M &_m;
  1302   public:
  1303     ///\e
  1304     typedef typename M::Key Key;
  1305     ///\e
  1306     typedef typename M::Value Value;
  1307 
  1308     /// Constructor
  1309     AbsMap(const M &m) : _m(m) {}
  1310     ///\e
  1311     Value operator[](const Key &k) const {
  1312       Value tmp = _m[k];
  1313       return tmp >= 0 ? tmp : -tmp;
  1314     }
  1315 
  1316   };
  1317 
  1318   /// Returns an \c AbsMap class
  1319 
  1320   /// This function just returns an \c AbsMap class.
  1321   ///
  1322   /// For example, if \c m is a map with \c double values, then
  1323   /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
  1324   /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
  1325   /// negative.
  1326   ///
  1327   /// \relates AbsMap
  1328   template<typename M>
  1329   inline AbsMap<M> absMap(const M &m) {
  1330     return AbsMap<M>(m);
  1331   }
  1332 
  1333   /// @}
  1334 
  1335   // Logical maps and map adaptors:
  1336 
  1337   /// \addtogroup maps
  1338   /// @{
  1339 
  1340   /// Constant \c true map.
  1341 
  1342   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
  1343   /// each key.
  1344   ///
  1345   /// Note that
  1346   /// \code
  1347   ///   TrueMap<K> tm;
  1348   /// \endcode
  1349   /// is equivalent to
  1350   /// \code
  1351   ///   ConstMap<K,bool> tm(true);
  1352   /// \endcode
  1353   ///
  1354   /// \sa FalseMap
  1355   /// \sa ConstMap
  1356   template <typename K>
  1357   class TrueMap : public MapBase<K, bool> {
  1358   public:
  1359     ///\e
  1360     typedef K Key;
  1361     ///\e
  1362     typedef bool Value;
  1363 
  1364     /// Gives back \c true.
  1365     Value operator[](const Key&) const { return true; }
  1366   };
  1367 
  1368   /// Returns a \c TrueMap class
  1369 
  1370   /// This function just returns a \c TrueMap class.
  1371   /// \relates TrueMap
  1372   template<typename K>
  1373   inline TrueMap<K> trueMap() {
  1374     return TrueMap<K>();
  1375   }
  1376 
  1377 
  1378   /// Constant \c false map.
  1379 
  1380   /// This \ref concepts::ReadMap "read-only map" assigns \c false to
  1381   /// each key.
  1382   ///
  1383   /// Note that
  1384   /// \code
  1385   ///   FalseMap<K> fm;
  1386   /// \endcode
  1387   /// is equivalent to
  1388   /// \code
  1389   ///   ConstMap<K,bool> fm(false);
  1390   /// \endcode
  1391   ///
  1392   /// \sa TrueMap
  1393   /// \sa ConstMap
  1394   template <typename K>
  1395   class FalseMap : public MapBase<K, bool> {
  1396   public:
  1397     ///\e
  1398     typedef K Key;
  1399     ///\e
  1400     typedef bool Value;
  1401 
  1402     /// Gives back \c false.
  1403     Value operator[](const Key&) const { return false; }
  1404   };
  1405 
  1406   /// Returns a \c FalseMap class
  1407 
  1408   /// This function just returns a \c FalseMap class.
  1409   /// \relates FalseMap
  1410   template<typename K>
  1411   inline FalseMap<K> falseMap() {
  1412     return FalseMap<K>();
  1413   }
  1414 
  1415   /// @}
  1416 
  1417   /// \addtogroup map_adaptors
  1418   /// @{
  1419 
  1420   /// Logical 'and' of two maps
  1421 
  1422   /// This \ref concepts::ReadMap "read-only map" returns the logical
  1423   /// 'and' of the values of the two given maps.
  1424   /// Its \c Key type is inherited from \c M1 and its \c Value type is
  1425   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
  1426   ///
  1427   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
  1428   /// \code
  1429   ///   AndMap<M1,M2> am(m1,m2);
  1430   /// \endcode
  1431   /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
  1432   ///
  1433   /// The simplest way of using this map is through the andMap()
  1434   /// function.
  1435   ///
  1436   /// \sa OrMap
  1437   /// \sa NotMap, NotWriteMap
  1438   template<typename M1, typename M2>
  1439   class AndMap : public MapBase<typename M1::Key, bool> {
  1440     const M1 &_m1;
  1441     const M2 &_m2;
  1442   public:
  1443     ///\e
  1444     typedef typename M1::Key Key;
  1445     ///\e
  1446     typedef bool Value;
  1447 
  1448     /// Constructor
  1449     AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
  1450     ///\e
  1451     Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
  1452   };
  1453 
  1454   /// Returns an \c AndMap class
  1455 
  1456   /// This function just returns an \c AndMap class.
  1457   ///
  1458   /// For example, if \c m1 and \c m2 are both maps with \c bool values,
  1459   /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
  1460   /// <tt>m1[x]&&m2[x]</tt>.
  1461   ///
  1462   /// \relates AndMap
  1463   template<typename M1, typename M2>
  1464   inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
  1465     return AndMap<M1, M2>(m1,m2);
  1466   }
  1467 
  1468 
  1469   /// Logical 'or' of two maps
  1470 
  1471   /// This \ref concepts::ReadMap "read-only map" returns the logical
  1472   /// 'or' of the values of the two given maps.
  1473   /// Its \c Key type is inherited from \c M1 and its \c Value type is
  1474   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
  1475   ///
  1476   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
  1477   /// \code
  1478   ///   OrMap<M1,M2> om(m1,m2);
  1479   /// \endcode
  1480   /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
  1481   ///
  1482   /// The simplest way of using this map is through the orMap()
  1483   /// function.
  1484   ///
  1485   /// \sa AndMap
  1486   /// \sa NotMap, NotWriteMap
  1487   template<typename M1, typename M2>
  1488   class OrMap : public MapBase<typename M1::Key, bool> {
  1489     const M1 &_m1;
  1490     const M2 &_m2;
  1491   public:
  1492     ///\e
  1493     typedef typename M1::Key Key;
  1494     ///\e
  1495     typedef bool Value;
  1496 
  1497     /// Constructor
  1498     OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
  1499     ///\e
  1500     Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
  1501   };
  1502 
  1503   /// Returns an \c OrMap class
  1504 
  1505   /// This function just returns an \c OrMap class.
  1506   ///
  1507   /// For example, if \c m1 and \c m2 are both maps with \c bool values,
  1508   /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
  1509   /// <tt>m1[x]||m2[x]</tt>.
  1510   ///
  1511   /// \relates OrMap
  1512   template<typename M1, typename M2>
  1513   inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
  1514     return OrMap<M1, M2>(m1,m2);
  1515   }
  1516 
  1517 
  1518   /// Logical 'not' of a map
  1519 
  1520   /// This \ref concepts::ReadMap "read-only map" returns the logical
  1521   /// negation of the values of the given map.
  1522   /// Its \c Key is inherited from \c M and its \c Value is \c bool.
  1523   ///
  1524   /// The simplest way of using this map is through the notMap()
  1525   /// function.
  1526   ///
  1527   /// \sa NotWriteMap
  1528   template <typename M>
  1529   class NotMap : public MapBase<typename M::Key, bool> {
  1530     const M &_m;
  1531   public:
  1532     ///\e
  1533     typedef typename M::Key Key;
  1534     ///\e
  1535     typedef bool Value;
  1536 
  1537     /// Constructor
  1538     NotMap(const M &m) : _m(m) {}
  1539     ///\e
  1540     Value operator[](const Key &k) const { return !_m[k]; }
  1541   };
  1542 
  1543   /// Logical 'not' of a map (read-write version)
  1544 
  1545   /// This \ref concepts::ReadWriteMap "read-write map" returns the
  1546   /// logical negation of the values of the given map.
  1547   /// Its \c Key is inherited from \c M and its \c Value is \c bool.
  1548   /// It makes also possible to write the map. When a value is set,
  1549   /// the opposite value is set to the original map.
  1550   ///
  1551   /// The simplest way of using this map is through the notWriteMap()
  1552   /// function.
  1553   ///
  1554   /// \sa NotMap
  1555   template <typename M>
  1556   class NotWriteMap : public MapBase<typename M::Key, bool> {
  1557     M &_m;
  1558   public:
  1559     ///\e
  1560     typedef typename M::Key Key;
  1561     ///\e
  1562     typedef bool Value;
  1563 
  1564     /// Constructor
  1565     NotWriteMap(M &m) : _m(m) {}
  1566     ///\e
  1567     Value operator[](const Key &k) const { return !_m[k]; }
  1568     ///\e
  1569     void set(const Key &k, bool v) { _m.set(k, !v); }
  1570   };
  1571 
  1572   /// Returns a \c NotMap class
  1573 
  1574   /// This function just returns a \c NotMap class.
  1575   ///
  1576   /// For example, if \c m is a map with \c bool values, then
  1577   /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
  1578   ///
  1579   /// \relates NotMap
  1580   template <typename M>
  1581   inline NotMap<M> notMap(const M &m) {
  1582     return NotMap<M>(m);
  1583   }
  1584 
  1585   /// Returns a \c NotWriteMap class
  1586 
  1587   /// This function just returns a \c NotWriteMap class.
  1588   ///
  1589   /// For example, if \c m is a map with \c bool values, then
  1590   /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
  1591   /// Moreover it makes also possible to write the map.
  1592   ///
  1593   /// \relates NotWriteMap
  1594   template <typename M>
  1595   inline NotWriteMap<M> notWriteMap(M &m) {
  1596     return NotWriteMap<M>(m);
  1597   }
  1598 
  1599 
  1600   /// Combination of two maps using the \c == operator
  1601 
  1602   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
  1603   /// the keys for which the corresponding values of the two maps are
  1604   /// equal.
  1605   /// Its \c Key type is inherited from \c M1 and its \c Value type is
  1606   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
  1607   ///
  1608   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
  1609   /// \code
  1610   ///   EqualMap<M1,M2> em(m1,m2);
  1611   /// \endcode
  1612   /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
  1613   ///
  1614   /// The simplest way of using this map is through the equalMap()
  1615   /// function.
  1616   ///
  1617   /// \sa LessMap
  1618   template<typename M1, typename M2>
  1619   class EqualMap : public MapBase<typename M1::Key, bool> {
  1620     const M1 &_m1;
  1621     const M2 &_m2;
  1622   public:
  1623     ///\e
  1624     typedef typename M1::Key Key;
  1625     ///\e
  1626     typedef bool Value;
  1627 
  1628     /// Constructor
  1629     EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
  1630     ///\e
  1631     Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
  1632   };
  1633 
  1634   /// Returns an \c EqualMap class
  1635 
  1636   /// This function just returns an \c EqualMap class.
  1637   ///
  1638   /// For example, if \c m1 and \c m2 are maps with keys and values of
  1639   /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
  1640   /// <tt>m1[x]==m2[x]</tt>.
  1641   ///
  1642   /// \relates EqualMap
  1643   template<typename M1, typename M2>
  1644   inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
  1645     return EqualMap<M1, M2>(m1,m2);
  1646   }
  1647 
  1648 
  1649   /// Combination of two maps using the \c < operator
  1650 
  1651   /// This \ref concepts::ReadMap "read-only map" assigns \c true to
  1652   /// the keys for which the corresponding value of the first map is
  1653   /// less then the value of the second map.
  1654   /// Its \c Key type is inherited from \c M1 and its \c Value type is
  1655   /// \c bool. \c M2::Key must be convertible to \c M1::Key.
  1656   ///
  1657   /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
  1658   /// \code
  1659   ///   LessMap<M1,M2> lm(m1,m2);
  1660   /// \endcode
  1661   /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
  1662   ///
  1663   /// The simplest way of using this map is through the lessMap()
  1664   /// function.
  1665   ///
  1666   /// \sa EqualMap
  1667   template<typename M1, typename M2>
  1668   class LessMap : public MapBase<typename M1::Key, bool> {
  1669     const M1 &_m1;
  1670     const M2 &_m2;
  1671   public:
  1672     ///\e
  1673     typedef typename M1::Key Key;
  1674     ///\e
  1675     typedef bool Value;
  1676 
  1677     /// Constructor
  1678     LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
  1679     ///\e
  1680     Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
  1681   };
  1682 
  1683   /// Returns an \c LessMap class
  1684 
  1685   /// This function just returns an \c LessMap class.
  1686   ///
  1687   /// For example, if \c m1 and \c m2 are maps with keys and values of
  1688   /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
  1689   /// <tt>m1[x]<m2[x]</tt>.
  1690   ///
  1691   /// \relates LessMap
  1692   template<typename M1, typename M2>
  1693   inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
  1694     return LessMap<M1, M2>(m1,m2);
  1695   }
  1696 
  1697   namespace _maps_bits {
  1698 
  1699     template <typename _Iterator, typename Enable = void>
  1700     struct IteratorTraits {
  1701       typedef typename std::iterator_traits<_Iterator>::value_type Value;
  1702     };
  1703 
  1704     template <typename _Iterator>
  1705     struct IteratorTraits<_Iterator,
  1706       typename exists<typename _Iterator::container_type>::type>
  1707     {
  1708       typedef typename _Iterator::container_type::value_type Value;
  1709     };
  1710 
  1711   }
  1712 
  1713   /// @}
  1714 
  1715   /// \addtogroup maps
  1716   /// @{
  1717 
  1718   /// \brief Writable bool map for logging each \c true assigned element
  1719   ///
  1720   /// A \ref concepts::WriteMap "writable" bool map for logging
  1721   /// each \c true assigned element, i.e it copies subsequently each
  1722   /// keys set to \c true to the given iterator.
  1723   /// The most important usage of it is storing certain nodes or arcs
  1724   /// that were marked \c true by an algorithm.
  1725   ///
  1726   /// There are several algorithms that provide solutions through bool
  1727   /// maps and most of them assign \c true at most once for each key.
  1728   /// In these cases it is a natural request to store each \c true
  1729   /// assigned elements (in order of the assignment), which can be
  1730   /// easily done with LoggerBoolMap.
  1731   ///
  1732   /// The simplest way of using this map is through the loggerBoolMap()
  1733   /// function.
  1734   ///
  1735   /// \tparam IT The type of the iterator.
  1736   /// \tparam KEY The key type of the map. The default value set
  1737   /// according to the iterator type should work in most cases.
  1738   ///
  1739   /// \note The container of the iterator must contain enough space
  1740   /// for the elements or the iterator should be an inserter iterator.
  1741 #ifdef DOXYGEN
  1742   template <typename IT, typename KEY>
  1743 #else
  1744   template <typename IT,
  1745             typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
  1746 #endif
  1747   class LoggerBoolMap : public MapBase<KEY, bool> {
  1748   public:
  1749 
  1750     ///\e
  1751     typedef KEY Key;
  1752     ///\e
  1753     typedef bool Value;
  1754     ///\e
  1755     typedef IT Iterator;
  1756 
  1757     /// Constructor
  1758     LoggerBoolMap(Iterator it)
  1759       : _begin(it), _end(it) {}
  1760 
  1761     /// Gives back the given iterator set for the first key
  1762     Iterator begin() const {
  1763       return _begin;
  1764     }
  1765 
  1766     /// Gives back the the 'after the last' iterator
  1767     Iterator end() const {
  1768       return _end;
  1769     }
  1770 
  1771     /// The set function of the map
  1772     void set(const Key& key, Value value) {
  1773       if (value) {
  1774         *_end++ = key;
  1775       }
  1776     }
  1777 
  1778   private:
  1779     Iterator _begin;
  1780     Iterator _end;
  1781   };
  1782 
  1783   /// Returns a \c LoggerBoolMap class
  1784 
  1785   /// This function just returns a \c LoggerBoolMap class.
  1786   ///
  1787   /// The most important usage of it is storing certain nodes or arcs
  1788   /// that were marked \c true by an algorithm.
  1789   /// For example it makes easier to store the nodes in the processing
  1790   /// order of Dfs algorithm, as the following examples show.
  1791   /// \code
  1792   ///   std::vector<Node> v;
  1793   ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
  1794   /// \endcode
  1795   /// \code
  1796   ///   std::vector<Node> v(countNodes(g));
  1797   ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
  1798   /// \endcode
  1799   ///
  1800   /// \note The container of the iterator must contain enough space
  1801   /// for the elements or the iterator should be an inserter iterator.
  1802   ///
  1803   /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
  1804   /// it cannot be used when a readable map is needed, for example as
  1805   /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
  1806   ///
  1807   /// \relates LoggerBoolMap
  1808   template<typename Iterator>
  1809   inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
  1810     return LoggerBoolMap<Iterator>(it);
  1811   }
  1812 
  1813   /// @}
  1814 
  1815   /// \addtogroup graph_maps
  1816   /// @{
  1817 
  1818   /// \brief Provides an immutable and unique id for each item in a graph.
  1819   ///
  1820   /// IdMap provides a unique and immutable id for each item of the
  1821   /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
  1822   ///  - \b unique: different items get different ids,
  1823   ///  - \b immutable: the id of an item does not change (even if you
  1824   ///    delete other nodes).
  1825   ///
  1826   /// Using this map you get access (i.e. can read) the inner id values of
  1827   /// the items stored in the graph, which is returned by the \c id()
  1828   /// function of the graph. This map can be inverted with its member
  1829   /// class \c InverseMap or with the \c operator() member.
  1830   ///
  1831   /// \tparam GR The graph type.
  1832   /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
  1833   /// \c GR::Edge).
  1834   ///
  1835   /// \see RangeIdMap
  1836   template <typename GR, typename K>
  1837   class IdMap : public MapBase<K, int> {
  1838   public:
  1839     /// The graph type of IdMap.
  1840     typedef GR Graph;
  1841     typedef GR Digraph;
  1842     /// The key type of IdMap (\c Node, \c Arc or \c Edge).
  1843     typedef K Item;
  1844     /// The key type of IdMap (\c Node, \c Arc or \c Edge).
  1845     typedef K Key;
  1846     /// The value type of IdMap.
  1847     typedef int Value;
  1848 
  1849     /// \brief Constructor.
  1850     ///
  1851     /// Constructor of the map.
  1852     explicit IdMap(const Graph& graph) : _graph(&graph) {}
  1853 
  1854     /// \brief Gives back the \e id of the item.
  1855     ///
  1856     /// Gives back the immutable and unique \e id of the item.
  1857     int operator[](const Item& item) const { return _graph->id(item);}
  1858 
  1859     /// \brief Gives back the \e item by its id.
  1860     ///
  1861     /// Gives back the \e item by its id.
  1862     Item operator()(int id) { return _graph->fromId(id, Item()); }
  1863 
  1864   private:
  1865     const Graph* _graph;
  1866 
  1867   public:
  1868 
  1869     /// \brief This class represents the inverse of its owner (IdMap).
  1870     ///
  1871     /// This class represents the inverse of its owner (IdMap).
  1872     /// \see inverse()
  1873     class InverseMap {
  1874     public:
  1875 
  1876       /// \brief Constructor.
  1877       ///
  1878       /// Constructor for creating an id-to-item map.
  1879       explicit InverseMap(const Graph& graph) : _graph(&graph) {}
  1880 
  1881       /// \brief Constructor.
  1882       ///
  1883       /// Constructor for creating an id-to-item map.
  1884       explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
  1885 
  1886       /// \brief Gives back the given item from its id.
  1887       ///
  1888       /// Gives back the given item from its id.
  1889       Item operator[](int id) const { return _graph->fromId(id, Item());}
  1890 
  1891     private:
  1892       const Graph* _graph;
  1893     };
  1894 
  1895     /// \brief Gives back the inverse of the map.
  1896     ///
  1897     /// Gives back the inverse of the IdMap.
  1898     InverseMap inverse() const { return InverseMap(*_graph);}
  1899   };
  1900 
  1901 
  1902   /// \brief General cross reference graph map type.
  1903 
  1904   /// This class provides simple invertable graph maps.
  1905   /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap"
  1906   /// and if a key is set to a new value then store it
  1907   /// in the inverse map.
  1908   ///
  1909   /// The values of the map can be accessed
  1910   /// with stl compatible forward iterator.
  1911   ///
  1912   /// \tparam GR The graph type.
  1913   /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
  1914   /// \c GR::Edge).
  1915   /// \tparam V The value type of the map.
  1916   ///
  1917   /// \see IterableValueMap
  1918   template <typename GR, typename K, typename V>
  1919   class CrossRefMap
  1920     : protected ItemSetTraits<GR, K>::template Map<V>::Type {
  1921   private:
  1922 
  1923     typedef typename ItemSetTraits<GR, K>::
  1924       template Map<V>::Type Map;
  1925 
  1926     typedef std::map<V, K> Container;
  1927     Container _inv_map;
  1928 
  1929   public:
  1930 
  1931     /// The graph type of CrossRefMap.
  1932     typedef GR Graph;
  1933     typedef GR Digraph;
  1934     /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
  1935     typedef K Item;
  1936     /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
  1937     typedef K Key;
  1938     /// The value type of CrossRefMap.
  1939     typedef V Value;
  1940 
  1941     /// \brief Constructor.
  1942     ///
  1943     /// Construct a new CrossRefMap for the given graph.
  1944     explicit CrossRefMap(const Graph& graph) : Map(graph) {}
  1945 
  1946     /// \brief Forward iterator for values.
  1947     ///
  1948     /// This iterator is an stl compatible forward
  1949     /// iterator on the values of the map. The values can
  1950     /// be accessed in the <tt>[beginValue, endValue)</tt> range.
  1951     class ValueIterator
  1952       : public std::iterator<std::forward_iterator_tag, Value> {
  1953       friend class CrossRefMap;
  1954     private:
  1955       ValueIterator(typename Container::const_iterator _it)
  1956         : it(_it) {}
  1957     public:
  1958 
  1959       ValueIterator() {}
  1960 
  1961       ValueIterator& operator++() { ++it; return *this; }
  1962       ValueIterator operator++(int) {
  1963         ValueIterator tmp(*this);
  1964         operator++();
  1965         return tmp;
  1966       }
  1967 
  1968       const Value& operator*() const { return it->first; }
  1969       const Value* operator->() const { return &(it->first); }
  1970 
  1971       bool operator==(ValueIterator jt) const { return it == jt.it; }
  1972       bool operator!=(ValueIterator jt) const { return it != jt.it; }
  1973 
  1974     private:
  1975       typename Container::const_iterator it;
  1976     };
  1977 
  1978     /// \brief Returns an iterator to the first value.
  1979     ///
  1980     /// Returns an stl compatible iterator to the
  1981     /// first value of the map. The values of the
  1982     /// map can be accessed in the <tt>[beginValue, endValue)</tt>
  1983     /// range.
  1984     ValueIterator beginValue() const {
  1985       return ValueIterator(_inv_map.begin());
  1986     }
  1987 
  1988     /// \brief Returns an iterator after the last value.
  1989     ///
  1990     /// Returns an stl compatible iterator after the
  1991     /// last value of the map. The values of the
  1992     /// map can be accessed in the <tt>[beginValue, endValue)</tt>
  1993     /// range.
  1994     ValueIterator endValue() const {
  1995       return ValueIterator(_inv_map.end());
  1996     }
  1997 
  1998     /// \brief Sets the value associated with the given key.
  1999     ///
  2000     /// Sets the value associated with the given key.
  2001     void set(const Key& key, const Value& val) {
  2002       Value oldval = Map::operator[](key);
  2003       typename Container::iterator it = _inv_map.find(oldval);
  2004       if (it != _inv_map.end() && it->second == key) {
  2005         _inv_map.erase(it);
  2006       }
  2007       _inv_map.insert(make_pair(val, key));
  2008       Map::set(key, val);
  2009     }
  2010 
  2011     /// \brief Returns the value associated with the given key.
  2012     ///
  2013     /// Returns the value associated with the given key.
  2014     typename MapTraits<Map>::ConstReturnValue
  2015     operator[](const Key& key) const {
  2016       return Map::operator[](key);
  2017     }
  2018 
  2019     /// \brief Gives back the item by its value.
  2020     ///
  2021     /// Gives back the item by its value.
  2022     Key operator()(const Value& key) const {
  2023       typename Container::const_iterator it = _inv_map.find(key);
  2024       return it != _inv_map.end() ? it->second : INVALID;
  2025     }
  2026 
  2027   protected:
  2028 
  2029     /// \brief Erase the key from the map and the inverse map.
  2030     ///
  2031     /// Erase the key from the map and the inverse map. It is called by the
  2032     /// \c AlterationNotifier.
  2033     virtual void erase(const Key& key) {
  2034       Value val = Map::operator[](key);
  2035       typename Container::iterator it = _inv_map.find(val);
  2036       if (it != _inv_map.end() && it->second == key) {
  2037         _inv_map.erase(it);
  2038       }
  2039       Map::erase(key);
  2040     }
  2041 
  2042     /// \brief Erase more keys from the map and the inverse map.
  2043     ///
  2044     /// Erase more keys from the map and the inverse map. It is called by the
  2045     /// \c AlterationNotifier.
  2046     virtual void erase(const std::vector<Key>& keys) {
  2047       for (int i = 0; i < int(keys.size()); ++i) {
  2048         Value val = Map::operator[](keys[i]);
  2049         typename Container::iterator it = _inv_map.find(val);
  2050         if (it != _inv_map.end() && it->second == keys[i]) {
  2051           _inv_map.erase(it);
  2052         }
  2053       }
  2054       Map::erase(keys);
  2055     }
  2056 
  2057     /// \brief Clear the keys from the map and the inverse map.
  2058     ///
  2059     /// Clear the keys from the map and the inverse map. It is called by the
  2060     /// \c AlterationNotifier.
  2061     virtual void clear() {
  2062       _inv_map.clear();
  2063       Map::clear();
  2064     }
  2065 
  2066   public:
  2067 
  2068     /// \brief The inverse map type.
  2069     ///
  2070     /// The inverse of this map. The subscript operator of the map
  2071     /// gives back the item that was last assigned to the value.
  2072     class InverseMap {
  2073     public:
  2074       /// \brief Constructor
  2075       ///
  2076       /// Constructor of the InverseMap.
  2077       explicit InverseMap(const CrossRefMap& inverted)
  2078         : _inverted(inverted) {}
  2079 
  2080       /// The value type of the InverseMap.
  2081       typedef typename CrossRefMap::Key Value;
  2082       /// The key type of the InverseMap.
  2083       typedef typename CrossRefMap::Value Key;
  2084 
  2085       /// \brief Subscript operator.
  2086       ///
  2087       /// Subscript operator. It gives back the item
  2088       /// that was last assigned to the given value.
  2089       Value operator[](const Key& key) const {
  2090         return _inverted(key);
  2091       }
  2092 
  2093     private:
  2094       const CrossRefMap& _inverted;
  2095     };
  2096 
  2097     /// \brief It gives back the read-only inverse map.
  2098     ///
  2099     /// It gives back the read-only inverse map.
  2100     InverseMap inverse() const {
  2101       return InverseMap(*this);
  2102     }
  2103 
  2104   };
  2105 
  2106   /// \brief Provides continuous and unique ID for the
  2107   /// items of a graph.
  2108   ///
  2109   /// RangeIdMap provides a unique and continuous
  2110   /// ID for each item of a given type (\c Node, \c Arc or
  2111   /// \c Edge) in a graph. This id is
  2112   ///  - \b unique: different items get different ids,
  2113   ///  - \b continuous: the range of the ids is the set of integers
  2114   ///    between 0 and \c n-1, where \c n is the number of the items of
  2115   ///    this type (\c Node, \c Arc or \c Edge).
  2116   ///  - So, the ids can change when deleting an item of the same type.
  2117   ///
  2118   /// Thus this id is not (necessarily) the same as what can get using
  2119   /// the \c id() function of the graph or \ref IdMap.
  2120   /// This map can be inverted with its member class \c InverseMap,
  2121   /// or with the \c operator() member.
  2122   ///
  2123   /// \tparam GR The graph type.
  2124   /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
  2125   /// \c GR::Edge).
  2126   ///
  2127   /// \see IdMap
  2128   template <typename GR, typename K>
  2129   class RangeIdMap
  2130     : protected ItemSetTraits<GR, K>::template Map<int>::Type {
  2131 
  2132     typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
  2133 
  2134   public:
  2135     /// The graph type of RangeIdMap.
  2136     typedef GR Graph;
  2137     typedef GR Digraph;
  2138     /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
  2139     typedef K Item;
  2140     /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
  2141     typedef K Key;
  2142     /// The value type of RangeIdMap.
  2143     typedef int Value;
  2144 
  2145     /// \brief Constructor.
  2146     ///
  2147     /// Constructor.
  2148     explicit RangeIdMap(const Graph& gr) : Map(gr) {
  2149       Item it;
  2150       const typename Map::Notifier* nf = Map::notifier();
  2151       for (nf->first(it); it != INVALID; nf->next(it)) {
  2152         Map::set(it, _inv_map.size());
  2153         _inv_map.push_back(it);
  2154       }
  2155     }
  2156 
  2157   protected:
  2158 
  2159     /// \brief Adds a new key to the map.
  2160     ///
  2161     /// Add a new key to the map. It is called by the
  2162     /// \c AlterationNotifier.
  2163     virtual void add(const Item& item) {
  2164       Map::add(item);
  2165       Map::set(item, _inv_map.size());
  2166       _inv_map.push_back(item);
  2167     }
  2168 
  2169     /// \brief Add more new keys to the map.
  2170     ///
  2171     /// Add more new keys to the map. It is called by the
  2172     /// \c AlterationNotifier.
  2173     virtual void add(const std::vector<Item>& items) {
  2174       Map::add(items);
  2175       for (int i = 0; i < int(items.size()); ++i) {
  2176         Map::set(items[i], _inv_map.size());
  2177         _inv_map.push_back(items[i]);
  2178       }
  2179     }
  2180 
  2181     /// \brief Erase the key from the map.
  2182     ///
  2183     /// Erase the key from the map. It is called by the
  2184     /// \c AlterationNotifier.
  2185     virtual void erase(const Item& item) {
  2186       Map::set(_inv_map.back(), Map::operator[](item));
  2187       _inv_map[Map::operator[](item)] = _inv_map.back();
  2188       _inv_map.pop_back();
  2189       Map::erase(item);
  2190     }
  2191 
  2192     /// \brief Erase more keys from the map.
  2193     ///
  2194     /// Erase more keys from the map. It is called by the
  2195     /// \c AlterationNotifier.
  2196     virtual void erase(const std::vector<Item>& items) {
  2197       for (int i = 0; i < int(items.size()); ++i) {
  2198         Map::set(_inv_map.back(), Map::operator[](items[i]));
  2199         _inv_map[Map::operator[](items[i])] = _inv_map.back();
  2200         _inv_map.pop_back();
  2201       }
  2202       Map::erase(items);
  2203     }
  2204 
  2205     /// \brief Build the unique map.
  2206     ///
  2207     /// Build the unique map. It is called by the
  2208     /// \c AlterationNotifier.
  2209     virtual void build() {
  2210       Map::build();
  2211       Item it;
  2212       const typename Map::Notifier* nf = Map::notifier();
  2213       for (nf->first(it); it != INVALID; nf->next(it)) {
  2214         Map::set(it, _inv_map.size());
  2215         _inv_map.push_back(it);
  2216       }
  2217     }
  2218 
  2219     /// \brief Clear the keys from the map.
  2220     ///
  2221     /// Clear the keys from the map. It is called by the
  2222     /// \c AlterationNotifier.
  2223     virtual void clear() {
  2224       _inv_map.clear();
  2225       Map::clear();
  2226     }
  2227 
  2228   public:
  2229 
  2230     /// \brief Returns the maximal value plus one.
  2231     ///
  2232     /// Returns the maximal value plus one in the map.
  2233     unsigned int size() const {
  2234       return _inv_map.size();
  2235     }
  2236 
  2237     /// \brief Swaps the position of the two items in the map.
  2238     ///
  2239     /// Swaps the position of the two items in the map.
  2240     void swap(const Item& p, const Item& q) {
  2241       int pi = Map::operator[](p);
  2242       int qi = Map::operator[](q);
  2243       Map::set(p, qi);
  2244       _inv_map[qi] = p;
  2245       Map::set(q, pi);
  2246       _inv_map[pi] = q;
  2247     }
  2248 
  2249     /// \brief Gives back the \e RangeId of the item
  2250     ///
  2251     /// Gives back the \e RangeId of the item.
  2252     int operator[](const Item& item) const {
  2253       return Map::operator[](item);
  2254     }
  2255 
  2256     /// \brief Gives back the item belonging to a \e RangeId
  2257     /// 
  2258     /// Gives back the item belonging to a \e RangeId.
  2259     Item operator()(int id) const {
  2260       return _inv_map[id];
  2261     }
  2262 
  2263   private:
  2264 
  2265     typedef std::vector<Item> Container;
  2266     Container _inv_map;
  2267 
  2268   public:
  2269 
  2270     /// \brief The inverse map type of RangeIdMap.
  2271     ///
  2272     /// The inverse map type of RangeIdMap.
  2273     class InverseMap {
  2274     public:
  2275       /// \brief Constructor
  2276       ///
  2277       /// Constructor of the InverseMap.
  2278       explicit InverseMap(const RangeIdMap& inverted)
  2279         : _inverted(inverted) {}
  2280 
  2281 
  2282       /// The value type of the InverseMap.
  2283       typedef typename RangeIdMap::Key Value;
  2284       /// The key type of the InverseMap.
  2285       typedef typename RangeIdMap::Value Key;
  2286 
  2287       /// \brief Subscript operator.
  2288       ///
  2289       /// Subscript operator. It gives back the item
  2290       /// that the descriptor currently belongs to.
  2291       Value operator[](const Key& key) const {
  2292         return _inverted(key);
  2293       }
  2294 
  2295       /// \brief Size of the map.
  2296       ///
  2297       /// Returns the size of the map.
  2298       unsigned int size() const {
  2299         return _inverted.size();
  2300       }
  2301 
  2302     private:
  2303       const RangeIdMap& _inverted;
  2304     };
  2305 
  2306     /// \brief Gives back the inverse of the map.
  2307     ///
  2308     /// Gives back the inverse of the map.
  2309     const InverseMap inverse() const {
  2310       return InverseMap(*this);
  2311     }
  2312   };
  2313 
  2314   /// \brief Map of the source nodes of arcs in a digraph.
  2315   ///
  2316   /// SourceMap provides access for the source node of each arc in a digraph,
  2317   /// which is returned by the \c source() function of the digraph.
  2318   /// \tparam GR The digraph type.
  2319   /// \see TargetMap
  2320   template <typename GR>
  2321   class SourceMap {
  2322   public:
  2323 
  2324     ///\e
  2325     typedef typename GR::Arc Key;
  2326     ///\e
  2327     typedef typename GR::Node Value;
  2328 
  2329     /// \brief Constructor
  2330     ///
  2331     /// Constructor.
  2332     /// \param digraph The digraph that the map belongs to.
  2333     explicit SourceMap(const GR& digraph) : _graph(digraph) {}
  2334 
  2335     /// \brief Returns the source node of the given arc.
  2336     ///
  2337     /// Returns the source node of the given arc.
  2338     Value operator[](const Key& arc) const {
  2339       return _graph.source(arc);
  2340     }
  2341 
  2342   private:
  2343     const GR& _graph;
  2344   };
  2345 
  2346   /// \brief Returns a \c SourceMap class.
  2347   ///
  2348   /// This function just returns an \c SourceMap class.
  2349   /// \relates SourceMap
  2350   template <typename GR>
  2351   inline SourceMap<GR> sourceMap(const GR& graph) {
  2352     return SourceMap<GR>(graph);
  2353   }
  2354 
  2355   /// \brief Map of the target nodes of arcs in a digraph.
  2356   ///
  2357   /// TargetMap provides access for the target node of each arc in a digraph,
  2358   /// which is returned by the \c target() function of the digraph.
  2359   /// \tparam GR The digraph type.
  2360   /// \see SourceMap
  2361   template <typename GR>
  2362   class TargetMap {
  2363   public:
  2364 
  2365     ///\e
  2366     typedef typename GR::Arc Key;
  2367     ///\e
  2368     typedef typename GR::Node Value;
  2369 
  2370     /// \brief Constructor
  2371     ///
  2372     /// Constructor.
  2373     /// \param digraph The digraph that the map belongs to.
  2374     explicit TargetMap(const GR& digraph) : _graph(digraph) {}
  2375 
  2376     /// \brief Returns the target node of the given arc.
  2377     ///
  2378     /// Returns the target node of the given arc.
  2379     Value operator[](const Key& e) const {
  2380       return _graph.target(e);
  2381     }
  2382 
  2383   private:
  2384     const GR& _graph;
  2385   };
  2386 
  2387   /// \brief Returns a \c TargetMap class.
  2388   ///
  2389   /// This function just returns a \c TargetMap class.
  2390   /// \relates TargetMap
  2391   template <typename GR>
  2392   inline TargetMap<GR> targetMap(const GR& graph) {
  2393     return TargetMap<GR>(graph);
  2394   }
  2395 
  2396   /// \brief Map of the "forward" directed arc view of edges in a graph.
  2397   ///
  2398   /// ForwardMap provides access for the "forward" directed arc view of
  2399   /// each edge in a graph, which is returned by the \c direct() function
  2400   /// of the graph with \c true parameter.
  2401   /// \tparam GR The graph type.
  2402   /// \see BackwardMap
  2403   template <typename GR>
  2404   class ForwardMap {
  2405   public:
  2406 
  2407     typedef typename GR::Arc Value;
  2408     typedef typename GR::Edge Key;
  2409 
  2410     /// \brief Constructor
  2411     ///
  2412     /// Constructor.
  2413     /// \param graph The graph that the map belongs to.
  2414     explicit ForwardMap(const GR& graph) : _graph(graph) {}
  2415 
  2416     /// \brief Returns the "forward" directed arc view of the given edge.
  2417     ///
  2418     /// Returns the "forward" directed arc view of the given edge.
  2419     Value operator[](const Key& key) const {
  2420       return _graph.direct(key, true);
  2421     }
  2422 
  2423   private:
  2424     const GR& _graph;
  2425   };
  2426 
  2427   /// \brief Returns a \c ForwardMap class.
  2428   ///
  2429   /// This function just returns an \c ForwardMap class.
  2430   /// \relates ForwardMap
  2431   template <typename GR>
  2432   inline ForwardMap<GR> forwardMap(const GR& graph) {
  2433     return ForwardMap<GR>(graph);
  2434   }
  2435 
  2436   /// \brief Map of the "backward" directed arc view of edges in a graph.
  2437   ///
  2438   /// BackwardMap provides access for the "backward" directed arc view of
  2439   /// each edge in a graph, which is returned by the \c direct() function
  2440   /// of the graph with \c false parameter.
  2441   /// \tparam GR The graph type.
  2442   /// \see ForwardMap
  2443   template <typename GR>
  2444   class BackwardMap {
  2445   public:
  2446 
  2447     typedef typename GR::Arc Value;
  2448     typedef typename GR::Edge Key;
  2449 
  2450     /// \brief Constructor
  2451     ///
  2452     /// Constructor.
  2453     /// \param graph The graph that the map belongs to.
  2454     explicit BackwardMap(const GR& graph) : _graph(graph) {}
  2455 
  2456     /// \brief Returns the "backward" directed arc view of the given edge.
  2457     ///
  2458     /// Returns the "backward" directed arc view of the given edge.
  2459     Value operator[](const Key& key) const {
  2460       return _graph.direct(key, false);
  2461     }
  2462 
  2463   private:
  2464     const GR& _graph;
  2465   };
  2466 
  2467   /// \brief Returns a \c BackwardMap class
  2468 
  2469   /// This function just returns a \c BackwardMap class.
  2470   /// \relates BackwardMap
  2471   template <typename GR>
  2472   inline BackwardMap<GR> backwardMap(const GR& graph) {
  2473     return BackwardMap<GR>(graph);
  2474   }
  2475 
  2476   /// \brief Map of the in-degrees of nodes in a digraph.
  2477   ///
  2478   /// This map returns the in-degree of a node. Once it is constructed,
  2479   /// the degrees are stored in a standard \c NodeMap, so each query is done
  2480   /// in constant time. On the other hand, the values are updated automatically
  2481   /// whenever the digraph changes.
  2482   ///
  2483   /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
  2484   /// may provide alternative ways to modify the digraph.
  2485   /// The correct behavior of InDegMap is not guarantied if these additional
  2486   /// features are used. For example the functions
  2487   /// \ref ListDigraph::changeSource() "changeSource()",
  2488   /// \ref ListDigraph::changeTarget() "changeTarget()" and
  2489   /// \ref ListDigraph::reverseArc() "reverseArc()"
  2490   /// of \ref ListDigraph will \e not update the degree values correctly.
  2491   ///
  2492   /// \sa OutDegMap
  2493   template <typename GR>
  2494   class InDegMap
  2495     : protected ItemSetTraits<GR, typename GR::Arc>
  2496       ::ItemNotifier::ObserverBase {
  2497 
  2498   public:
  2499     
  2500     /// The graph type of InDegMap
  2501     typedef GR Graph;
  2502     typedef GR Digraph;
  2503     /// The key type
  2504     typedef typename Digraph::Node Key;
  2505     /// The value type
  2506     typedef int Value;
  2507 
  2508     typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
  2509     ::ItemNotifier::ObserverBase Parent;
  2510 
  2511   private:
  2512 
  2513     class AutoNodeMap
  2514       : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
  2515     public:
  2516 
  2517       typedef typename ItemSetTraits<Digraph, Key>::
  2518       template Map<int>::Type Parent;
  2519 
  2520       AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
  2521 
  2522       virtual void add(const Key& key) {
  2523         Parent::add(key);
  2524         Parent::set(key, 0);
  2525       }
  2526 
  2527       virtual void add(const std::vector<Key>& keys) {
  2528         Parent::add(keys);
  2529         for (int i = 0; i < int(keys.size()); ++i) {
  2530           Parent::set(keys[i], 0);
  2531         }
  2532       }
  2533 
  2534       virtual void build() {
  2535         Parent::build();
  2536         Key it;
  2537         typename Parent::Notifier* nf = Parent::notifier();
  2538         for (nf->first(it); it != INVALID; nf->next(it)) {
  2539           Parent::set(it, 0);
  2540         }
  2541       }
  2542     };
  2543 
  2544   public:
  2545 
  2546     /// \brief Constructor.
  2547     ///
  2548     /// Constructor for creating an in-degree map.
  2549     explicit InDegMap(const Digraph& graph)
  2550       : _digraph(graph), _deg(graph) {
  2551       Parent::attach(_digraph.notifier(typename Digraph::Arc()));
  2552 
  2553       for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
  2554         _deg[it] = countInArcs(_digraph, it);
  2555       }
  2556     }
  2557 
  2558     /// \brief Gives back the in-degree of a Node.
  2559     ///
  2560     /// Gives back the in-degree of a Node.
  2561     int operator[](const Key& key) const {
  2562       return _deg[key];
  2563     }
  2564 
  2565   protected:
  2566 
  2567     typedef typename Digraph::Arc Arc;
  2568 
  2569     virtual void add(const Arc& arc) {
  2570       ++_deg[_digraph.target(arc)];
  2571     }
  2572 
  2573     virtual void add(const std::vector<Arc>& arcs) {
  2574       for (int i = 0; i < int(arcs.size()); ++i) {
  2575         ++_deg[_digraph.target(arcs[i])];
  2576       }
  2577     }
  2578 
  2579     virtual void erase(const Arc& arc) {
  2580       --_deg[_digraph.target(arc)];
  2581     }
  2582 
  2583     virtual void erase(const std::vector<Arc>& arcs) {
  2584       for (int i = 0; i < int(arcs.size()); ++i) {
  2585         --_deg[_digraph.target(arcs[i])];
  2586       }
  2587     }
  2588 
  2589     virtual void build() {
  2590       for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
  2591         _deg[it] = countInArcs(_digraph, it);
  2592       }
  2593     }
  2594 
  2595     virtual void clear() {
  2596       for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
  2597         _deg[it] = 0;
  2598       }
  2599     }
  2600   private:
  2601 
  2602     const Digraph& _digraph;
  2603     AutoNodeMap _deg;
  2604   };
  2605 
  2606   /// \brief Map of the out-degrees of nodes in a digraph.
  2607   ///
  2608   /// This map returns the out-degree of a node. Once it is constructed,
  2609   /// the degrees are stored in a standard \c NodeMap, so each query is done
  2610   /// in constant time. On the other hand, the values are updated automatically
  2611   /// whenever the digraph changes.
  2612   ///
  2613   /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
  2614   /// may provide alternative ways to modify the digraph.
  2615   /// The correct behavior of OutDegMap is not guarantied if these additional
  2616   /// features are used. For example the functions
  2617   /// \ref ListDigraph::changeSource() "changeSource()",
  2618   /// \ref ListDigraph::changeTarget() "changeTarget()" and
  2619   /// \ref ListDigraph::reverseArc() "reverseArc()"
  2620   /// of \ref ListDigraph will \e not update the degree values correctly.
  2621   ///
  2622   /// \sa InDegMap
  2623   template <typename GR>
  2624   class OutDegMap
  2625     : protected ItemSetTraits<GR, typename GR::Arc>
  2626       ::ItemNotifier::ObserverBase {
  2627 
  2628   public:
  2629 
  2630     /// The graph type of OutDegMap
  2631     typedef GR Graph;
  2632     typedef GR Digraph;
  2633     /// The key type
  2634     typedef typename Digraph::Node Key;
  2635     /// The value type
  2636     typedef int Value;
  2637 
  2638     typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
  2639     ::ItemNotifier::ObserverBase Parent;
  2640 
  2641   private:
  2642 
  2643     class AutoNodeMap
  2644       : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
  2645     public:
  2646 
  2647       typedef typename ItemSetTraits<Digraph, Key>::
  2648       template Map<int>::Type Parent;
  2649 
  2650       AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
  2651 
  2652       virtual void add(const Key& key) {
  2653         Parent::add(key);
  2654         Parent::set(key, 0);
  2655       }
  2656       virtual void add(const std::vector<Key>& keys) {
  2657         Parent::add(keys);
  2658         for (int i = 0; i < int(keys.size()); ++i) {
  2659           Parent::set(keys[i], 0);
  2660         }
  2661       }
  2662       virtual void build() {
  2663         Parent::build();
  2664         Key it;
  2665         typename Parent::Notifier* nf = Parent::notifier();
  2666         for (nf->first(it); it != INVALID; nf->next(it)) {
  2667           Parent::set(it, 0);
  2668         }
  2669       }
  2670     };
  2671 
  2672   public:
  2673 
  2674     /// \brief Constructor.
  2675     ///
  2676     /// Constructor for creating an out-degree map.
  2677     explicit OutDegMap(const Digraph& graph)
  2678       : _digraph(graph), _deg(graph) {
  2679       Parent::attach(_digraph.notifier(typename Digraph::Arc()));
  2680 
  2681       for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
  2682         _deg[it] = countOutArcs(_digraph, it);
  2683       }
  2684     }
  2685 
  2686     /// \brief Gives back the out-degree of a Node.
  2687     ///
  2688     /// Gives back the out-degree of a Node.
  2689     int operator[](const Key& key) const {
  2690       return _deg[key];
  2691     }
  2692 
  2693   protected:
  2694 
  2695     typedef typename Digraph::Arc Arc;
  2696 
  2697     virtual void add(const Arc& arc) {
  2698       ++_deg[_digraph.source(arc)];
  2699     }
  2700 
  2701     virtual void add(const std::vector<Arc>& arcs) {
  2702       for (int i = 0; i < int(arcs.size()); ++i) {
  2703         ++_deg[_digraph.source(arcs[i])];
  2704       }
  2705     }
  2706 
  2707     virtual void erase(const Arc& arc) {
  2708       --_deg[_digraph.source(arc)];
  2709     }
  2710 
  2711     virtual void erase(const std::vector<Arc>& arcs) {
  2712       for (int i = 0; i < int(arcs.size()); ++i) {
  2713         --_deg[_digraph.source(arcs[i])];
  2714       }
  2715     }
  2716 
  2717     virtual void build() {
  2718       for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
  2719         _deg[it] = countOutArcs(_digraph, it);
  2720       }
  2721     }
  2722 
  2723     virtual void clear() {
  2724       for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
  2725         _deg[it] = 0;
  2726       }
  2727     }
  2728   private:
  2729 
  2730     const Digraph& _digraph;
  2731     AutoNodeMap _deg;
  2732   };
  2733 
  2734   /// \brief Potential difference map
  2735   ///
  2736   /// PotentialDifferenceMap returns the difference between the potentials of
  2737   /// the source and target nodes of each arc in a digraph, i.e. it returns
  2738   /// \code
  2739   ///   potential[gr.target(arc)] - potential[gr.source(arc)].
  2740   /// \endcode
  2741   /// \tparam GR The digraph type.
  2742   /// \tparam POT A node map storing the potentials.
  2743   template <typename GR, typename POT>
  2744   class PotentialDifferenceMap {
  2745   public:
  2746     /// Key type
  2747     typedef typename GR::Arc Key;
  2748     /// Value type
  2749     typedef typename POT::Value Value;
  2750 
  2751     /// \brief Constructor
  2752     ///
  2753     /// Contructor of the map.
  2754     explicit PotentialDifferenceMap(const GR& gr,
  2755                                     const POT& potential)
  2756       : _digraph(gr), _potential(potential) {}
  2757 
  2758     /// \brief Returns the potential difference for the given arc.
  2759     ///
  2760     /// Returns the potential difference for the given arc, i.e.
  2761     /// \code
  2762     ///   potential[gr.target(arc)] - potential[gr.source(arc)].
  2763     /// \endcode
  2764     Value operator[](const Key& arc) const {
  2765       return _potential[_digraph.target(arc)] -
  2766         _potential[_digraph.source(arc)];
  2767     }
  2768 
  2769   private:
  2770     const GR& _digraph;
  2771     const POT& _potential;
  2772   };
  2773 
  2774   /// \brief Returns a PotentialDifferenceMap.
  2775   ///
  2776   /// This function just returns a PotentialDifferenceMap.
  2777   /// \relates PotentialDifferenceMap
  2778   template <typename GR, typename POT>
  2779   PotentialDifferenceMap<GR, POT>
  2780   potentialDifferenceMap(const GR& gr, const POT& potential) {
  2781     return PotentialDifferenceMap<GR, POT>(gr, potential);
  2782   }
  2783 
  2784   /// @}
  2785 }
  2786 
  2787 #endif // LEMON_MAPS_H