| ... | ... | @@ -1899,19 +1899,20 @@
 | 
	| 1899 | 1899 |   };
 | 
	| 1900 | 1900 | 
 | 
	| 1901 | 1901 | 
 | 
	| 1902 | 1902 |   /// \brief General cross reference graph map type.
 | 
	| 1903 | 1903 | 
 | 
	| 1904 | 1904 |   /// This class provides simple invertable graph maps.
 | 
	| 1905 |  |   /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap"
 | 
	| 1906 |  |   /// and if a key is set to a new value then store it
 | 
	| 1907 |  |   /// in the inverse map.
 | 
	| 1908 |  |   ///
 | 
	|  | 1905 |   /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
 | 
	|  | 1906 |   /// and if a key is set to a new value, then stores it in the inverse map.
 | 
	| 1909 | 1907 |   /// The values of the map can be accessed
 | 
	| 1910 | 1908 |   /// with stl compatible forward iterator.
 | 
	| 1911 | 1909 |   ///
 | 
	|  | 1910 |   /// This type is not reference map, so it cannot be modified with
 | 
	|  | 1911 |   /// the subscript operator.
 | 
	|  | 1912 |   ///
 | 
	| 1912 | 1913 |   /// \tparam GR The graph type.
 | 
	| 1913 | 1914 |   /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
 | 
	| 1914 | 1915 |   /// \c GR::Edge).
 | 
	| 1915 | 1916 |   /// \tparam V The value type of the map.
 | 
	| 1916 | 1917 |   ///
 | 
	| 1917 | 1918 |   /// \see IterableValueMap
 | 
	| ... | ... | @@ -1920,13 +1921,13 @@
 | 
	| 1920 | 1921 |     : protected ItemSetTraits<GR, K>::template Map<V>::Type {
 | 
	| 1921 | 1922 |   private:
 | 
	| 1922 | 1923 | 
 | 
	| 1923 | 1924 |     typedef typename ItemSetTraits<GR, K>::
 | 
	| 1924 | 1925 |       template Map<V>::Type Map;
 | 
	| 1925 | 1926 | 
 | 
	| 1926 |  |     typedef std::map<V, K> Container; | 
	|  | 1927 |     typedef std::multimap<V, K> Container;
 | 
	| 1927 | 1928 |     Container _inv_map;
 | 
	| 1928 | 1929 | 
 | 
	| 1929 | 1930 |   public:
 | 
	| 1930 | 1931 | 
 | 
	| 1931 | 1932 |     /// The graph type of CrossRefMap.
 | 
	| 1932 | 1933 |     typedef GR Graph;
 | 
	| ... | ... | @@ -1945,12 +1946,14 @@
 | 
	| 1945 | 1946 | 
 | 
	| 1946 | 1947 |     /// \brief Forward iterator for values.
 | 
	| 1947 | 1948 |     ///
 | 
	| 1948 | 1949 |     /// This iterator is an stl compatible forward
 | 
	| 1949 | 1950 |     /// iterator on the values of the map. The values can
 | 
	| 1950 | 1951 |     /// be accessed in the <tt>[beginValue, endValue)</tt> range.
 | 
	|  | 1952 |     /// They are considered with multiplicity, so each value is
 | 
	|  | 1953 |     /// traversed for each item it is assigned to.
 | 
	| 1951 | 1954 |     class ValueIterator
 | 
	| 1952 | 1955 |       : public std::iterator<std::forward_iterator_tag, Value> {
 | 
	| 1953 | 1956 |       friend class CrossRefMap;
 | 
	| 1954 | 1957 |     private:
 | 
	| 1955 | 1958 |       ValueIterator(typename Container::const_iterator _it)
 | 
	| 1956 | 1959 |         : it(_it) {}
 | 
	| ... | ... | @@ -1997,61 +2000,76 @@
 | 
	| 1997 | 2000 | 
 | 
	| 1998 | 2001 |     /// \brief Sets the value associated with the given key.
 | 
	| 1999 | 2002 |     ///
 | 
	| 2000 | 2003 |     /// Sets the value associated with the given key.
 | 
	| 2001 | 2004 |     void set(const Key& key, const Value& val) {
 | 
	| 2002 | 2005 |       Value oldval = Map::operator[](key);
 | 
	| 2003 |  |       typename Container::iterator it = _inv_map.find(oldval);
 | 
	| 2004 |  |       if (it != _inv_map.end() && it->second == key) {
 | 
	|  | 2006 |       typename Container::iterator it;
 | 
	|  | 2007 |       for (it = _inv_map.equal_range(oldval).first;
 | 
	|  | 2008 |            it != _inv_map.equal_range(oldval).second; ++it) {
 | 
	|  | 2009 |         if (it->second == key) {
 | 
	| 2005 | 2010 |         _inv_map.erase(it);
 | 
	|  | 2011 |           break;
 | 
	| 2006 | 2012 |       }
 | 
	| 2007 |  |       _inv_map.insert(make_pair(val, key)); | 
	|  | 2013 |       }
 | 
	|  | 2014 |       _inv_map.insert(std::make_pair(val, key));
 | 
	| 2008 | 2015 |       Map::set(key, val);
 | 
	| 2009 | 2016 |     }
 | 
	| 2010 | 2017 | 
 | 
	| 2011 | 2018 |     /// \brief Returns the value associated with the given key.
 | 
	| 2012 | 2019 |     ///
 | 
	| 2013 | 2020 |     /// Returns the value associated with the given key.
 | 
	| 2014 | 2021 |     typename MapTraits<Map>::ConstReturnValue
 | 
	| 2015 | 2022 |     operator[](const Key& key) const {
 | 
	| 2016 | 2023 |       return Map::operator[](key);
 | 
	| 2017 | 2024 |     }
 | 
	| 2018 | 2025 | 
 | 
	| 2019 |  |     /// \brief Gives back theitem by its value. | 
	|  | 2026 |     /// \brief Gives back an item by its value.
 | 
	| 2020 | 2027 |     ///
 | 
	| 2021 |  |     /// Gives back the item by its value.
 | 
	| 2022 |  |     Key operator()(const Value& key) const {
 | 
	| 2023 |  |      typenameContainer::const_iteratorit=_inv_map.find(key); | 
	|  | 2028 |     /// This function gives back an item that is assigned to
 | 
	|  | 2029 |     /// the given value or \c INVALID if no such item exists.
 | 
	|  | 2030 |     /// If there are more items with the same associated value,
 | 
	|  | 2031 |     /// only one of them is returned.
 | 
	|  | 2032 |     Key operator()(const Value& val) const {
 | 
	|  | 2033 |       typename Container::const_iterator it = _inv_map.find(val);
 | 
	| 2024 | 2034 |       return it != _inv_map.end() ? it->second : INVALID;
 | 
	| 2025 | 2035 |     }
 | 
	| 2026 | 2036 | 
 | 
	| 2027 | 2037 |   protected:
 | 
	| 2028 | 2038 | 
 | 
	| 2029 | 2039 |     /// \brief Erase the key from the map and the inverse map.
 | 
	| 2030 | 2040 |     ///
 | 
	| 2031 | 2041 |     /// Erase the key from the map and the inverse map. It is called by the
 | 
	| 2032 | 2042 |     /// \c AlterationNotifier.
 | 
	| 2033 | 2043 |     virtual void erase(const Key& key) {
 | 
	| 2034 | 2044 |       Value val = Map::operator[](key);
 | 
	| 2035 |  |       typename Container::iterator it = _inv_map.find(val);
 | 
	| 2036 |  |       if (it != _inv_map.end() && it->second == key) {
 | 
	|  | 2045 |       typename Container::iterator it;
 | 
	|  | 2046 |       for (it = _inv_map.equal_range(val).first;
 | 
	|  | 2047 |            it != _inv_map.equal_range(val).second; ++it) {
 | 
	|  | 2048 |         if (it->second == key) {
 | 
	| 2037 | 2049 |         _inv_map.erase(it);
 | 
	|  | 2050 |           break;
 | 
	|  | 2051 |         }
 | 
	| 2038 | 2052 |       }
 | 
	| 2039 | 2053 |       Map::erase(key);
 | 
	| 2040 | 2054 |     }
 | 
	| 2041 | 2055 | 
 | 
	| 2042 | 2056 |     /// \brief Erase more keys from the map and the inverse map.
 | 
	| 2043 | 2057 |     ///
 | 
	| 2044 | 2058 |     /// Erase more keys from the map and the inverse map. It is called by the
 | 
	| 2045 | 2059 |     /// \c AlterationNotifier.
 | 
	| 2046 | 2060 |     virtual void erase(const std::vector<Key>& keys) {
 | 
	| 2047 | 2061 |       for (int i = 0; i < int(keys.size()); ++i) {
 | 
	| 2048 | 2062 |         Value val = Map::operator[](keys[i]);
 | 
	| 2049 |  |         typename Container::iterator it = _inv_map.find(val);
 | 
	| 2050 |  |         if (it != _inv_map.end() && it->second == keys[i]) {
 | 
	|  | 2063 |         typename Container::iterator it;
 | 
	|  | 2064 |         for (it = _inv_map.equal_range(val).first;
 | 
	|  | 2065 |              it != _inv_map.equal_range(val).second; ++it) {
 | 
	|  | 2066 |           if (it->second == keys[i]) {
 | 
	| 2051 | 2067 |           _inv_map.erase(it);
 | 
	|  | 2068 |             break;
 | 
	|  | 2069 |           }
 | 
	| 2052 | 2070 |         }
 | 
	| 2053 | 2071 |       }
 | 
	| 2054 | 2072 |       Map::erase(keys);
 | 
	| 2055 | 2073 |     }
 | 
	| 2056 | 2074 | 
 | 
	| 2057 | 2075 |     /// \brief Clear the keys from the map and the inverse map.
 | 
	| ... | ... | @@ -2081,14 +2099,15 @@
 | 
	| 2081 | 2099 |       typedef typename CrossRefMap::Key Value;
 | 
	| 2082 | 2100 |       /// The key type of the InverseMap.
 | 
	| 2083 | 2101 |       typedef typename CrossRefMap::Value Key;
 | 
	| 2084 | 2102 | 
 | 
	| 2085 | 2103 |       /// \brief Subscript operator.
 | 
	| 2086 | 2104 |       ///
 | 
	| 2087 |  |       /// Subscript operator. It gives back the item
 | 
	| 2088 |  |       /// that was last assigned to the given value.
 | 
	|  | 2105 |       /// Subscript operator. It gives back an item
 | 
	|  | 2106 |       /// that is assigned to the given value or \c INVALID
 | 
	|  | 2107 |       /// if no such item exists.
 | 
	| 2089 | 2108 |       Value operator[](const Key& key) const {
 | 
	| 2090 | 2109 |         return _inverted(key);
 | 
	| 2091 | 2110 |       }
 | 
	| 2092 | 2111 | 
 | 
	| 2093 | 2112 |     private:
 | 
	| 2094 | 2113 |       const CrossRefMap& _inverted; |