Index: lemon/maps.h
===================================================================
--- lemon/maps.h	(revision 54)
+++ lemon/maps.h	(revision 80)
@@ -25,10 +25,10 @@
 
 #include <lemon/bits/utility.h>
-// #include <lemon/bits/traits.h>
+#include <lemon/bits/traits.h>
 
 ///\file
 ///\ingroup maps
 ///\brief Miscellaneous property maps
-///
+
 #include <map>
 
@@ -40,39 +40,44 @@
   /// Base class of maps.
 
-  /// Base class of maps.
-  /// It provides the necessary <tt>typedef</tt>s required by the map concept.
-  template<typename K, typename T>
+  /// Base class of maps. It provides the necessary type definitions
+  /// required by the map %concepts.
+  template<typename K, typename V>
   class MapBase {
   public:
-    /// The key type of the map.
+    /// \biref The key type of the map.
     typedef K Key;
-    /// The value type of the map. (The type of objects associated with the keys).
-    typedef T Value;
-  };
+    /// \brief The value type of the map.
+    /// (The type of objects associated with the keys).
+    typedef V Value;
+  };
+
 
   /// 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 
+  /// 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
   /// <tt>/dev/null</tt>).
-  template<typename K, typename T>
-  class NullMap : public MapBase<K, T> {
-  public:
-    typedef MapBase<K, T> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-    
+  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
+  ///
+  /// \sa ConstMap
+  template<typename K, typename V>
+  class NullMap : public MapBase<K, V> {
+  public:
+    typedef MapBase<K, V> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
     /// Gives back a default constructed element.
-    T operator[](const K&) const { return T(); }
+    Value operator[](const Key&) const { return Value(); }
     /// Absorbs the value.
-    void set(const K&, const T&) {}
-  };
-
-  ///Returns a \c NullMap class
-
-  ///This function just returns a \c NullMap class.
-  ///\relates NullMap
-  template <typename K, typename V> 
+    void set(const Key&, const Value&) {}
+  };
+
+  /// Returns a \ref NullMap class
+
+  /// This function just returns a \ref NullMap class.
+  /// \relates NullMap
+  template <typename K, typename V>
   NullMap<K, V> nullMap() {
     return NullMap<K, V>();
@@ -82,14 +87,22 @@
   /// Constant map.
 
-  /// This is a \ref concepts::ReadMap "readable" map which assigns a 
+  /// This is a \ref concepts::ReadMap "readable" map which assigns a
   /// specified value to each key.
-  /// In other aspects it is equivalent to \c NullMap.
-  template<typename K, typename T>
-  class ConstMap : public MapBase<K, T> {
+  ///
+  /// In other aspects it is equivalent to \ref NullMap.
+  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
+  /// concept, but it absorbs the data written to it.
+  ///
+  /// The simplest way of using this map is through the constMap()
+  /// function.
+  ///
+  /// \sa NullMap
+  /// \sa IdentityMap
+  template<typename K, typename V>
+  class ConstMap : public MapBase<K, V> {
   private:
-    T v;
-  public:
-
-    typedef MapBase<K, T> Parent;
+    V _value;
+  public:
+    typedef MapBase<K, V> Parent;
     typedef typename Parent::Key Key;
     typedef typename Parent::Value Value;
@@ -98,31 +111,33 @@
 
     /// Default constructor.
-    /// The value of the map will be uninitialized. 
-    /// (More exactly it will be default constructed.)
+    /// The value of the map will be default constructed.
     ConstMap() {}
-    
+
     /// 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) {}
-    
-    ///\e
-    T operator[](const K&) const { return v; }
-
-    ///\e
-    void setAll(const T &t) {
-      v = t;
-    }    
-
-    template<typename T1>
-    ConstMap(const ConstMap<K, T1> &, const T &_v) : v(_v) {}
-  };
-
-  ///Returns a \c ConstMap class
-
-  ///This function just returns a \c ConstMap class.
-  ///\relates ConstMap
-  template<typename K, typename V> 
+    /// \param v is the initial value of the map.
+    ConstMap(const Value &v) : _value(v) {}
+
+    /// Gives back the specified value.
+    Value operator[](const Key&) const { return _value; }
+
+    /// Absorbs the value.
+    void set(const Key&, const Value&) {}
+
+    /// Sets the value that is assigned to each key.
+    void setAll(const Value &v) {
+      _value = v;
+    }
+
+    template<typename V1>
+    ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
+  };
+
+  /// Returns a \ref ConstMap class
+
+  /// This function just returns a \ref ConstMap class.
+  /// \relates ConstMap
+  template<typename K, typename V>
   inline ConstMap<K, V> constMap(const V &v) {
     return ConstMap<K, V>(v);
@@ -131,11 +146,20 @@
 
   template<typename T, T v>
-  struct Const { };
+  struct Const {};
 
   /// Constant map with inlined constant value.
 
-  /// This is a \ref concepts::ReadMap "readable" map which assigns a 
+  /// This is a \ref concepts::ReadMap "readable" map which assigns a
   /// specified value to each key.
-  /// In other aspects it is equivalent to \c NullMap.
+  ///
+  /// In other aspects it is equivalent to \ref NullMap.
+  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
+  /// concept, but it absorbs the data written to it.
+  ///
+  /// The simplest way of using this map is through the constMap()
+  /// function.
+  ///
+  /// \sa NullMap
+  /// \sa IdentityMap
   template<typename K, typename V, V v>
   class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
@@ -145,67 +169,228 @@
     typedef typename Parent::Value Value;
 
-    ConstMap() { }
-    ///\e
-    V operator[](const K&) const { return v; }
-    ///\e
-    void set(const K&, const V&) { }
-  };
-
-  ///Returns a \c ConstMap class with inlined value
-
-  ///This function just returns a \c ConstMap class with inlined value.
-  ///\relates ConstMap
-  template<typename K, typename V, V v> 
+    /// Constructor.
+    ConstMap() {}
+
+    /// Gives back the specified value.
+    Value operator[](const Key&) const { return v; }
+
+    /// Absorbs the value.
+    void set(const Key&, const Value&) {}
+  };
+
+  /// Returns a \ref ConstMap class with inlined constant value
+
+  /// This function just returns a \ref ConstMap class with inlined
+  /// constant value.
+  /// \relates ConstMap
+  template<typename K, typename V, V v>
   inline ConstMap<K, Const<V, v> > constMap() {
     return ConstMap<K, Const<V, v> >();
   }
 
