* This file is a part of LEMON, a generic C++ optimization library
  * Copyright (C) 2003-2007
  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
  * (Egervary Research Group on Combinatorial Optimization, EGRES).
  * Permission to use, modify and distribute this software is granted
  * provided that this copyright notice appears in all copies. For
  * precise terms see the accompanying LICENSE file.
  * This software is provided "AS IS" with no warranty of any kind,
  * express or implied, and with no claim as to its suitability for any
 #include <lemon/bits/utility.h>
 // #include <lemon/bits/traits.h>
 ///\brief Miscellaneous property maps
   /// It provides the necessary <tt>typedef</tt>s required by the map concept.
   template<typename K, typename T>
     /// The key type of the map.
     /// The value type of the map. (The type of objects associated with the keys).
   /// Null map. (a.k.a. DoNothingMap)
   /// This map can be used if you have to provide a map only for
   /// its type definitions, or if you have to provide a writable map, 
   /// but data written to it is not required (i.e. it will be sent to 
   template<typename K, typename T>
   class NullMap : public MapBase<K, T> {
     typedef MapBase<K, T> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     /// Gives back a default constructed element.
     T operator[](const K&) const { return T(); }
     void set(const K&, const T&) {}
   ///Returns a \c NullMap class
   ///This function just returns a \c NullMap class.
   template <typename K, typename V> 
   NullMap<K, V> nullMap() {
   /// This is a readable map which assigns a specified value to each key.
   /// In other aspects it is equivalent to the \c NullMap.
   template<typename K, typename T>
   class ConstMap : public MapBase<K, T> {
     typedef MapBase<K, T> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     /// The value of the map will be uninitialized. 
     /// (More exactly it will be default constructed.)
     /// Constructor with specified initial value
     /// Constructor with specified initial value.
     /// \param _v is the initial value of the map.
     ConstMap(const T &_v) : v(_v) {}
     T operator[](const K&) const { return v; }
     void setAll(const T &t) {
       typedef ConstMap<K, T1> other;
     ConstMap(const ConstMap<K, T1> &, const T &_v) : v(_v) {}
   ///Returns a \c ConstMap class
   ///This function just returns a \c ConstMap class.
   template<typename K, typename V> 
   inline ConstMap<K, V> constMap(const V &v) {
     return ConstMap<K, V>(v);
   template<typename T, T v>
   /// Constant map with inlined constant value.
   /// This is a readable map which assigns a specified value to each key.
   /// In other aspects it is equivalent to the \c NullMap.
   template<typename K, typename V, V v>
   class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
     typedef MapBase<K, V> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     V operator[](const K&) const { return v; }
     void set(const K&, const V&) { }
   ///Returns a \c ConstMap class
   ///This function just returns a \c ConstMap class with inlined value.
   template<typename K, typename V, V v> 
   inline ConstMap<K, Const<V, v> > constMap() {
     return ConstMap<K, Const<V, v> >();
   ///This is essentially a wrapper for \c std::map with addition that
   ///you can specify a default value different from \c Value().
   template <typename K, typename T, typename Compare = std::less<K> >
     template <typename K1, typename T1, typename C1>
     typedef True ReferenceMapTag;
     typedef const T& ConstReference;
     typedef std::map<K, T, Compare> Map;
     /// Constructor with specified default value
     StdMap(const T& value = T()) : _value(value) {}
     /// \brief Constructs the map from an appropriate std::map, and explicitly
     /// specifies a default value.
     template <typename T1, typename Comp1>
     StdMap(const std::map<Key, T1, Comp1> &map, const T& value = T()) 
       : _map(map.begin(), map.end()), _value(value) {}
     /// \brief Constructs a map from an other StdMap.
     template<typename T1, typename Comp1>
     StdMap(const StdMap<Key, T1, Comp1> &c) 
       : _map(c._map.begin(), c._map.end()), _value(c._value) {}
     StdMap& operator=(const StdMap&);
     Reference operator[](const Key &k) {
       typename Map::iterator it = _map.lower_bound(k);
       if (it != _map.end() && !_map.key_comp()(k, it->first))
 	return _map.insert(it, std::make_pair(k, _value))->second;
     ConstReference operator[](const Key &k) const {
       typename Map::const_iterator it = _map.find(k);
     void set(const Key &k, const T &t) {
       typename Map::iterator it = _map.lower_bound(k);
       if (it != _map.end() && !_map.key_comp()(k, it->first))
 	_map.insert(it, std::make_pair(k, t));
     void setAll(const T &t) {
     template <typename T1, typename C1 = std::less<T1> >
       typedef StdMap<Key, T1, C1> other;
   /// \brief Map for storing values for keys from the range <tt>[0..size-1]</tt>
   /// The current map has the <tt>[0..size-1]</tt> keyset and the values
   /// are stored in a \c std::vector<T>  container. It can be used with
   /// some data structures, for example \c UnionFind, \c BinHeap, when 
   /// the used items are small integer numbers. 
   /// \todo Revise its name
     typedef True ReferenceMapTag;
     typedef const T& ConstReference;
     typedef std::vector<T> Vector;
     /// Constructor with specified default value
     IntegerMap(int size = 0, const T& value = T()) : _vector(size, value) {}
     /// \brief Constructs the map from an appropriate std::vector.
     IntegerMap(const std::vector<T1>& vector) 
       : _vector(vector.begin(), vector.end()) {}
     /// \brief Constructs a map from an other IntegerMap.
     IntegerMap(const IntegerMap<T1> &c) 
       : _vector(c._vector.begin(), c._vector.end()) {}
     /// \brief Resize the container
     void resize(int size, const T& value = T()) {
       _vector.resize(size, value);
     IntegerMap& operator=(const IntegerMap&);
     Reference operator[](Key k) {
     ConstReference operator[](Key k) const {
     void set(const Key &k, const T& t) {
   /// \addtogroup map_adaptors
   /// This map gives back the given key as value without any
   class IdentityMap : public MapBase<T, T> {
     typedef MapBase<T, T> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     const T& operator[](const T& t) const {
   ///Returns an \c IdentityMap class
   ///This function just returns an \c IdentityMap class.
   inline IdentityMap<T> identityMap() {
   ///\brief Convert the \c Value of a map to another type using
   ///the default conversion.
   ///This \c concepts::ReadMap "read only map"
   ///converts the \c Value of a map to type \c T.
   ///Its \c Key is inherited from \c M.
   template <typename M, typename T> 
   class ConvertMap : public MapBase<typename M::Key, T> {
     typedef MapBase<typename M::Key, T> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     ///\param _m is the underlying map.
     ConvertMap(const M &_m) : m(_m) {};
     /// \brief The subscript operator.
     /// The subscript operator.
     Value operator[](const Key& k) const {return m[k];}
   ///Returns a \c ConvertMap class
   ///This function just returns a \c ConvertMap class.
   template<typename T, typename M>
   inline ConvertMap<M, T> convertMap(const M &m) {
     return ConvertMap<M, T>(m);
   ///Simple wrapping of a map
   ///This \c concepts::ReadMap "read only map" returns the simple
   ///wrapping of the given map. Sometimes the reference maps cannot be
   ///combined with simple read maps. This map adaptor wraps the given
   ///map to simple read map.
   /// \todo Revise the misleading name 
   class SimpleMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     SimpleMap(const M &_m) : m(_m) {};
     Value operator[](Key k) const {return m[k];}
   ///Simple writable wrapping of the map
   ///This \c concepts::WriteMap "write map" returns the simple
   ///wrapping of the given map. Sometimes the reference maps cannot be
   ///combined with simple read-write maps. This map adaptor wraps the
   ///given map to simple read-write map.
   /// \todo Revise the misleading name
   class SimpleWriteMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     SimpleWriteMap(M &_m) : m(_m) {};
     Value operator[](Key k) const {return m[k];}
     void set(Key k, const Value& c) { m.set(k, c); }
   ///This \c concepts::ReadMap "read only map" returns the sum of the two
   ///Its \c Key and \c Value are inherited from \c M1.
   ///The \c Key and \c Value of M2 must be convertible to those of \c M1.
   template<typename M1, typename M2> 
   class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
     Value operator[](Key k) const {return m1[k]+m2[k];}
   ///Returns an \c AddMap class
   ///This function just returns an \c AddMap class.
   ///\todo How to call these type of functions?
   template<typename M1, typename M2> 
   inline AddMap<M1, M2> addMap(const M1 &m1,const M2 &m2) {
     return AddMap<M1, M2>(m1,m2);
   ///Shift a map with a constant.
   ///This \c concepts::ReadMap "read only map" returns the sum of the
   ///given map and a constant value.
   ///Its \c Key and \c Value are inherited from \c M.
   ///  ConstMap<X::Key, X::Value> c_tmp(v);
   ///  AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
   template<typename M, typename C = typename M::Value> 
   class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     ///\param _m is the undelying map.
     ///\param _v is the shift value.
     ShiftMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
     Value operator[](Key k) const {return m[k] + v;}
   ///Shift a map with a constant (ReadWrite version).
   ///This \c concepts::ReadWriteMap "read-write map" returns the sum of the
   ///given map and a constant value. It makes also possible to write the map.
   ///Its \c Key and \c Value are inherited from \c M.
   template<typename M, typename C = typename M::Value> 
   class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     ///\param _m is the undelying map.
     ///\param _v is the shift value.
     ShiftWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
     Value operator[](Key k) const {return m[k] + v;}
     void set(Key k, const Value& c) { m.set(k, c - v); }
   ///Returns a \c ShiftMap class
   ///This function just returns a \c ShiftMap class.
   template<typename M, typename C> 
   inline ShiftMap<M, C> shiftMap(const M &m,const C &v) {
     return ShiftMap<M, C>(m,v);
   ///Returns a \c ShiftWriteMap class
   ///This function just returns a \c ShiftWriteMap class.
   ///\relates ShiftWriteMap
   template<typename M, typename C> 
   inline ShiftWriteMap<M, C> shiftMap(M &m,const C &v) {
     return ShiftWriteMap<M, C>(m,v);
   ///Difference of two maps
   ///This \c concepts::ReadMap "read only map" returns the difference
   ///of the values of the two given maps.
   ///Its \c Key and \c Value are inherited from \c M1.
   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
   /// \todo Revise the misleading name
   template<typename M1, typename M2> 
   class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     SubMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
     Value operator[](Key k) const {return m1[k]-m2[k];}
   ///Returns a \c SubMap class
   ///This function just returns a \c SubMap class.
   template<typename M1, typename M2> 
   inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
     return SubMap<M1, M2>(m1, m2);
   ///This \c concepts::ReadMap "read only map" returns the product of the
   ///values of the two given maps.
   ///Its \c Key and \c Value are inherited from \c M1.
   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
   template<typename M1, typename M2> 
   class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
     Value operator[](Key k) const {return m1[k]*m2[k];}
   ///Returns a \c MulMap class
   ///This function just returns a \c MulMap class.
   template<typename M1, typename M2> 
   inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
     return MulMap<M1, M2>(m1,m2);
   ///Scales a map with a constant.
   ///This \c concepts::ReadMap "read only map" returns the value of the
   ///given map multiplied from the left side with a constant value.
   ///Its \c Key and \c Value are inherited from \c M.
   ///  ConstMap<X::Key, X::Value> c_tmp(v);
   ///  MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v);
   template<typename M, typename C = typename M::Value> 
   class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     ///\param _m is the undelying map.
     ///\param _v is the scaling value.
     ScaleMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
     Value operator[](Key k) const {return v * m[k];}
   ///Scales a map with a constant (ReadWrite version).
   ///This \c concepts::ReadWriteMap "read-write map" returns the value of the
   ///given map multiplied from the left side with a constant value. It can
   ///also be used as write map if the \c / operator is defined between
   ///\c Value and \c C and the given multiplier is not zero.
   ///Its \c Key and \c Value are inherited from \c M.
   template<typename M, typename C = typename M::Value> 
   class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     ///\param _m is the undelying map.
     ///\param _v is the scaling value.
     ScaleWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
     Value operator[](Key k) const {return v * m[k];}
     void set(Key k, const Value& c) { m.set(k, c / v);}
   ///Returns a \c ScaleMap class
   ///This function just returns a \c ScaleMap class.
   template<typename M, typename C> 
   inline ScaleMap<M, C> scaleMap(const M &m,const C &v) {
     return ScaleMap<M, C>(m,v);
   ///Returns a \c ScaleWriteMap class
   ///This function just returns a \c ScaleWriteMap class.
   ///\relates ScaleWriteMap
   template<typename M, typename C> 
   inline ScaleWriteMap<M, C> scaleMap(M &m,const C &v) {
     return ScaleWriteMap<M, C>(m,v);
   ///This \c concepts::ReadMap "read only map" returns the quotient of the
   ///values of the two given maps.
   ///Its \c Key and \c Value are inherited from \c M1.
   ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
   template<typename M1, typename M2> 
   class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
     Value operator[](Key k) const {return m1[k]/m2[k];}
   ///Returns a \c DivMap class
   ///This function just returns a \c DivMap class.
   template<typename M1, typename M2> 
   inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
     return DivMap<M1, M2>(m1,m2);
   ///Composition of two maps
   ///This \c concepts::ReadMap "read only map" returns the composition of
   ///That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2,
   ///  ComposeMap<M1, M2> cm(m1,m2);
   /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
   ///Its \c Key is inherited from \c M2 and its \c Value is from \c M1.
   ///\c M2::Value must be convertible to \c M1::Key.
   ///\todo Check the requirements.
   template <typename M1, typename M2> 
   class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
     typedef MapBase<typename M2::Key, typename M1::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
     /// \todo Use the  MapTraits once it is ported.
     //typename MapTraits<M1>::ConstReturnValue
     operator[](Key k) const {return m1[m2[k]];}
   ///Returns a \c ComposeMap class
   ///This function just returns a \c ComposeMap class.
   template <typename M1, typename M2> 
   inline ComposeMap<M1, M2> composeMap(const M1 &m1,const M2 &m2) {
     return ComposeMap<M1, M2>(m1,m2);
   ///Combine of two maps using an STL (binary) functor.
   ///Combine of two maps using an STL (binary) functor.
   ///This \c concepts::ReadMap "read only map" takes two maps and a
   ///binary functor and returns the composition of the two
   ///given maps unsing the functor. 
   ///That is to say, if \c m1 and \c m2 is of type \c M1 and \c M2
   ///and \c f is of \c F, then for
   ///  CombineMap<M1,M2,F,V> cm(m1,m2,f);
   /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>
   ///Its \c Key is inherited from \c M1 and its \c Value is \c V.
   ///\c M2::Value and \c M1::Value must be convertible to the corresponding
   ///input parameter of \c F and the return type of \c F must be convertible
   ///\todo Check the requirements.
   template<typename M1, typename M2, typename F,
 	   typename V = typename F::result_type> 
   class CombineMap : public MapBase<typename M1::Key, V> {
     typedef MapBase<typename M1::Key, V> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     CombineMap(const M1 &_m1,const M2 &_m2,const F &_f = F())
       : m1(_m1), m2(_m2), f(_f) {};
     Value operator[](Key k) const {return f(m1[k],m2[k]);}
   ///Returns a \c CombineMap class
   ///This function just returns a \c CombineMap class.
   ///For example if \c m1 and \c m2 are both \c double valued maps, then 
   ///combineMap(m1,m2,std::plus<double>())
   ///This function is specialized for adaptable binary function
   ///classes and C++ functions.
   template<typename M1, typename M2, typename F, typename V> 
   inline CombineMap<M1, M2, F, V> 
   combineMap(const M1& m1,const M2& m2, const F& f) {
     return CombineMap<M1, M2, F, V>(m1,m2,f);
   template<typename M1, typename M2, typename F> 
   inline CombineMap<M1, M2, F, typename F::result_type> 
   combineMap(const M1& m1, const M2& m2, const F& f) {
     return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
   template<typename M1, typename M2, typename K1, typename K2, typename V> 
   inline CombineMap<M1, M2, V (*)(K1, K2), V> 
   combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
     return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
   ///Negative value of a map
   ///This \c concepts::ReadMap "read only map" returns the negative
   ///value of the value returned by the given map.
   ///Its \c Key and \c Value are inherited from \c M.
   ///The unary \c - operator must be defined for \c Value, of course.
   class NegMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     NegMap(const M &_m) : m(_m) {};
     Value operator[](Key k) const {return -m[k];}
   ///Negative value of a map (ReadWrite version)
   ///This \c concepts::ReadWriteMap "read-write map" returns the negative
   ///value of the value returned by the given map.
   ///Its \c Key and \c Value are inherited from \c M.
   ///The unary \c - operator must be defined for \c Value, of course.
   class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     NegWriteMap(M &_m) : m(_m) {};
     Value operator[](Key k) const {return -m[k];}
     void set(Key k, const Value& v) { m.set(k, -v); }
   ///Returns a \c NegMap class
   ///This function just returns a \c NegMap class.
   inline NegMap<M> negMap(const M &m) {
   ///Returns a \c NegWriteMap class
   ///This function just returns a \c NegWriteMap class.
   inline NegWriteMap<M> negMap(M &m) {
     return NegWriteMap<M>(m);
   ///Absolute value of a map
   ///This \c concepts::ReadMap "read only map" returns the absolute value
   ///of the value returned by the given map.
   ///Its \c Key and \c Value are inherited from \c M. 
   ///\c Value must be comparable to \c 0 and the unary \c -
   ///operator must be defined for it, of course.
   class AbsMap : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     AbsMap(const M &_m) : m(_m) {};
     Value operator[](Key k) const {
       return tmp >= 0 ? tmp : -tmp;
   ///Returns an \c AbsMap class
   ///This function just returns an \c AbsMap class.
   inline AbsMap<M> absMap(const M &m) {
   ///Converts an STL style functor to a map
   ///This \c concepts::ReadMap "read only map" returns the value
   ///Template parameters \c K and \c V will become its
   ///In most cases they have to be given explicitly because a 
   ///functor typically does not provide such typedefs.
   ///Parameter \c F is the type of the used functor.
 	   typename K = typename F::argument_type, 
 	   typename V = typename F::result_type> 
   class FunctorMap : public MapBase<K, V> {
     typedef MapBase<K, V> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     FunctorMap(const F &_f = F()) : f(_f) {}
     Value operator[](Key k) const { return f(k);}
   ///Returns a \c FunctorMap class
   ///This function just returns a \c FunctorMap class.
   ///It is specialized for adaptable function classes and
   template<typename K, typename V, typename F> inline 
   FunctorMap<F, K, V> functorMap(const F &f) {
     return FunctorMap<F, K, V>(f);
   template <typename F> inline 
   FunctorMap<F, typename F::argument_type, typename F::result_type> 
     return FunctorMap<F, typename F::argument_type, 
       typename F::result_type>(f);
   template <typename K, typename V> inline 
   FunctorMap<V (*)(K), K, V> functorMap(V (*f)(K)) {
     return FunctorMap<V (*)(K), K, V>(f);
   ///Converts a map to an STL style (unary) functor
   ///This class Converts a map to an STL style (unary) functor.
   ///that is it provides an <tt>operator()</tt> to read its values.
   ///For the sake of convenience it also works as
   ///a ususal \c concepts::ReadMap "readable map",
   ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist.
   class MapFunctor : public MapBase<typename M::Key, typename M::Value> {
     typedef MapBase<typename M::Key, typename M::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     typedef typename M::Key argument_type;
     typedef typename M::Value result_type;
     MapFunctor(const M &_m) : m(_m) {};
     Value operator()(Key k) const {return m[k];}
     Value operator[](Key k) const {return m[k];}
   ///Returns a \c MapFunctor class
   ///This function just returns a \c MapFunctor class.
   inline MapFunctor<M> mapFunctor(const M &m) {
   ///Applies all map setting operations to two maps
   ///This map has two \c concepts::ReadMap "readable map"
   ///parameters and each read request will be passed just to the
   ///first map. This class is the just readable map type of the ForkWriteMap.
   ///The \c Key and \c Value are inherited from \c M1.
   ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
   /// \todo Why is it needed?
   template<typename  M1, typename M2> 
   class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     ForkMap(const M1 &_m1, const M2 &_m2) : m1(_m1), m2(_m2) {};
     Value operator[](Key k) const {return m1[k];}
   ///Applies all map setting operations to two maps
   ///This map has two \c concepts::WriteMap "writable map"
   ///parameters and each write request will be passed to both of them.
   ///If \c M1 is also \c concepts::ReadMap "readable",
   ///then the read operations will return the
   ///corresponding values of \c M1.
   ///The \c Key and \c Value are inherited from \c M1.
   ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
   template<typename  M1, typename M2> 
   class ForkWriteMap : public MapBase<typename M1::Key, typename M1::Value> {
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     ForkWriteMap(M1 &_m1, M2 &_m2) : m1(_m1), m2(_m2) {};
     Value operator[](Key k) const {return m1[k];}
     void set(Key k, const Value &v) {m1.set(k,v); m2.set(k,v);}
   ///Returns a \c ForkMap class
   ///This function just returns a \c ForkMap class.
   template <typename M1, typename M2> 
   inline ForkMap<M1, M2> forkMap(const M1 &m1, const M2 &m2) {
     return ForkMap<M1, M2>(m1,m2);
   ///Returns a \c ForkWriteMap class
   ///This function just returns a \c ForkWriteMap class.
   template <typename M1, typename M2> 
   inline ForkWriteMap<M1, M2> forkMap(M1 &m1, M2 &m2) {
     return ForkWriteMap<M1, M2>(m1,m2);
   /* ************* BOOL MAPS ******************* */
   ///Logical 'not' of a map
   ///This bool \c concepts::ReadMap "read only map" returns the 
   ///logical negation of the value returned by the given map.
   ///Its \c Key is inherited from \c M, its Value is \c bool.
   class NotMap : public MapBase<typename M::Key, bool> {
     typedef MapBase<typename M::Key, bool> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     NotMap(const M &_m) : m(_m) {};
     Value operator[](Key k) const {return !m[k];}
   ///Logical 'not' of a map (ReadWrie version)
   ///This bool \c concepts::ReadWriteMap "read-write map" returns the 
   ///logical negation of the value returned by the given map. When it is set,
   ///the opposite value is set to the original map.
   ///Its \c Key is inherited from \c M, its Value is \c bool.
   class NotWriteMap : public MapBase<typename M::Key, bool> {
     typedef MapBase<typename M::Key, bool> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
     NotWriteMap(M &_m) : m(_m) {};
     Value operator[](Key k) const {return !m[k];}
     void set(Key k, bool v) { m.set(k, !v); }
   ///Returns a \c NotMap class
   ///This function just returns a \c NotMap class.
   inline NotMap<M> notMap(const M &m) {
   ///Returns a \c NotWriteMap class
   ///This function just returns a \c NotWriteMap class.
   inline NotWriteMap<M> notMap(M &m) {
     return NotWriteMap<M>(m);
     template <typename Value>
       typedef Value argument_type;
       typedef Value result_type;
       Value operator()(const Value& val) const {
     template <typename _Iterator, typename Enable = void>
       typedef typename std::iterator_traits<_Iterator>::value_type Value;
     template <typename _Iterator>
     struct IteratorTraits<_Iterator,
       typename exists<typename _Iterator::container_type>::type> 
       typedef typename _Iterator::container_type::value_type Value;
   /// \brief Writable bool map for logging each \c true assigned element
   /// Writable bool map for logging each \c true assigned element, i.e it
   /// copies all the keys set to \c true to the given iterator.
   /// \note The container of the iterator should contain space 
   /// The following example shows how you can write the edges found by the Prim
   /// to the standard output.
   /// typedef IdMap<Graph, Edge> EdgeIdMap;
   /// EdgeIdMap edgeId(graph);
   /// typedef MapFunctor<EdgeIdMap> EdgeIdFunctor;
   /// EdgeIdFunctor edgeIdFunctor(edgeId);
   /// StoreBoolMap<ostream_iterator<int>, EdgeIdFunctor> 
   ///   writerMap(ostream_iterator<int>(cout, " "), edgeIdFunctor);
   /// prim(graph, cost, writerMap);
   ///\sa BackInserterBoolMap 
   ///\sa FrontInserterBoolMap 
   ///\todo Revise the name of this class and the related ones.
   template <typename _Iterator, 
             _maps_bits::Identity<typename _maps_bits::
                                  IteratorTraits<_Iterator>::Value> >
     typedef _Iterator Iterator;
     typedef typename _Functor::argument_type Key;
     typedef _Functor Functor;
     StoreBoolMap(Iterator it, const Functor& functor = Functor()) 
       : _begin(it), _end(it), _functor(functor) {}
     /// Gives back the given iterator set for the first key
     /// Gives back the the 'after the last' iterator
     /// The \c set function of the map
     void set(const Key& key, Value value) const {
   /// \brief Writable bool map for logging each \c true assigned element in 
   /// a back insertable container.
   /// Writable bool map for logging each \c true assigned element by pushing
   /// them into a back insertable container.
   /// It can be used to retrieve the items into a standard
   /// container. The next example shows how you can store the
   /// edges found by the Prim algorithm in a vector.
   /// vector<Edge> span_tree_edges;
   /// BackInserterBoolMap<vector<Edge> > inserter_map(span_tree_edges);
   /// prim(graph, cost, inserter_map);
   ///\sa FrontInserterBoolMap
   template <typename Container,
             _maps_bits::Identity<typename Container::value_type> >
   class BackInserterBoolMap {
     typedef typename Container::value_type Key;
     BackInserterBoolMap(Container& _container, 
                         const Functor& _functor = Functor()) 
       : container(_container), functor(_functor) {}
     /// The \c set function of the map
     void set(const Key& key, Value value) {
 	container.push_back(functor(key));
   /// \brief Writable bool map for logging each \c true assigned element in 
   /// a front insertable container.
   /// Writable bool map for logging each \c true assigned element by pushing
   /// them into a front insertable container.
   /// It can be used to retrieve the items into a standard
   /// container. For example see \ref BackInserterBoolMap.
   ///\sa BackInserterBoolMap
   template <typename Container,
             _maps_bits::Identity<typename Container::value_type> >
   class FrontInserterBoolMap {
     typedef typename Container::value_type Key;
     FrontInserterBoolMap(Container& _container,
                          const Functor& _functor = Functor()) 
       : container(_container), functor(_functor) {}
     /// The \c set function of the map
     void set(const Key& key, Value value) {
 	container.push_front(functor(key));
   /// \brief Writable bool map for storing each \c true assigned element in 
   /// an insertable container.
   /// Writable bool map for storing each \c true assigned element in an 
   /// insertable container. It will insert all the keys set to \c true into
   /// For example, if you want to store the cut arcs of the strongly
   /// connected components in a set you can use the next code:
   /// InserterBoolMap<set<Arc> > inserter_map(cut_arcs);
   /// stronglyConnectedCutArcs(digraph, cost, inserter_map);
   ///\sa BackInserterBoolMap
   ///\sa FrontInserterBoolMap
   template <typename Container,
             _maps_bits::Identity<typename Container::value_type> >
     typedef typename Container::value_type Key;
     /// Constructor with specified iterator
     /// Constructor with specified iterator.
     /// \param _container The container for storing the elements.
     /// \param _it The elements will be inserted before this iterator.
     /// \param _functor The functor that is used when an element is stored.
     InserterBoolMap(Container& _container, typename Container::iterator _it,
                     const Functor& _functor = Functor()) 
       : container(_container), it(_it), functor(_functor) {}
     /// Constructor without specified iterator.
     /// The elements will be inserted before <tt>_container.end()</tt>.
     /// \param _container The container for storing the elements.
     /// \param _functor The functor that is used when an element is stored.
     InserterBoolMap(Container& _container, const Functor& _functor = Functor())
       : container(_container), it(_container.end()), functor(_functor) {}
     /// The \c set function of the map
     void set(const Key& key, Value value) {
 	it = container.insert(it, functor(key));
     typename Container::iterator it;
   /// \brief Writable bool map for filling each \c true assigned element with a 
   /// Writable bool map for filling each \c true assigned element with a 
   /// given value. The value can set the container.
   /// The following code finds the connected components of a graph
   /// and stores it in the \c comp map:
   /// typedef Graph::NodeMap<int> ComponentMap;
   /// ComponentMap comp(graph);
   /// typedef FillBoolMap<Graph::NodeMap<int> > ComponentFillerMap;
   /// ComponentFillerMap filler(comp, 0);
   /// Dfs<Graph>::DefProcessedMap<ComponentFillerMap>::Create dfs(graph);
   /// dfs.processedMap(filler);
   /// for (NodeIt it(graph); it != INVALID; ++it) {
   ///   if (!dfs.reached(it)) {
   ///     ++filler.fillValue();
     typedef typename Map::Key Key;
     FillBoolMap(Map& _map, const typename Map::Value& _fill) 
       : map(_map), fill(_fill) {}
     /// Gives back the current fill value
     const typename Map::Value& fillValue() const {
     /// Gives back the current fill value
     typename Map::Value& fillValue() {
     /// Sets the current fill value
     void fillValue(const typename Map::Value& _fill) {
     /// The \c set function of the map
     void set(const Key& key, Value value) {
     typename Map::Value fill;
   /// \brief Writable bool map for storing the sequence number of 
   /// Writable bool map that stores for each \c true assigned elements  
   /// the sequence number of this setting.
   /// It makes it easy to calculate the leaving
   /// order of the nodes in the \c Dfs algorithm.
   /// typedef Digraph::NodeMap<int> OrderMap;
   /// OrderMap order(digraph);
   /// typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
   /// OrderSetterMap setter(order);
   /// Dfs<Digraph>::DefProcessedMap<OrderSetterMap>::Create dfs(digraph);
   /// dfs.processedMap(setter);
   /// for (NodeIt it(digraph); it != INVALID; ++it) {
   ///   if (!dfs.reached(it)) {
   /// The storing of the discovering order is more difficult because the
   /// ReachedMap should be readable in the dfs algorithm but the setting
   /// order map is not readable. Thus we must use the fork map:
   /// typedef Digraph::NodeMap<int> OrderMap;
   /// OrderMap order(digraph);
   /// typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
   /// OrderSetterMap setter(order);
   /// typedef Digraph::NodeMap<bool> StoreMap;
   /// StoreMap store(digraph);
   /// typedef ForkWriteMap<StoreMap, OrderSetterMap> ReachedMap;
   /// ReachedMap reached(store, setter);
   /// Dfs<Digraph>::DefReachedMap<ReachedMap>::Create dfs(digraph);
   /// dfs.reachedMap(reached);
   /// for (NodeIt it(digraph); it != INVALID; ++it) {
   ///   if (!dfs.reached(it)) {
   class SettingOrderBoolMap {
     typedef typename Map::Key Key;
     SettingOrderBoolMap(Map& _map) 
       : map(_map), counter(0) {}
     /// Number of set operations.
     /// Setter function of the map
     void set(const Key& key, Value value) {