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