-  ///Map based on \c std::map
-
-  ///This is essentially a wrapper for \c std::map with addition that
-  ///you can specify a default value different from \c Value().
-  ///It meets the \ref concepts::ReferenceMap "ReferenceMap" concept.
-  template <typename K, typename T, typename Compare = std::less<K> >
-  class StdMap : public MapBase<K, T> {
-    template <typename K1, typename T1, typename C1>
-    friend class StdMap;
-  public:
-
-    typedef MapBase<K, T> Parent;
-    ///Key type
-    typedef typename Parent::Key Key;
-    ///Value type
-    typedef typename Parent::Value Value;
-    ///Reference Type
-    typedef T& Reference;
-    ///Const reference type
-    typedef const T& ConstReference;
+
+  /// \brief Identity map.
+  ///
+  /// This map gives back the given key as value without any
+  /// modification.
+  ///
+  /// \sa ConstMap
+  template <typename T>
+  class IdentityMap : public MapBase<T, T> {
+  public:
+    typedef MapBase<T, T> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Gives back the given value without any modification.
+    const T& operator[](const T& t) const {
+      return t;
+    }
+  };
+
+  /// Returns an \ref IdentityMap class
+
+  /// This function just returns an \ref IdentityMap class.
+  /// \relates IdentityMap
+  template<typename T>
+  inline IdentityMap<T> identityMap() {
+    return IdentityMap<T>();
+  }
+
+
+  /// \brief Map for storing values for integer keys from the range
+  /// <tt>[0..size-1]</tt>.
+  ///
+  /// This map is essentially a wrapper for \c std::vector. It assigns
+  /// values to integer keys from the range <tt>[0..size-1]</tt>.
+  /// It can be used with some data structures, for example
+  /// \ref UnionFind, \ref BinHeap, when the used items are small
+  /// integers. This map conforms the \ref concepts::ReferenceMap
+  /// "ReferenceMap" concept.
+  ///
+  /// The simplest way of using this map is through the rangeMap()
+  /// function.
+  template <typename V>
+  class RangeMap : public MapBase<int, V> {
+    template <typename V1>
+    friend class RangeMap;
+  private:
+
+    typedef std::vector<V> Vector;
+    Vector _vector;
+
+  public:
+
+    typedef MapBase<int, V> Parent;
+    /// Key type
+    typedef typename Parent::Key Key;
+    /// Value type
+    typedef typename Parent::Value Value;
+    /// Reference type
+    typedef typename Vector::reference Reference;
+    /// Const reference type
+    typedef typename Vector::const_reference ConstReference;
 
     typedef True ReferenceMapTag;
 
+  public:
+
+    /// Constructor with specified default value.
+    RangeMap(int size = 0, const Value &value = Value())
+      : _vector(size, value) {}
+
+    /// Constructs the map from an appropriate \c std::vector.
+    template <typename V1>
+    RangeMap(const std::vector<V1>& vector)
+      : _vector(vector.begin(), vector.end()) {}
+
+    /// Constructs the map from another \ref RangeMap.
+    template <typename V1>
+    RangeMap(const RangeMap<V1> &c)
+      : _vector(c._vector.begin(), c._vector.end()) {}
+
+    /// Returns the size of the map.
+    int size() {
+      return _vector.size();
+    }
+
+    /// Resizes the map.
+
+    /// Resizes the underlying \c std::vector container, so changes the
+    /// keyset of the map.
+    /// \param size The new size of the map. The new keyset will be the
+    /// range <tt>[0..size-1]</tt>.
+    /// \param value The default value to assign to the new keys.
+    void resize(int size, const Value &value = Value()) {
+      _vector.resize(size, value);
+    }
+
   private:
-    
-    typedef std::map<K, T, Compare> Map;
+
+    RangeMap& operator=(const RangeMap&);
+
+  public:
+
+    ///\e
+    Reference operator[](const Key &k) {
+      return _vector[k];
+    }
+
+    ///\e
+    ConstReference operator[](const Key &k) const {
+      return _vector[k];
+    }
+
+    ///\e
+    void set(const Key &k, const Value &v) {
+      _vector[k] = v;
+    }
+  };
+
+  /// Returns a \ref RangeMap class
+
+  /// This function just returns a \ref RangeMap class.
+  /// \relates RangeMap
+  template<typename V>
+  inline RangeMap<V> rangeMap(int size = 0, const V &value = V()) {
+    return RangeMap<V>(size, value);
+  }
+
+  /// \brief Returns a \ref RangeMap class created from an appropriate
+  /// \c std::vector
+
+  /// This function just returns a \ref RangeMap class created from an
+  /// appropriate \c std::vector.
+  /// \relates RangeMap
+  template<typename V>
+  inline RangeMap<V> rangeMap(const std::vector<V> &vector) {
+    return RangeMap<V>(vector);
+  }
+
+
+  /// Map type based on \c std::map
+
+  /// This map is essentially a wrapper for \c std::map with addition
+  /// that you can specify a default value for the keys that are not
+  /// stored actually. This value can be different from the default
+  /// contructed value (i.e. \c %Value()).
+  /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
+  /// concept.
+  ///
+  /// This map is useful if a default value should be assigned to most of
+  /// the keys and different values should be assigned only to a few
+  /// keys (i.e. the map is "sparse").
+  /// The name of this type also refers to this important usage.
+  ///
+  /// Apart form that this map can be used in many other cases since it
+  /// is based on \c std::map, which is a general associative container.
+  /// However keep in mind that it is usually not as efficient as other
+  /// maps.
+  ///
+  /// The simplest way of using this map is through the sparseMap()
+  /// function.
+  template <typename K, typename V, typename Compare = std::less<K> >
+  class SparseMap : public MapBase<K, V> {
+    template <typename K1, typename V1, typename C1>
+    friend class SparseMap;
+  public:
+
+    typedef MapBase<K, V> Parent;
+    /// Key type
+    typedef typename Parent::Key Key;
+    /// Value type
+    typedef typename Parent::Value Value;
+    /// Reference type
+    typedef Value& Reference;
+    /// Const reference type
+    typedef const Value& ConstReference;
+
+    typedef True ReferenceMapTag;
+
+  private:
+
+    typedef std::map<K, V, Compare> Map;
+    Map _map;
     Value _value;
-    Map _map;
-
-  public:
-
-    /// Constructor with specified default value
-    StdMap(const T& value = T()) : _value(value) {}
-    /// \brief Constructs the map from an appropriate \c std::map, and 
+
+  public:
+
+    /// \brief Constructor with specified default value.
+    SparseMap(const Value &value = Value()) : _value(value) {}
+    /// \brief Constructs the map from an appropriate \c 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()) 
+    template <typename V1, typename Comp1>
+    SparseMap(const std::map<Key, V1, Comp1> &map,
+              const Value &value = Value())
       : _map(map.begin(), map.end()), _value(value) {}
-    
-    /// \brief Constructs a map from an other \ref StdMap.
-    template<typename T1, typename Comp1>
-    StdMap(const StdMap<Key, T1, Comp1> &c) 
+
+    /// \brief Constructs the map from another \ref SparseMap.
+    template<typename V1, typename Comp1>
+    SparseMap(const SparseMap<Key, V1, Comp1> &c)
       : _map(c._map.begin(), c._map.end()), _value(c._value) {}
 
   private:
 
-    StdMap& operator=(const StdMap&);
+    SparseMap& operator=(const SparseMap&);
 
   public:
@@ -220,5 +405,5 @@
     }
 
-    /// \e 
+    ///\e
     ConstReference operator[](const Key &k) const {
       typename Map::const_iterator it = _map.find(k);
@@ -229,147 +414,46 @@
     }
 
-    /// \e 
-    void set(const Key &k, const T &t) {
+    ///\e
+    void set(const Key &k, const Value &v) {
       typename Map::iterator it = _map.lower_bound(k);
       if (it != _map.end() && !_map.key_comp()(k, it->first))
-	it->second = t;
+	it->second = v;
       else
-	_map.insert(it, std::make_pair(k, t));
-    }
-
-    /// \e
-    void setAll(const T &t) {
-      _value = t;
+	_map.insert(it, std::make_pair(k, v));
+    }
+
+    ///\e
+    void setAll(const Value &v) {
+      _value = v;
       _map.clear();
-    }    
-
-  };
-  
-  ///Returns a \c StdMap class
-
-  ///This function just returns a \c StdMap class with specified 
-  ///default value.
-  ///\relates StdMap
-  template<typename K, typename V, typename Compare> 
-  inline StdMap<K, V, Compare> stdMap(const V& value = V()) {
-    return StdMap<K, V, Compare>(value);
-  }
-  
-  ///Returns a \c StdMap class
-
-  ///This function just returns a \c StdMap class with specified 
-  ///default value.
-  ///\relates StdMap
-  template<typename K, typename V> 
-  inline StdMap<K, V, std::less<K> > stdMap(const V& value = V()) {
-    return StdMap<K, V, std::less<K> >(value);
-  }
-  
-  ///Returns a \c StdMap class created from an appropriate std::map
-
-  ///This function just returns a \c StdMap class created from an 
-  ///appropriate std::map.
-  ///\relates StdMap
-  template<typename K, typename V, typename Compare> 
-  inline StdMap<K, V, Compare> stdMap( const std::map<K, V, Compare> &map, 
-                                       const V& value = V() ) {
-    return StdMap<K, V, Compare>(map, value);
-  }
-
-  ///Returns a \c StdMap class created from an appropriate std::map
-
-  ///This function just returns a \c StdMap class created from an 
-  ///appropriate std::map.
-  ///\relates StdMap
-  template<typename K, typename V> 
-  inline StdMap<K, V, std::less<K> > stdMap( const std::map<K, V, std::less<K> > &map, 
-                                             const V& value = V() ) {
-    return StdMap<K, V, std::less<K> >(map, value);
-  }
-
-  /// \brief Map for storing values for keys from the range <tt>[0..size-1]</tt>
-  ///
-  /// This 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.
-  /// This map meets the \ref concepts::ReferenceMap "ReferenceMap" concept.
-  ///
-  /// \todo Revise its name
-  template <typename T>
-  class IntegerMap : public MapBase<int, T> {
-
-    template <typename T1>
-    friend class IntegerMap;
-
-  public:
-
-    typedef MapBase<int, T> Parent;
-    ///\e
-    typedef typename Parent::Key Key;
-    ///\e
-    typedef typename Parent::Value Value;
-    ///\e
-    typedef T& Reference;
-    ///\e
-    typedef const T& ConstReference;
-
-    typedef True ReferenceMapTag;
-
-  private:
-    
-    typedef std::vector<T> Vector;
-    Vector _vector;
-
-  public:
-
-    /// Constructor with specified default value
-    IntegerMap(int size = 0, const T& value = T()) : _vector(size, value) {}
-
-    /// \brief Constructs the map from an appropriate \c std::vector.
-    template <typename T1>
-    IntegerMap(const std::vector<T1>& vector) 
-      : _vector(vector.begin(), vector.end()) {}
-    
-    /// \brief Constructs a map from an other \ref IntegerMap.
-    template <typename T1>
-    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);
-    }
-
-  private:
-
-    IntegerMap& operator=(const IntegerMap&);
-
-  public:
-
-    ///\e
-    Reference operator[](Key k) {
-      return _vector[k];
-    }
-
-    /// \e 
-    ConstReference operator[](Key k) const {
-      return _vector[k];
-    }
-
-    /// \e 
-    void set(const Key &k, const T& t) {
-      _vector[k] = t;
-    }
-
-  };
-  
-  ///Returns an \c IntegerMap class
-
-  ///This function just returns an \c IntegerMap class.
-  ///\relates IntegerMap
-  template<typename T>
-  inline IntegerMap<T> integerMap(int size = 0, const T& value = T()) {
-    return IntegerMap<T>(size, value);
+    }
+  };
+
+  /// Returns a \ref SparseMap class
+
+  /// This function just returns a \ref SparseMap class with specified
+  /// default value.
+  /// \relates SparseMap
+  template<typename K, typename V, typename Compare>
+  inline SparseMap<K, V, Compare> sparseMap(const V& value = V()) {
+    return SparseMap<K, V, Compare>(value);
+  }
+
+  template<typename K, typename V>
+  inline SparseMap<K, V, std::less<K> > sparseMap(const V& value = V()) {
+    return SparseMap<K, V, std::less<K> >(value);
+  }
+
+  /// \brief Returns a \ref SparseMap class created from an appropriate
+  /// \c std::map
+
+  /// This function just returns a \ref SparseMap class created from an
+  /// appropriate \c std::map.
+  /// \relates SparseMap
+  template<typename K, typename V, typename Compare>
+  inline SparseMap<K, V, Compare>
+    sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
+  {
+    return SparseMap<K, V, Compare>(map, value);
   }
 
@@ -379,78 +463,210 @@
   /// @{
 
-  /// \brief Identity map.
-  ///
-  /// This map gives back the given key as value without any
-  /// modification. 
-  template <typename T>
-  class IdentityMap : public MapBase<T, T> {
-  public:
-    typedef MapBase<T, T> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    /// \e
-    const T& operator[](const T& t) const {
-      return t;
-    }
-  };
-
-  ///Returns an \c IdentityMap class
-
-  ///This function just returns an \c IdentityMap class.
-  ///\relates IdentityMap
-  template<typename T>
-  inline IdentityMap<T> identityMap() {
-    return IdentityMap<T>();
-  }
-  
-
-  ///\brief Convert the \c Value of a map to another type using
-  ///the default conversion.
-  ///
-  ///This \ref 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> {
-    const M& m;
-  public:
-    typedef MapBase<typename M::Key, T> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-
-    ///Constructor.
-    ///\param _m is the underlying map.
-    ConvertMap(const M &_m) : m(_m) {};
-
-    ///\e
-    Value operator[](const Key& k) const {return m[k];}
-  };
-  
-  ///Returns a \c ConvertMap class
-
-  ///This function just returns a \c ConvertMap class.
-  ///\relates ConvertMap
-  template<typename T, typename M>
-  inline ConvertMap<M, T> convertMap(const M &m) {
-    return ConvertMap<M, T>(m);
-  }
-
-  ///Simple wrapping of a map
-
-  ///This \ref 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.
-  ///
-  ///\sa SimpleWriteMap
-  ///
-  /// \todo Revise the misleading name 
-  template<typename M> 
-  class SimpleMap : public MapBase<typename M::Key, typename M::Value> {
-    const M& m;
-
+  /// Composition of two maps
+
+  /// This \ref concepts::ReadMap "read only map" returns the
+  /// composition of two given maps. That is to say, if \c m1 is of
+  /// type \c M1 and \c m2 is of \c M2, then for
+  /// \code
+  ///   ComposeMap<M1, M2> cm(m1,m2);
+  /// \endcode
+  /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
+  ///
+  /// The \c Key type of the map is inherited from \c M2 and the
+  /// \c Value type is from \c M1.
+  /// \c M2::Value must be convertible to \c M1::Key.
+  ///
+  /// The simplest way of using this map is through the composeMap()
+  /// function.
+  ///
+  /// \sa CombineMap
+  ///
+  /// \todo Check the requirements.
+  template <typename M1, typename M2>
+  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
+    const M1 &_m1;
+    const M2 &_m2;
+  public:
+    typedef MapBase<typename M2::Key, typename M1::Value> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+    ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
+
+    /// \e
+    typename MapTraits<M1>::ConstReturnValue
+    operator[](const Key &k) const { return _m1[_m2[k]]; }
+  };
+
+  /// Returns a \ref ComposeMap class
+
+  /// This function just returns a \ref ComposeMap class.
+  ///
+  /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
+  /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
+  /// will be equal to <tt>m1[m2[x]]</tt>.
+  ///
+  /// \relates ComposeMap
+  template <typename M1, typename M2>
+  inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
+    return ComposeMap<M1, M2>(m1, m2);
+  }
+
+
+  /// Combination of two maps using an STL (binary) functor.
+
+  /// This \ref concepts::ReadMap "read only map" takes two maps and a
+  /// binary functor and returns the combination of the two given maps
+  /// using the functor.
+  /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
+  /// and \c f is of \c F, then for
+  /// \code
+  ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
+  /// \endcode
+  /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
+  ///
+  /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
+  /// must be convertible to \c M2::Key) and the \c Value type 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 to \c V.
+  ///
+  /// The simplest way of using this map is through the combineMap()
+  /// function.
+  ///
+  /// \sa ComposeMap
+  ///
+  /// \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> {
+    const M1 &_m1;
+    const M2 &_m2;
+    F _f;
+  public:
+    typedef MapBase<typename M1::Key, V> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+    CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
+      : _m1(m1), _m2(m2), _f(f) {}
+    /// \e
+    Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
+  };
+
+  /// Returns a \ref CombineMap class
+
+  /// This function just returns a \ref CombineMap class.
+  ///
+  /// For example, if \c m1 and \c m2 are both maps with \c double
+  /// values, then
+  /// \code
+  ///   combineMap(m1,m2,std::plus<double>())
+  /// \endcode
+  /// is equivalent to
+  /// \code
+  ///   addMap(m1,m2)
+  /// \endcode
+  ///
+  /// This function is specialized for adaptable binary function
+  /// classes and C++ functions.
+  ///
+  /// \relates CombineMap
+  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);
+  }
+
+
+  /// Converts an STL style (unary) functor to a map
+
+  /// This \ref concepts::ReadMap "read only map" returns the value
+  /// of a given functor. Actually, it just wraps the functor and
+  /// provides the \c Key and \c Value typedefs.
+  ///
+  /// Template parameters \c K and \c V will become its \c Key and
+  /// \c Value. In most cases they have to be given explicitly because
+  /// a functor typically does not provide \c argument_type and
+  /// \c result_type typedefs.
+  /// Parameter \c F is the type of the used functor.
+  ///
+  /// The simplest way of using this map is through the functorToMap()
+  /// function.
+  ///
+  /// \sa MapToFunctor
+  template<typename F,
+	   typename K = typename F::argument_type,
+	   typename V = typename F::result_type>
+  class FunctorToMap : public MapBase<K, V> {
+    const F &_f;
+  public:
+    typedef MapBase<K, V> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+    FunctorToMap(const F &f = F()) : _f(f) {}
+    /// \e
+    Value operator[](const Key &k) const { return _f(k); }
+  };
+
+  /// Returns a \ref FunctorToMap class
+
+  /// This function just returns a \ref FunctorToMap class.
+  ///
+  /// This function is specialized for adaptable binary function
+  /// classes and C++ functions.
+  ///
+  /// \relates FunctorToMap
+  template<typename K, typename V, typename F>
+  inline FunctorToMap<F, K, V> functorToMap(const F &f) {
+    return FunctorToMap<F, K, V>(f);
+  }
+
+  template <typename F>
+  inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
+    functorToMap(const F &f)
+  {
+    return FunctorToMap<F, typename F::argument_type,
+      typename F::result_type>(f);
+  }
+
+  template <typename K, typename V>
+  inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
+    return FunctorToMap<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 usual
+  /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
+  /// and the \c Key and \c Value typedefs also exist.
+  ///
+  /// The simplest way of using this map is through the mapToFunctor()
+  /// function.
+  ///
+  ///\sa FunctorToMap
+  template <typename M>
+  class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
+    const M &_m;
   public:
     typedef MapBase<typename M::Key, typename M::Value> Parent;
@@ -458,33 +674,118 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    SimpleMap(const M &_m) : m(_m) {};
-    ///\e
-    Value operator[](Key k) const {return m[k];}
-  };
-  
-  ///Returns a \c SimpleMap class
-
-  ///This function just returns a \c SimpleMap class.
-  ///\relates SimpleMap
+    typedef typename Parent::Key argument_type;
+    typedef typename Parent::Value result_type;
+
+    /// Constructor
+    MapToFunctor(const M &m) : _m(m) {}
+    /// \e
+    Value operator()(const Key &k) const { return _m[k]; }
+    /// \e
+    Value operator[](const Key &k) const { return _m[k]; }
+  };
+
+  /// Returns a \ref MapToFunctor class
+
+  /// This function just returns a \ref MapToFunctor class.
+  /// \relates MapToFunctor
   template<typename M>
-  inline SimpleMap<M> simpleMap(const M &m) {
-    return SimpleMap<M>(m);
-  }
-
-  ///Simple writable wrapping of a map
-
-  ///This \ref concepts::ReadWriteMap "read-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.
-  ///
-  ///\sa SimpleMap
-  ///
-  /// \todo Revise the misleading name
-  template<typename M> 
-  class SimpleWriteMap : public MapBase<typename M::Key, typename M::Value> {
-    M& m;
-
+  inline MapToFunctor<M> mapToFunctor(const M &m) {
+    return MapToFunctor<M>(m);
+  }
+
+
+  /// \brief Map adaptor to convert the \c Value type of a map to
+  /// another type using the default conversion.
+
+  /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
+  /// "readable map" to another type using the default conversion.
+  /// The \c Key type of it is inherited from \c M and the \c Value
+  /// type is \c V.
+  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
+  ///
+  /// The simplest way of using this map is through the convertMap()
+  /// function.
+  template <typename M, typename V>
+  class ConvertMap : public MapBase<typename M::Key, V> {
+    const M &_m;
+  public:
+    typedef MapBase<typename M::Key, V> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+
+    /// Constructor.
+    /// \param m The underlying map.
+    ConvertMap(const M &m) : _m(m) {}
+
+    /// \e
+    Value operator[](const Key &k) const { return _m[k]; }
+  };
+
+  /// Returns a \ref ConvertMap class
+
+  /// This function just returns a \ref ConvertMap class.
+  /// \relates ConvertMap
+  template<typename V, typename M>
+  inline ConvertMap<M, V> convertMap(const M &map) {
+    return ConvertMap<M, V>(map);
+  }
+
+
+  /// Applies all map setting operations to two maps
+
+  /// This map has two \ref concepts::WriteMap "writable map" parameters
+  /// and each write request will be passed to both of them.
+  /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
+  /// operations will return the corresponding values of \c M1.
+  ///
+  /// The \c Key and \c Value types are inherited from \c M1.
+  /// The \c Key and \c Value of \c M2 must be convertible from those
+  /// of \c M1.
+  ///
+  /// The simplest way of using this map is through the forkMap()
+  /// function.
+  template<typename  M1, typename M2>
+  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
+    M1 &_m1;
+    M2 &_m2;
+  public:
+    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+    ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
+    /// Returns the value associated with the given key in the first map.
+    Value operator[](const Key &k) const { return _m1[k]; }
+    /// Sets the value associated with the given key in both maps.
+    void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
+  };
+
+  /// Returns a \ref ForkMap class
+
+  /// This function just returns a \ref ForkMap class.
+  /// \relates ForkMap
+  template <typename M1, typename M2>
+  inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
+    return ForkMap<M1,M2>(m1,m2);
+  }
+
+
+  /// Simple wrapping of a map
+
+  /// This \ref 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.
+  ///
+  /// The simplest way of using this map is through the wrapMap()
+  /// function.
+  ///
+  /// \sa WrapWriteMap
+  template<typename M>
+  class WrapMap : public MapBase<typename M::Key, typename M::Value> {
+    const M &_m;
   public:
     typedef MapBase<typename M::Key, typename M::Value> Parent;
@@ -492,32 +793,80 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    SimpleWriteMap(M &_m) : m(_m) {};
-    ///\e
-    Value operator[](Key k) const {return m[k];}
-    ///\e
-    void set(Key k, const Value& c) { m.set(k, c); }
-  };
-
-  ///Returns a \c SimpleWriteMap class
-
-  ///This function just returns a \c SimpleWriteMap class.
-  ///\relates SimpleWriteMap
+    /// Constructor
+    WrapMap(const M &m) : _m(m) {}
+    /// \e
+    Value operator[](const Key &k) const { return _m[k]; }
+  };
+
+  /// Returns a \ref WrapMap class
+
+  /// This function just returns a \ref WrapMap class.
+  /// \relates WrapMap
   template<typename M>
-  inline SimpleWriteMap<M> simpleWriteMap(M &m) {
-    return SimpleWriteMap<M>(m);
-  }
-
-  ///Sum of two maps
-
-  ///This \ref concepts::ReadMap "read only map" returns the sum 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> 
+  inline WrapMap<M> wrapMap(const M &map) {
+    return WrapMap<M>(map);
+  }
+
+
+  /// Simple writable wrapping of a map
+
+  /// This \ref concepts::ReadWriteMap "read-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.
+  ///
+  /// The simplest way of using this map is through the wrapWriteMap()
+  /// function.
+  ///
+  /// \sa WrapMap
+  template<typename M>
+  class WrapWriteMap : public MapBase<typename M::Key, typename M::Value> {
+    M &_m;
+  public:
+    typedef MapBase<typename M::Key, typename M::Value> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+    WrapWriteMap(M &m) : _m(m) {}
+    /// \e
+    Value operator[](const Key &k) const { return _m[k]; }
+    /// \e
+    void set(const Key &k, const Value &c) { _m.set(k, c); }
+  };
+
+  ///Returns a \ref WrapWriteMap class
+
+  ///This function just returns a \ref WrapWriteMap class.
+  ///\relates WrapWriteMap
+  template<typename M>
+  inline WrapWriteMap<M> wrapWriteMap(M &map) {
+    return WrapWriteMap<M>(map);
+  }
+
+
+  /// Sum of two maps
+
+  /// This \ref concepts::ReadMap "read only map" returns the sum
+  /// of the values of the two given maps.
+  /// Its \c Key and \c Value types are inherited from \c M1.
+  /// The \c Key and \c Value of \c M2 must be convertible to those of
+  /// \c M1.
+  ///
+  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
+  /// \code
+  ///   AddMap<M1,M2> am(m1,m2);
+  /// \endcode
+  /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
+  ///
+  /// The simplest way of using this map is through the addMap()
+  /// function.
+  ///
+  /// \sa SubMap, MulMap, DivMap
+  /// \sa ShiftMap, ShiftWriteMap
+  template<typename M1, typename M2>
   class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
-    const M1& m1;
-    const M2& m2;
-
+    const M1 &_m1;
+    const M2 &_m2;
   public:
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
@@ -525,115 +874,47 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
-    ///\e
-    Value operator[](Key k) const {return m1[k]+m2[k];}
-  };
-  
-  ///Returns an \c AddMap class
-
-  ///This function just returns an \c AddMap class.
-  ///\todo Extend the documentation: how to call these type of functions?
-  ///
-  ///\relates AddMap
-  template<typename M1, typename M2> 
-  inline AddMap<M1, M2> addMap(const M1 &m1,const M2 &m2) {
+    /// Constructor
+    AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
+    /// \e
+    Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
+  };
+
+  /// Returns an \ref AddMap class
+
+  /// This function just returns an \ref AddMap class.
+  ///
+  /// For example, if \c m1 and \c m2 are both maps with \c double
+  /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
+  /// <tt>m1[x]+m2[x]</tt>.
+  ///
+  /// \relates AddMap
+  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 \ref 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.
-  ///
-  ///Actually,
-  ///\code
-  ///  ShiftMap<X> sh(x,v);
-  ///\endcode
-  ///is equivalent to
-  ///\code
-  ///  ConstMap<X::Key, X::Value> c_tmp(v);
-  ///  AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
-  ///\endcode
-  ///
-  ///\sa ShiftWriteMap
-  template<typename M, typename C = typename M::Value> 
-  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
-    const M& m;
-    C v;
-  public:
-    typedef MapBase<typename M::Key, typename M::Value> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-
-    ///Constructor.
-    ///\param _m is the undelying map.
-    ///\param _v is the shift value.
-    ShiftMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
-    ///\e
-    Value operator[](Key k) const {return m[k] + v;}
-  };
-
-  ///Shift a map with a constant (ReadWrite version).
-
-  ///This \ref 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.
-  ///
-  ///\sa ShiftMap
-  template<typename M, typename C = typename M::Value> 
-  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
-    M& m;
-    C v;
-  public:
-    typedef MapBase<typename M::Key, typename M::Value> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-
-    ///Constructor.
-    ///\param _m is the undelying map.
-    ///\param _v is the shift value.
-    ShiftWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
-    /// \e
-    Value operator[](Key k) const {return m[k] + v;}
-    /// \e
-    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.
-  ///\relates ShiftMap
-  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 \ref 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> 
+
+  /// Difference of two maps
+
+  /// This \ref concepts::ReadMap "read only map" returns the difference
+  /// of the values of the two given maps.
+  /// Its \c Key and \c Value types are inherited from \c M1.
+  /// The \c Key and \c Value of \c M2 must be convertible to those of
+  /// \c M1.
+  ///
+  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
+  /// \code
+  ///   SubMap<M1,M2> sm(m1,m2);
+  /// \endcode
+  /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
+  ///
+  /// The simplest way of using this map is through the subMap()
+  /// function.
+  ///
+  /// \sa AddMap, MulMap, DivMap
+  template<typename M1, typename M2>
   class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
-    const M1& m1;
-    const M2& m2;
+    const M1 &_m1;
+    const M2 &_m2;
   public:
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
@@ -641,30 +922,48 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    SubMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
-    /// \e
-    Value operator[](Key k) const {return m1[k]-m2[k];}
-  };
-  
-  ///Returns a \c SubMap class
-
-  ///This function just returns a \c SubMap class.
-  ///
-  ///\relates SubMap
-  template<typename M1, typename M2> 
+    /// Constructor
+    SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
+    /// \e
+    Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
+  };
+
+  /// Returns a \ref SubMap class
+
+  /// This function just returns a \ref SubMap class.
+  ///
+  /// For example, if \c m1 and \c m2 are both maps with \c double
+  /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
+  /// <tt>m1[x]-m2[x]</tt>.
+  ///
+  /// \relates SubMap
+  template<typename M1, typename M2>
   inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
-    return SubMap<M1, M2>(m1, m2);
-  }
-
-  ///Product of two maps
-
-  ///This \ref 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> 
+    return SubMap<M1, M2>(m1,m2);
+  }
+
+
+  /// Product of two maps
+
+  /// This \ref concepts::ReadMap "read only map" returns the product
+  /// of the values of the two given maps.
+  /// Its \c Key and \c Value types are inherited from \c M1.
+  /// The \c Key and \c Value of \c M2 must be convertible to those of
+  /// \c M1.
+  ///
+  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
+  /// \code
+  ///   MulMap<M1,M2> mm(m1,m2);
+  /// \endcode
+  /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
+  ///
+  /// The simplest way of using this map is through the mulMap()
+  /// function.
+  ///
+  /// \sa AddMap, SubMap, DivMap
+  /// \sa ScaleMap, ScaleWriteMap
+  template<typename M1, typename M2>
   class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
-    const M1& m1;
-    const M2& m2;
+    const M1 &_m1;
+    const M2 &_m2;
   public:
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
@@ -672,113 +971,47 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
-    /// \e
-    Value operator[](Key k) const {return m1[k]*m2[k];}
-  };
-  
-  ///Returns a \c MulMap class
-
-  ///This function just returns a \c MulMap class.
-  ///\relates MulMap
-  template<typename M1, typename M2> 
+    /// Constructor
+    MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
+    /// \e
+    Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
+  };
+
+  /// Returns a \ref MulMap class
+
+  /// This function just returns a \ref MulMap class.
+  ///
+  /// For example, if \c m1 and \c m2 are both maps with \c double
+  /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
+  /// <tt>m1[x]*m2[x]</tt>.
+  ///
+  /// \relates MulMap
+  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 \ref 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.
-  ///
-  ///Actually,
-  ///\code
-  ///  ScaleMap<X> sc(x,v);
-  ///\endcode
-  ///is equivalent to
-  ///\code
-  ///  ConstMap<X::Key, X::Value> c_tmp(v);
-  ///  MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v);
-  ///\endcode
-  ///
-  ///\sa ScaleWriteMap
-  template<typename M, typename C = typename M::Value> 
-  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
-    const M& m;
-    C v;
-  public:
-    typedef MapBase<typename M::Key, typename M::Value> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-
-    ///Constructor.
-    ///\param _m is the undelying map.
-    ///\param _v is the scaling value.
-    ScaleMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
-    /// \e
-    Value operator[](Key k) const {return v * m[k];}
-  };
-
-  ///Scales a map with a constant (ReadWrite version).
-
-  ///This \ref 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.
-  ///
-  ///\sa ScaleMap
-  template<typename M, typename C = typename M::Value> 
-  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
-    M& m;
-    C v;
-  public:
-    typedef MapBase<typename M::Key, typename M::Value> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-
-    ///Constructor.
-    ///\param _m is the undelying map.
-    ///\param _v is the scaling value.
-    ScaleWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
-    /// \e
-    Value operator[](Key k) const {return v * m[k];}
-    /// \e
-    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.
-  ///\relates ScaleMap
-  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);
-  }
-
-  ///Quotient of two maps
-
-  ///This \ref 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> 
+
+
+  /// Quotient of two maps
+
+  /// This \ref concepts::ReadMap "read only map" returns the quotient
+  /// of the values of the two given maps.
+  /// Its \c Key and \c Value types are inherited from \c M1.
+  /// The \c Key and \c Value of \c M2 must be convertible to those of
+  /// \c M1.
+  ///
+  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
+  /// \code
+  ///   DivMap<M1,M2> dm(m1,m2);
+  /// \endcode
+  /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
+  ///
+  /// The simplest way of using this map is through the divMap()
+  /// function.
+  ///
+  /// \sa AddMap, SubMap, MulMap
+  template<typename M1, typename M2>
   class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
-    const M1& m1;
-    const M2& m2;
+    const M1 &_m1;
+    const M2 &_m2;
   public:
     typedef MapBase<typename M1::Key, typename M1::Value> Parent;
@@ -786,154 +1019,250 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
-    /// \e
-    Value operator[](Key k) const {return m1[k]/m2[k];}
-  };
-  
-  ///Returns a \c DivMap class
-
-  ///This function just returns a \c DivMap class.
-  ///\relates DivMap
-  template<typename M1, typename M2> 
+    /// Constructor
+    DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
+    /// \e
+    Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
+  };
+
+  /// Returns a \ref DivMap class
+
+  /// This function just returns a \ref DivMap class.
+  ///
+  /// For example, if \c m1 and \c m2 are both maps with \c double
+  /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
+  /// <tt>m1[x]/m2[x]</tt>.
+  ///
+  /// \relates DivMap
+  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 \ref concepts::ReadMap "read only map" returns the composition of
-  ///two given maps.
-  ///That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2,
-  ///then for
-  ///\code
-  ///  ComposeMap<M1, M2> cm(m1,m2);
-  ///\endcode
-  /// <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.
-  ///
-  ///\sa CombineMap
-  ///
-  ///\todo Check the requirements.
-  template <typename M1, typename M2> 
-  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
-    const M1& m1;
-    const M2& m2;
-  public:
-    typedef MapBase<typename M2::Key, typename M1::Value> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-    ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
-    
-    /// \e
-
-
-    /// \todo Use the  MapTraits once it is ported.
-    ///
-
-    //typename MapTraits<M1>::ConstReturnValue
-    typename M1::Value
-    operator[](Key k) const {return m1[m2[k]];}
-  };
-
-  ///Returns a \c ComposeMap class
-
-  ///This function just returns a \c ComposeMap class.
-  ///\relates ComposeMap
-  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 \ref 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
-  ///\code
-  ///  CombineMap<M1,M2,F,V> cm(m1,m2,f);
-  ///\endcode
-  /// <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
-  ///to \c V.
-  ///
-  ///\sa ComposeMap
-  ///
-  ///\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> {
-    const M1& m1;
-    const M2& m2;
-    F f;
-  public:
-    typedef MapBase<typename M1::Key, V> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-    CombineMap(const M1 &_m1,const M2 &_m2,const F &_f = F())
-      : m1(_m1), m2(_m2), f(_f) {};
-    /// \e
-    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 
-  ///\code
-  ///combineMap(m1,m2,std::plus<double>())
-  ///\endcode
-  ///is equivalent to
-  ///\code
-  ///addMap(m1,m2)
-  ///\endcode
-  ///
-  ///This function is specialized for adaptable binary function
-  ///classes and C++ functions.
-  ///
-  ///\relates CombineMap
-  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 \ref 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.
-  ///
-  ///\sa NegWriteMap
-  template<typename M> 
+
+
+  /// Shifts a map with a constant.
+
+  /// This \ref concepts::ReadMap "read only map" returns the sum of
+  /// the given map and a constant value (i.e. it shifts the map with
+  /// the constant). Its \c Key and \c Value are inherited from \c M.
+  ///
+  /// Actually,
+  /// \code
+  ///   ShiftMap<M> sh(m,v);
+  /// \endcode
+  /// is equivalent to
+  /// \code
+  ///   ConstMap<M::Key, M::Value> cm(v);
+  ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
+  /// \endcode
+  ///
+  /// The simplest way of using this map is through the shiftMap()
+  /// function.
+  ///
+  /// \sa ShiftWriteMap
+  template<typename M, typename C = typename M::Value>
+  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
+    const M &_m;
+    C _v;
+  public:
+    typedef MapBase<typename M::Key, typename M::Value> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+
+    /// Constructor.
+    /// \param m The undelying map.
+    /// \param v The constant value.
+    ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
+    /// \e
+    Value operator[](const Key &k) const { return _m[k]+_v; }
+  };
+
+  /// Shifts a map with a constant (read-write version).
+
+  /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
+  /// of the given map and a constant value (i.e. it shifts the map with
+  /// the constant). Its \c Key and \c Value are inherited from \c M.
+  /// It makes also possible to write the map.
+  ///
+  /// The simplest way of using this map is through the shiftWriteMap()
+  /// function.
+  ///
+  /// \sa ShiftMap
+  template<typename M, typename C = typename M::Value>
+  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
+    M &_m;
+    C _v;
+  public:
+    typedef MapBase<typename M::Key, typename M::Value> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+
+    /// Constructor.
+    /// \param m The undelying map.
+    /// \param v The constant value.
+    ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
+    /// \e
+    Value operator[](const Key &k) const { return _m[k]+_v; }
+    /// \e
+    void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
+  };
+
+  /// Returns a \ref ShiftMap class
+
+  /// This function just returns a \ref ShiftMap class.
+  ///
+  /// For example, if \c m is a map with \c double values and \c v is
+  /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
+  /// <tt>m[x]+v</tt>.
+  ///
+  /// \relates ShiftMap
+  template<typename M, typename C>
+  inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
+    return ShiftMap<M, C>(m,v);
+  }
+
+  /// Returns a \ref ShiftWriteMap class
+
+  /// This function just returns a \ref ShiftWriteMap class.
+  ///
+  /// For example, if \c m is a map with \c double values and \c v is
+  /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
+  /// <tt>m[x]+v</tt>.
+  /// Moreover it makes also possible to write the map.
+  ///
+  /// \relates ShiftWriteMap
+  template<typename M, typename C>
+  inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
+    return ShiftWriteMap<M, C>(m,v);
+  }
+
+
+  /// Scales a map with a constant.
+
+  /// This \ref 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.
+  ///
+  /// Actually,
+  /// \code
+  ///   ScaleMap<M> sc(m,v);
+  /// \endcode
+  /// is equivalent to
+  /// \code
+  ///   ConstMap<M::Key, M::Value> cm(v);
+  ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
+  /// \endcode
+  ///
+  /// The simplest way of using this map is through the scaleMap()
+  /// function.
+  ///
+  /// \sa ScaleWriteMap
+  template<typename M, typename C = typename M::Value>
+  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
+    const M &_m;
+    C _v;
+  public:
+    typedef MapBase<typename M::Key, typename M::Value> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+
+    /// Constructor.
+    /// \param m The undelying map.
+    /// \param v The constant value.
+    ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
+    /// \e
+    Value operator[](const Key &k) const { return _v*_m[k]; }
+  };
+
+  /// Scales a map with a constant (read-write version).
+
+  /// This \ref concepts::ReadWriteMap "read-write 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.
+  /// 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.
+  ///
+  /// The simplest way of using this map is through the scaleWriteMap()
+  /// function.
+  ///
+  /// \sa ScaleMap
+  template<typename M, typename C = typename M::Value>
+  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
+    M &_m;
+    C _v;
+  public:
+    typedef MapBase<typename M::Key, typename M::Value> Parent;
+    typedef typename Parent::Key Key;
+    typedef typename Parent::Value Value;
+
+    /// Constructor
+
+    /// Constructor.
+    /// \param m The undelying map.
+    /// \param v The constant value.
+    ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
+    /// \e
+    Value operator[](const Key &k) const { return _v*_m[k]; }
+    /// \e
+    void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
+  };
+
+  /// Returns a \ref ScaleMap class
+
+  /// This function just returns a \ref ScaleMap class.
+  ///
+  /// For example, if \c m is a map with \c double values and \c v is
+  /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
+  /// <tt>v*m[x]</tt>.
+  ///
+  /// \relates ScaleMap
+  template<typename M, typename C>
+  inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
+    return ScaleMap<M, C>(m,v);
+  }
+
+  /// Returns a \ref ScaleWriteMap class
+
+  /// This function just returns a \ref ScaleWriteMap class.
+  ///
+  /// For example, if \c m is a map with \c double values and \c v is
+  /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
+  /// <tt>v*m[x]</tt>.
+  /// Moreover it makes also possible to write the map.
+  ///
+  /// \relates ScaleWriteMap
+  template<typename M, typename C>
+  inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
+    return ScaleWriteMap<M, C>(m,v);
+  }
+
+
+  /// Negative of a map
+
+  /// This \ref concepts::ReadMap "read only map" returns the negative
+  /// of the values of the given map (using the unary \c - operator).
+  /// Its \c Key and \c Value are inherited from \c M.
+  ///
+  /// If M::Value is \c int, \c double etc., then
+  /// \code
+  ///   NegMap<M> neg(m);
+  /// \endcode
+  /// is equivalent to
+  /// \code
+  ///   ScaleMap<M> neg(m,-1);
+  /// \endcode
+  ///
+  /// The simplest way of using this map is through the negMap()
+  /// function.
+  ///
+  /// \sa NegWriteMap
+  template<typename M>
   class NegMap : public MapBase<typename M::Key, typename M::Value> {
-    const M& m;
+    const M& _m;
   public:
     typedef MapBase<typename M::Key, typename M::Value> Parent;
@@ -941,21 +1270,34 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    NegMap(const M &_m) : m(_m) {};
-    /// \e
-    Value operator[](Key k) const {return -m[k];}
-  };
-  
-  ///Negative value of a map (ReadWrite version)
-
-  ///This \ref 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.
+    /// Constructor
+    NegMap(const M &m) : _m(m) {}
+    /// \e
+    Value operator[](const Key &k) const { return -_m[k]; }
+  };
+
+  /// Negative of a map (read-write version)
+
+  /// This \ref concepts::ReadWriteMap "read-write map" returns the
+  /// negative of the values of the given map (using the unary \c -
+  /// operator).
+  /// Its \c Key and \c Value are inherited from \c M.
+  /// It makes also possible to write the map.
+  ///
+  /// If M::Value is \c int, \c double etc., then
+  /// \code
+  ///   NegWriteMap<M> neg(m);
+  /// \endcode
+  /// is equivalent to
+  /// \code
+  ///   ScaleWriteMap<M> neg(m,-1);
+  /// \endcode
+  ///
+  /// The simplest way of using this map is through the negWriteMap()
+  /// function.
   ///
   /// \sa NegMap
-  template<typename M> 
+  template<typename M>
   class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
-    M& m;
+    M &_m;
   public:
     typedef MapBase<typename M::Key, typename M::Value> Parent;
@@ -963,40 +1305,53 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    NegWriteMap(M &_m) : m(_m) {};
-    /// \e
-    Value operator[](Key k) const {return -m[k];}
-    /// \e
-    void set(Key k, const Value& v) { m.set(k, -v); }
-  };
-
-  ///Returns a \c NegMap class
-
-  ///This function just returns a \c NegMap class.
-  ///\relates NegMap
-  template <typename M> 
+    /// Constructor
+    NegWriteMap(M &m) : _m(m) {}
+    /// \e
+    Value operator[](const Key &k) const { return -_m[k]; }
+    /// \e
+    void set(const Key &k, const Value &v) { _m.set(k, -v); }
+  };
+
+  /// Returns a \ref NegMap class
+
+  /// This function just returns a \ref NegMap class.
+  ///
+  /// For example, if \c m is a map with \c double values, then
+  /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
+  ///
+  /// \relates NegMap
+  template <typename M>
   inline NegMap<M> negMap(const M &m) {
     return NegMap<M>(m);
   }
 
-  ///Returns a \c NegWriteMap class
-
-  ///This function just returns a \c NegWriteMap class.
-  ///\relates NegWriteMap
-  template <typename M> 
-  inline NegWriteMap<M> negMap(M &m) {
+  /// Returns a \ref NegWriteMap class
+
+  /// This function just returns a \ref NegWriteMap class.
+  ///
+  /// For example, if \c m is a map with \c double values, then
+  /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
+  /// Moreover it makes also possible to write the map.
+  ///
+  /// \relates NegWriteMap
+  template <typename M>
+  inline NegWriteMap<M> negWriteMap(M &m) {
     return NegWriteMap<M>(m);
   }
 
-  ///Absolute value of a map
-
-  ///This \ref 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.
-  template<typename M> 
+
+  /// Absolute value of a map
+
+  /// This \ref concepts::ReadMap "read only map" returns the absolute
+  /// value of the values of 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.
+  ///
+  /// The simplest way of using this map is through the absMap()
+  /// function.
+  template<typename M>
   class AbsMap : public MapBase<typename M::Key, typename M::Value> {
-    const M& m;
+    const M &_m;
   public:
     typedef MapBase<typename M::Key, typename M::Value> Parent;
@@ -1004,206 +1359,43 @@
     typedef typename Parent::Value Value;
 
-    ///Constructor
-    AbsMap(const M &_m) : m(_m) {};
-    /// \e
-    Value operator[](Key k) const {
-      Value tmp = m[k]; 
+    /// Constructor
+    AbsMap(const M &m) : _m(m) {}
+    /// \e
+    Value operator[](const Key &k) const {
+      Value tmp = _m[k];
       return tmp >= 0 ? tmp : -tmp;
     }
 
   };
-  
-  ///Returns an \c AbsMap class
-
-  ///This function just returns an \c AbsMap class.
-  ///\relates AbsMap
-  template<typename M> 
+
+  /// Returns an \ref AbsMap class
+
+  /// This function just returns an \ref AbsMap class.
+  ///
+  /// For example, if \c m is a map with \c double values, then
+  /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
+  /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
+  /// negative.
+  ///
+  /// \relates AbsMap
+  template<typename M>
   inline AbsMap<M> absMap(const M &m) {
     return AbsMap<M>(m);
   }
 
-  ///Converts an STL style functor to a map
-
-  ///This \ref concepts::ReadMap "read only map" returns the value
-  ///of a given functor.
-  ///
-  ///Template parameters \c K and \c V will become its
-  ///\c Key and \c Value. 
-  ///In most cases they have to be given explicitly because a 
-  ///functor typically does not provide \c argument_type and 
-  ///\c result_type typedefs.
-  ///
-  ///Parameter \c F is the type of the used functor.
-  ///
-  ///\sa MapFunctor
-  template<typename F, 
-	   typename K = typename F::argument_type, 
-	   typename V = typename F::result_type> 
-  class FunctorMap : public MapBase<K, V> {
-    F f;
-  public:
-    typedef MapBase<K, V> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-    FunctorMap(const F &_f = F()) : f(_f) {}
-    /// \e
-    Value operator[](Key k) const { return f(k);}
-  };
-  
-  ///Returns a \c FunctorMap class
-
-  ///This function just returns a \c FunctorMap class.
-  ///
-  ///This function is specialized for adaptable binary function
-  ///classes and C++ functions.
-  ///
-  ///\relates FunctorMap
-  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> 
-  functorMap(const F &f) {
-    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 \ref concepts::ReadMap "readable map",
-  ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist.
-  ///
-  ///\sa FunctorMap
-  template <typename M> 
-  class MapFunctor : public MapBase<typename M::Key, typename M::Value> {
-    const M& m;
-  public:
-    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;
-
-    ///Constructor
-    MapFunctor(const M &_m) : m(_m) {};
-    ///\e
-    Value operator()(Key k) const {return m[k];}
-    ///\e
-    Value operator[](Key k) const {return m[k];}
-  };
-  
-  ///Returns a \c MapFunctor class
-
-  ///This function just returns a \c MapFunctor class.
-  ///\relates MapFunctor
-  template<typename M> 
-  inline MapFunctor<M> mapFunctor(const M &m) {
-    return MapFunctor<M>(m);
-  }
-
-  ///Just readable version of \ref ForkWriteMap
-
-  ///This map has two \ref 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 \c ForkWriteMap.
-  ///
-  ///The \c Key and \c Value are inherited from \c M1.
-  ///The \c Key and \c Value of \c M2 must be convertible from those of \c M1.
-  ///
-  ///\sa ForkWriteMap
-  ///
-  /// \todo Why is it needed?
-  template<typename  M1, typename M2> 
-  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
-    const M1& m1;
-    const M2& m2;
-  public:
-    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-    ForkMap(const M1 &_m1, const M2 &_m2) : m1(_m1), m2(_m2) {};
-    /// \e
-    Value operator[](Key k) const {return m1[k];}
-  };
-
-
-  ///Applies all map setting operations to two maps
-
-  ///This map has two \ref concepts::WriteMap "writable map"
-  ///parameters and each write request will be passed to both of them.
-  ///If \c M1 is also \ref 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 \c M2 must be convertible from those of \c M1.
-  ///
-  ///\sa ForkMap
-  template<typename  M1, typename M2> 
-  class ForkWriteMap : public MapBase<typename M1::Key, typename M1::Value> {
-    M1& m1;
-    M2& m2;
-  public:
-    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
-    typedef typename Parent::Key Key;
-    typedef typename Parent::Value Value;
-
-    ///Constructor
-    ForkWriteMap(M1 &_m1, M2 &_m2) : m1(_m1), m2(_m2) {};
-    ///\e
-    Value operator[](Key k) const {return m1[k];}
-    ///\e
-    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.
-  ///\relates ForkMap
-  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.
-  ///\relates ForkWriteMap
-  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 \ref 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 \c Value is \c bool.
-  ///
-  ///\sa NotWriteMap
-  template <typename M> 
+
+  /// Logical 'not' of a map
+
+  /// This \ref concepts::ReadMap "read only map" returns the logical
+  /// negation of the values of the given map.
+  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
+  ///
+  /// The simplest way of using this map is through the notMap()
+  /// function.
+  ///
+  /// \sa NotWriteMap
+  template <typename M>
   class NotMap : public MapBase<typename M::Key, bool> {
-    const M& m;
+    const M &_m;
   public:
     typedef MapBase<typename M::Key, bool> Parent;
@@ -1212,20 +1404,24 @@
 
     /// Constructor
-    NotMap(const M &_m) : m(_m) {};
-    ///\e
-    Value operator[](Key k) const {return !m[k];}
-  };
-
-  ///Logical 'not' of a map (ReadWrie version)
-  
-  ///This bool \ref 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 \c Value is \c bool.
-  ///
-  ///\sa NotMap
-  template <typename M> 
+    NotMap(const M &m) : _m(m) {}
+    /// \e
+    Value operator[](const Key &k) const { return !_m[k]; }
+  };
+
+  /// Logical 'not' of a map (read-write version)
+
+  /// This \ref concepts::ReadWriteMap "read-write map" returns the
+  /// logical negation of the values of the given map.
+  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
+  /// It makes also possible to write the map. When a value is set,
+  /// the opposite value is set to the original map.
+  ///
+  /// The simplest way of using this map is through the notWriteMap()
+  /// function.
+  ///
+  /// \sa NotMap
+  template <typename M>
   class NotWriteMap : public MapBase<typename M::Key, bool> {
-    M& m;
+    M &_m;
   public:
     typedef MapBase<typename M::Key, bool> Parent;
@@ -1234,28 +1430,38 @@
 
     /// Constructor
-    NotWriteMap(M &_m) : m(_m) {};
-    ///\e
-    Value operator[](Key k) const {return !m[k];}
-    ///\e
-    void set(Key k, bool v) { m.set(k, !v); }
-  };
-  
-  ///Returns a \c NotMap class
-  
-  ///This function just returns a \c NotMap class.
-  ///\relates NotMap
-  template <typename M> 
+    NotWriteMap(M &m) : _m(m) {}
+    /// \e
+    Value operator[](const Key &k) const { return !_m[k]; }
+    /// \e
+    void set(const Key &k, bool v) { _m.set(k, !v); }
+  };
+
+  /// Returns a \ref NotMap class
+
+  /// This function just returns a \ref NotMap class.
+  ///
+  /// For example, if \c m is a map with \c bool values, then
+  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
+  ///
+  /// \relates NotMap
+  template <typename M>
   inline NotMap<M> notMap(const M &m) {
     return NotMap<M>(m);
   }
-  
-  ///Returns a \c NotWriteMap class
-  
-  ///This function just returns a \c NotWriteMap class.
-  ///\relates NotWriteMap
-  template <typename M> 
-  inline NotWriteMap<M> notMap(M &m) {
+
+  /// Returns a \ref NotWriteMap class
+
+  /// This function just returns a \ref NotWriteMap class.
+  ///
+  /// For example, if \c m is a map with \c bool values, then
+  /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
+  /// Moreover it makes also possible to write the map.
+  ///
+  /// \relates NotWriteMap
+  template <typename M>
+  inline NotWriteMap<M> notWriteMap(M &m) {
     return NotWriteMap<M>(m);
   }
+
 
   namespace _maps_bits {
@@ -1277,5 +1483,5 @@
     template <typename _Iterator>
     struct IteratorTraits<_Iterator,
-      typename exists<typename _Iterator::container_type>::type> 
+      typename exists<typename _Iterator::container_type>::type>
     {
       typedef typename _Iterator::container_type::value_type Value;
@@ -1283,36 +1489,36 @@
 
   }
-  
+
 
   /// \brief Writable bool map for logging each \c true assigned element
   ///
-  /// A \ref concepts::ReadWriteMap "read-write" bool map for logging 
-  /// each \c true assigned element, i.e it copies all the keys set 
+  /// A \ref concepts::ReadWriteMap "read-write" 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 
+  /// \note The container of the iterator should contain space
   /// for each element.
   ///
-  /// The following example shows how you can write the edges found by 
+  /// The following example shows how you can write the edges found by
   /// the \ref Prim algorithm directly to the standard output.
-  ///\code
-  /// 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);
-  ///\endcode
-  ///
-  ///\sa BackInserterBoolMap 
-  ///\sa FrontInserterBoolMap 
-  ///\sa InserterBoolMap 
-  ///
-  ///\todo Revise the name of this class and the related ones.
-  template <typename _Iterator, 
+  /// \code
+  ///   typedef IdMap<Graph, Edge> EdgeIdMap;
+  ///   EdgeIdMap edgeId(graph);
+  ///
+  ///   typedef MapToFunctor<EdgeIdMap> EdgeIdFunctor;
+  ///   EdgeIdFunctor edgeIdFunctor(edgeId);
+  ///
+  ///   StoreBoolMap<ostream_iterator<int>, EdgeIdFunctor>
+  ///     writerMap(ostream_iterator<int>(cout, " "), edgeIdFunctor);
+  ///
+  ///   prim(graph, cost, writerMap);
+  /// \endcode
+  ///
+  /// \sa BackInserterBoolMap
+  /// \sa FrontInserterBoolMap
+  /// \sa InserterBoolMap
+  ///
+  /// \todo Revise the name of this class and the related ones.
+  template <typename _Iterator,
             typename _Functor =
             _maps_bits::Identity<typename _maps_bits::
@@ -1328,5 +1534,5 @@
 
     /// Constructor
-    StoreBoolMap(Iterator it, const Functor& functor = Functor()) 
+    StoreBoolMap(Iterator it, const Functor& functor = Functor())
       : _begin(it), _end(it), _functor(functor) {}
 
@@ -1335,5 +1541,5 @@
       return _begin;
     }
- 
+
     /// Gives back the the 'after the last' iterator
     Iterator end() const {
@@ -1341,5 +1547,5 @@
     }
 
-    /// The \c set function of the map
+    /// The set function of the map
     void set(const Key& key, Value value) const {
       if (value) {
@@ -1347,5 +1553,5 @@
       }
     }
-    
+
   private:
     Iterator _begin;
@@ -1354,5 +1560,5 @@
   };
 
-  /// \brief Writable bool map for logging each \c true assigned element in 
+  /// \brief Writable bool map for logging each \c true assigned element in
   /// a back insertable container.
   ///
@@ -1363,13 +1569,13 @@
   /// edges found by the Prim algorithm in a vector.
   ///
-  ///\code
-  /// vector<Edge> span_tree_edges;
-  /// BackInserterBoolMap<vector<Edge> > inserter_map(span_tree_edges);
-  /// prim(graph, cost, inserter_map);
-  ///\endcode
-  ///
-  ///\sa StoreBoolMap
-  ///\sa FrontInserterBoolMap
-  ///\sa InserterBoolMap
+  /// \code
+  ///   vector<Edge> span_tree_edges;
+  ///   BackInserterBoolMap<vector<Edge> > inserter_map(span_tree_edges);
+  ///   prim(graph, cost, inserter_map);
+  /// \endcode
+  ///
+  /// \sa StoreBoolMap
+  /// \sa FrontInserterBoolMap
+  /// \sa InserterBoolMap
   template <typename Container,
             typename Functor =
@@ -1381,9 +1587,9 @@
 
     /// Constructor
-    BackInserterBoolMap(Container& _container, 
-                        const Functor& _functor = Functor()) 
+    BackInserterBoolMap(Container& _container,
+                        const Functor& _functor = Functor())
       : container(_container), functor(_functor) {}
 
-    /// The \c set function of the map
+    /// The set function of the map
     void set(const Key& key, Value value) {
       if (value) {
@@ -1391,5 +1597,5 @@
       }
     }
-    
+
   private:
     Container& container;
@@ -1397,5 +1603,5 @@
   };
 
-  /// \brief Writable bool map for logging each \c true assigned element in 
+  /// \brief Writable bool map for logging each \c true assigned element in
   /// a front insertable container.
   ///
@@ -1405,6 +1611,6 @@
   /// container. For example see \ref BackInserterBoolMap.
   ///
-  ///\sa BackInserterBoolMap
-  ///\sa InserterBoolMap
+  /// \sa BackInserterBoolMap
+  /// \sa InserterBoolMap
   template <typename Container,
             typename Functor =
@@ -1417,8 +1623,8 @@
     /// Constructor
     FrontInserterBoolMap(Container& _container,
-                         const Functor& _functor = Functor()) 
+                         const Functor& _functor = Functor())
       : container(_container), functor(_functor) {}
 
-    /// The \c set function of the map
+    /// The set function of the map
     void set(const Key& key, Value value) {
       if (value) {
@@ -1426,14 +1632,14 @@
       }
     }
-    
+
   private:
-    Container& container;    
+    Container& container;
     Functor functor;
   };
 
-  /// \brief Writable bool map for storing each \c true assigned element in 
+  /// \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 
+  /// 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
   /// the container.
@@ -1442,12 +1648,12 @@
   /// connected components in a set you can use the next code:
   ///
-  ///\code
-  /// set<Arc> cut_arcs;
-  /// InserterBoolMap<set<Arc> > inserter_map(cut_arcs);
-  /// stronglyConnectedCutArcs(digraph, cost, inserter_map);
-  ///\endcode
-  ///
-  ///\sa BackInserterBoolMap
-  ///\sa FrontInserterBoolMap
+  /// \code
+  ///   set<Arc> cut_arcs;
+  ///   InserterBoolMap<set<Arc> > inserter_map(cut_arcs);
+  ///   stronglyConnectedCutArcs(digraph, cost, inserter_map);
+  /// \endcode
+  ///
+  /// \sa BackInserterBoolMap
+  /// \sa FrontInserterBoolMap
   template <typename Container,
             typename Functor =
@@ -1459,5 +1665,5 @@
 
     /// Constructor with specified iterator
-    
+
     /// Constructor with specified iterator.
     /// \param _container The container for storing the elements.
@@ -1465,5 +1671,5 @@
     /// \param _functor The functor that is used when an element is stored.
     InserterBoolMap(Container& _container, typename Container::iterator _it,
-                    const Functor& _functor = Functor()) 
+                    const Functor& _functor = Functor())
       : container(_container), it(_it), functor(_functor) {}
 
@@ -1477,5 +1683,5 @@
       : container(_container), it(_container.end()), functor(_functor) {}
 
-    /// The \c set function of the map
+    /// The set function of the map
     void set(const Key& key, Value value) {
       if (value) {
@@ -1484,5 +1690,5 @@
       }
     }
-    
+
   private:
     Container& container;
@@ -1491,29 +1697,29 @@
   };
 
-  /// \brief Writable bool map for filling each \c true assigned element with a 
+  /// \brief Writable bool map for filling each \c true assigned element with a
   /// given value.
   ///
-  /// 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:
-  ///\code
-  /// 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);
-  /// dfs.init();
-  /// for (NodeIt it(graph); it != INVALID; ++it) {
-  ///   if (!dfs.reached(it)) {
-  ///     dfs.addSource(it);
-  ///     dfs.start();
-  ///     ++filler.fillValue();
+  /// \code
+  ///   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);
+  ///   dfs.init();
+  ///   for (NodeIt it(graph); it != INVALID; ++it) {
+  ///     if (!dfs.reached(it)) {
+  ///       dfs.addSource(it);
+  ///       dfs.start();
+  ///       ++filler.fillValue();
+  ///     }
   ///   }
-  /// }
-  ///\endcode
+  /// \endcode
   template <typename Map>
   class FillBoolMap {
@@ -1523,9 +1729,9 @@
 
     /// Constructor
-    FillBoolMap(Map& _map, const typename Map::Value& _fill) 
+    FillBoolMap(Map& _map, const typename Map::Value& _fill)
       : map(_map), fill(_fill) {}
 
     /// Constructor
-    FillBoolMap(Map& _map) 
+    FillBoolMap(Map& _map)
       : map(_map), fill() {}
 
@@ -1533,17 +1739,17 @@
     const typename Map::Value& fillValue() const {
       return fill;
-    } 
+    }
 
     /// Gives back the current fill value
     typename Map::Value& fillValue() {
       return fill;
-    } 
+    }
 
     /// Sets the current fill value
     void fillValue(const typename Map::Value& _fill) {
       fill = _fill;
-    } 
-
-    /// The \c set function of the map
+    }
+
+    /// The set function of the map
     void set(const Key& key, Value value) {
       if (value) {
@@ -1551,5 +1757,5 @@
       }
     }
-    
+
   private:
     Map& map;
@@ -1558,27 +1764,27 @@
 
 
-  /// \brief Writable bool map for storing the sequence number of 
-  /// \c true assignments.  
-  /// 
-  /// Writable bool map that stores for each \c true assigned elements  
+  /// \brief Writable bool map for storing the sequence number of
+  /// \c true assignments.
+  ///
+  /// 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.
-  ///
-  ///\code
-  /// 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);
-  /// dfs.init();
-  /// for (NodeIt it(digraph); it != INVALID; ++it) {
-  ///   if (!dfs.reached(it)) {
-  ///     dfs.addSource(it);
-  ///     dfs.start();
+  /// order of the nodes in the \ref Dfs algorithm.
+  ///
+  /// \code
+  ///   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);
+  ///   dfs.init();
+  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
+  ///     if (!dfs.reached(it)) {
+  ///       dfs.addSource(it);
+  ///       dfs.start();
+  ///     }
   ///   }
-  /// }
-  ///\endcode
+  /// \endcode
   ///
   /// The storing of the discovering order is more difficult because the
@@ -1586,25 +1792,25 @@
   /// order map is not readable. Thus we must use the fork map:
   ///
-  ///\code
-  /// 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);
-  /// dfs.init();
-  /// for (NodeIt it(digraph); it != INVALID; ++it) {
-  ///   if (!dfs.reached(it)) {
-  ///     dfs.addSource(it);
-  ///     dfs.start();
+  /// \code
+  ///   typedef Digraph::NodeMap<int> OrderMap;
+  ///   OrderMap order(digraph);
+  ///   typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
+  ///   OrderSetterMap setter(order);
+  ///   typedef Digraph::NodeMap<bool> StoreMap;
+  ///   StoreMap store(digraph);
+  ///
+  ///   typedef ForkMap<StoreMap, OrderSetterMap> ReachedMap;
+  ///   ReachedMap reached(store, setter);
+  ///
+  ///   Dfs<Digraph>::DefReachedMap<ReachedMap>::Create dfs(digraph);
+  ///   dfs.reachedMap(reached);
+  ///   dfs.init();
+  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
+  ///     if (!dfs.reached(it)) {
+  ///       dfs.addSource(it);
+  ///       dfs.start();
+  ///     }
   ///   }
-  /// }
-  ///\endcode
+  /// \endcode
   template <typename Map>
   class SettingOrderBoolMap {
@@ -1614,5 +1820,5 @@
 
     /// Constructor
-    SettingOrderBoolMap(Map& _map) 
+    SettingOrderBoolMap(Map& _map)
       : map(_map), counter(0) {}
 
@@ -1622,5 +1828,5 @@
     }
 
-    /// The \c set function of the map
+    /// The set function of the map
     void set(const Key& key, Value value) {
       if (value) {
@@ -1628,5 +1834,5 @@
       }
     }
-    
+
   private:
     Map& map;
Index: test/maps_test.cc
===================================================================
--- test/maps_test.cc	(revision 39)
+++ test/maps_test.cc	(revision 80)
@@ -38,20 +38,24 @@
   typedef B result_type;
 
-  B operator()(const A &) const {return B();}
+  B operator()(const A&) const { return B(); }
+private:
+  F& operator=(const F&);
 };
 
-int func(A) {return 3;}
-
-int binc(int, B) {return 4;}
-
-typedef ReadMap<A,double> DoubleMap;
-typedef ReadWriteMap<A, double> WriteDoubleMap;
-
-typedef ReadMap<A,bool> BoolMap;
+int func(A) { return 3; }
+
+int binc(int a, B) { return a+1; }
+
+typedef ReadMap<A, double> DoubleMap;
+typedef ReadWriteMap<A, double> DoubleWriteMap;
+typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
+
+typedef ReadMap<A, bool> BoolMap;
 typedef ReadWriteMap<A, bool> BoolWriteMap;
+typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
 
 int main()
-{ // checking graph components
-  
+{
+  // Map concepts
   checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
   checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
@@ -59,50 +63,206 @@
   checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
 
-  checkConcept<ReadMap<A,double>, AddMap<DoubleMap,DoubleMap> >();
-  checkConcept<ReadMap<A,double>, SubMap<DoubleMap,DoubleMap> >();
-  checkConcept<ReadMap<A,double>, MulMap<DoubleMap,DoubleMap> >();
-  checkConcept<ReadMap<A,double>, DivMap<DoubleMap,DoubleMap> >();
-  checkConcept<ReadMap<A,double>, NegMap<DoubleMap> >();
-  checkConcept<ReadWriteMap<A,double>, NegWriteMap<WriteDoubleMap> >();
-  checkConcept<ReadMap<A,double>, AbsMap<DoubleMap> >();
-  checkConcept<ReadMap<A,double>, ShiftMap<DoubleMap> >();
-  checkConcept<ReadWriteMap<A,double>, ShiftWriteMap<WriteDoubleMap> >();
-  checkConcept<ReadMap<A,double>, ScaleMap<DoubleMap> >();
-  checkConcept<ReadWriteMap<A,double>, ScaleWriteMap<WriteDoubleMap> >();
-  checkConcept<ReadMap<A,double>, ForkMap<DoubleMap, DoubleMap> >();
-  checkConcept<ReadWriteMap<A,double>, 
-    ForkWriteMap<WriteDoubleMap, WriteDoubleMap> >();
+  // NullMap
+  {
+    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
+    NullMap<A,B> map1;
+    NullMap<A,B> map2 = map1;
+    map1 = nullMap<A,B>();
+  }
+
+  // ConstMap
+  {
+    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
+    ConstMap<A,B> map1;
+    ConstMap<A,B> map2(B());
+    ConstMap<A,B> map3 = map1;
+    map1 = constMap<A>(B());
+    map1.setAll(B());
+    
+    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
+    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
+
+    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
+    ConstMap<A,Const<int,10> > map4;
+    ConstMap<A,Const<int,10> > map5 = map4;
+    map4 = map5;
+    check(map4[A()] == 10 && map5[A()] == 10, "Something is wrong with ConstMap");
+  }
+
+  // IdentityMap
+  {
+    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
+    IdentityMap<A> map1;
+    IdentityMap<A> map2 = map1;
+    map1 = identityMap<A>();
+    
+    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
+    check(identityMap<double>()[1.0] == 1.0 && identityMap<double>()[3.14] == 3.14,
+          "Something is wrong with IdentityMap");
+  }
+
+  // RangeMap
+  {
+    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
+    RangeMap<B> map1;
+    RangeMap<B> map2(10);
+    RangeMap<B> map3(10,B());
+    RangeMap<B> map4 = map1;
+    RangeMap<B> map5 = rangeMap<B>();
+    RangeMap<B> map6 = rangeMap<B>(10);
+    RangeMap<B> map7 = rangeMap(10,B());
+
+    checkConcept< ReferenceMap<int, double, double&, const double&>,
+                  RangeMap<double> >();
+    std::vector<double> v(10, 0);
+    v[5] = 100;
+    RangeMap<double> map8(v);
+    RangeMap<double> map9 = rangeMap(v);
+    check(map9.size() == 10 && map9[2] == 0 && map9[5] == 100,
+          "Something is wrong with RangeMap");
+  }
+
+  // SparseMap
+  {
+    checkConcept<ReferenceMap<A,B,B&,const B&>, SparseMap<A,B> >();
+    SparseMap<A,B> map1;
+    SparseMap<A,B> map2(B());
+    SparseMap<A,B> map3 = sparseMap<A,B>();
+    SparseMap<A,B> map4 = sparseMap<A>(B());
+
+    checkConcept< ReferenceMap<double, int, int&, const int&>,
+                  SparseMap<double, int> >();
+    std::map<double, int> m;
+    SparseMap<double, int> map5(m);
+    SparseMap<double, int> map6(m,10);
+    SparseMap<double, int> map7 = sparseMap(m);
+    SparseMap<double, int> map8 = sparseMap(m,10);
+
+    check(map5[1.0] == 0 && map5[3.14] == 0 && map6[1.0] == 10 && map6[3.14] == 10,
+          "Something is wrong with SparseMap");
+    map5[1.0] = map6[3.14] = 100;
+    check(map5[1.0] == 100 && map5[3.14] == 0 && map6[1.0] == 10 && map6[3.14] == 100,
+          "Something is wrong with SparseMap");
+  }
+
+  // ComposeMap
+  {
+    typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
+    checkConcept<ReadMap<B,double>, CompMap>();
+    CompMap map1(DoubleMap(),ReadMap<B,A>());
+    CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
+    
+    SparseMap<double, bool> m1(false); m1[3.14] = true;
+    RangeMap<double> m2(2); m2[0] = 3.0; m2[1] = 3.14;
+    check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1], "Something is wrong with ComposeMap")
+  }
+
+  // CombineMap
+  {
+    typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
+    checkConcept<ReadMap<A,double>, CombMap>();
+    CombMap map1(DoubleMap(), DoubleMap());
+    CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
+
+    check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3,
+          "Something is wrong with CombineMap");
+  }
+
+  // FunctorToMap, MapToFunctor
+  {
+    checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >();
+    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
+    FunctorToMap<F> map1;
+    FunctorToMap<F> map2(F());
+    B b = functorToMap(F())[A()];
+
+    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
+    MapToFunctor<ReadMap<A,B> > map(ReadMap<A,B>());
+
+    check(functorToMap(&func)[A()] == 3, "Something is wrong with FunctorToMap");
+    check(mapToFunctor(constMap<A,int>(2))(A()) == 2, "Something is wrong with MapToFunctor");
+    check(mapToFunctor(functorToMap(&func))(A()) == 3 && mapToFunctor(functorToMap(&func))[A()] == 3,
+          "Something is wrong with FunctorToMap or MapToFunctor");
+    check(functorToMap(mapToFunctor(constMap<A,int>(2)))[A()] == 2,
+          "Something is wrong with FunctorToMap or MapToFunctor");
+  }
+
+  // ConvertMap
+  {
+    checkConcept<ReadMap<double,double>, ConvertMap<ReadMap<double, int>, double> >();
+    ConvertMap<RangeMap<bool>, int> map1(rangeMap(1, true));
+    ConvertMap<RangeMap<bool>, int> map2 = convertMap<int>(rangeMap(2, false));
+  }
+
+  // ForkMap
+  {
+    checkConcept<DoubleWriteMap, ForkMap<DoubleWriteMap, DoubleWriteMap> >();
+    
+    typedef RangeMap<double> RM;
+    typedef SparseMap<int, double> SM;
+    RM m1(10, -1);
+    SM m2(-1);
+    checkConcept<ReadWriteMap<int, double>, ForkMap<RM, SM> >();
+    checkConcept<ReadWriteMap<int, double>, ForkMap<SM, RM> >();
+    ForkMap<RM, SM> map1(m1,m2);
+    ForkMap<SM, RM> map2 = forkMap(m2,m1);
+    map2.set(5, 10);
+    check(m1[1] == -1 && m1[5] == 10 && m2[1] == -1 && m2[5] == 10 && map2[1] == -1 && map2[5] == 10,
+          "Something is wrong with ForkMap");
+  }
   
-  checkConcept<ReadMap<B,double>, ComposeMap<DoubleMap,ReadMap<B,A> > >();
-
-  checkConcept<ReadMap<A,B>, FunctorMap<F, A, B> >();
-
-  checkConcept<ReadMap<A, bool>, NotMap<BoolMap> >();
-  checkConcept<ReadWriteMap<A, bool>, NotWriteMap<BoolWriteMap> >();
-
-  checkConcept<WriteMap<A, bool>, StoreBoolMap<A*> >();
-  checkConcept<WriteMap<A, bool>, BackInserterBoolMap<std::deque<A> > >();
-  checkConcept<WriteMap<A, bool>, FrontInserterBoolMap<std::deque<A> > >();
-  checkConcept<WriteMap<A, bool>, InserterBoolMap<std::set<A> > >();
-  checkConcept<WriteMap<A, bool>, FillBoolMap<WriteMap<A, B> > >();
-  checkConcept<WriteMap<A, bool>, SettingOrderBoolMap<WriteMap<A, int> > >();
-
-  int a;
+  // Arithmetic maps:
+  // - AddMap, SubMap, MulMap, DivMap
+  // - ShiftMap, ShiftWriteMap, ScaleMap, ScaleWriteMap
+  // - NegMap, NegWriteMap, AbsMap
+  {
+    checkConcept<DoubleMap, AddMap<DoubleMap,DoubleMap> >();
+    checkConcept<DoubleMap, SubMap<DoubleMap,DoubleMap> >();
+    checkConcept<DoubleMap, MulMap<DoubleMap,DoubleMap> >();
+    checkConcept<DoubleMap, DivMap<DoubleMap,DoubleMap> >();
+    
+    ConstMap<int, double> c1(1.0), c2(3.14);
+    IdentityMap<int> im;
+    ConvertMap<IdentityMap<int>, double> id(im);
+    check(addMap(c1,id)[0] == 1.0  && addMap(c1,id)[10] == 11.0, "Something is wrong with AddMap");
+    check(subMap(id,c1)[0] == -1.0 && subMap(id,c1)[10] == 9.0,  "Something is wrong with SubMap");
+    check(mulMap(id,c2)[0] == 0    && mulMap(id,c2)[2]  == 6.28, "Something is wrong with MulMap");
+    check(divMap(c2,id)[1] == 3.14 && divMap(c2,id)[2]  == 1.57, "Something is wrong with DivMap");
+    
+    checkConcept<DoubleMap, ShiftMap<DoubleMap> >();
+    checkConcept<DoubleWriteMap, ShiftWriteMap<DoubleWriteMap> >();
+    checkConcept<DoubleMap, ScaleMap<DoubleMap> >();
+    checkConcept<DoubleWriteMap, ScaleWriteMap<DoubleWriteMap> >();
+    checkConcept<DoubleMap, NegMap<DoubleMap> >();
+    checkConcept<DoubleWriteMap, NegWriteMap<DoubleWriteMap> >();
+    checkConcept<DoubleMap, AbsMap<DoubleMap> >();
+
+    check(shiftMap(id, 2.0)[1] == 3.0 && shiftMap(id, 2.0)[10] == 12.0,
+          "Something is wrong with ShiftMap");
+    check(shiftWriteMap(id, 2.0)[1] == 3.0 && shiftWriteMap(id, 2.0)[10] == 12.0,
+          "Something is wrong with ShiftWriteMap");
+    check(scaleMap(id, 2.0)[1] == 2.0 && scaleMap(id, 2.0)[10] == 20.0,
+          "Something is wrong with ScaleMap");
+    check(scaleWriteMap(id, 2.0)[1] == 2.0 && scaleWriteMap(id, 2.0)[10] == 20.0,
+          "Something is wrong with ScaleWriteMap");
+    check(negMap(id)[1] == -1.0 && negMap(id)[-10] == 10.0,
+          "Something is wrong with NegMap");
+    check(negWriteMap(id)[1] == -1.0 && negWriteMap(id)[-10] == 10.0,
+          "Something is wrong with NegWriteMap");
+    check(absMap(id)[1] == 1.0 && absMap(id)[-10] == 10.0,
+          "Something is wrong with AbsMap");
+  }
   
-  a=mapFunctor(constMap<A,int>(2))(A());
-  check(a==2,"Something is wrong with mapFunctor");
-
-  B b;
-  b=functorMap(F())[A()];
-
-  a=functorMap(&func)[A()];
-  check(a==3,"Something is wrong with functorMap");
-
-  a=combineMap(constMap<B, int, 1>(), identityMap<B>(), &binc)[B()];
-  check(a==4,"Something is wrong with combineMap");
-  
-
-  std::cout << __FILE__ ": All tests passed.\n";
-  
+  // Logical maps
+  {
+    checkConcept<BoolMap, NotMap<BoolMap> >();
+    checkConcept<BoolWriteMap, NotWriteMap<BoolWriteMap> >();
+    
+    RangeMap<bool> rm(2);
+    rm[0] = true; rm[1] = false;
+    check(!(notMap(rm)[0]) && notMap(rm)[1], "Something is wrong with NotMap");
+    check(!(notWriteMap(rm)[0]) && notWriteMap(rm)[1], "Something is wrong with NotWriteMap");
+  }
+
   return 0;
 }
