1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 * |
2 * |
3 * This file is a part of LEMON, a generic C++ optimization library. |
3 * This file is a part of LEMON, a generic C++ optimization library. |
4 * |
4 * |
5 * Copyright (C) 2003-2009 |
5 * Copyright (C) 2003-2010 |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
8 * |
8 * |
9 * Permission to use, modify and distribute this software is granted |
9 * Permission to use, modify and distribute this software is granted |
10 * provided that this copyright notice appears in all copies. For |
10 * provided that this copyright notice appears in all copies. For |
231 /// This map is essentially a wrapper for \c std::vector. It assigns |
231 /// This map is essentially a wrapper for \c std::vector. It assigns |
232 /// values to integer keys from the range <tt>[0..size-1]</tt>. |
232 /// values to integer keys from the range <tt>[0..size-1]</tt>. |
233 /// It can be used together with some data structures, e.g. |
233 /// It can be used together with some data structures, e.g. |
234 /// heap types and \c UnionFind, when the used items are small |
234 /// heap types and \c UnionFind, when the used items are small |
235 /// integers. This map conforms to the \ref concepts::ReferenceMap |
235 /// integers. This map conforms to the \ref concepts::ReferenceMap |
236 /// "ReferenceMap" concept. |
236 /// "ReferenceMap" concept. |
237 /// |
237 /// |
238 /// The simplest way of using this map is through the rangeMap() |
238 /// The simplest way of using this map is through the rangeMap() |
239 /// function. |
239 /// function. |
240 template <typename V> |
240 template <typename V> |
241 class RangeMap : public MapBase<int, V> { |
241 class RangeMap : public MapBase<int, V> { |
1914 /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap) |
1914 /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap) |
1915 /// and if a key is set to a new value, then stores it in the inverse map. |
1915 /// and if a key is set to a new value, then stores it in the inverse map. |
1916 /// The graph items can be accessed by their values either using |
1916 /// The graph items can be accessed by their values either using |
1917 /// \c InverseMap or \c operator()(), and the values of the map can be |
1917 /// \c InverseMap or \c operator()(), and the values of the map can be |
1918 /// accessed with an STL compatible forward iterator (\c ValueIt). |
1918 /// accessed with an STL compatible forward iterator (\c ValueIt). |
1919 /// |
1919 /// |
1920 /// This map is intended to be used when all associated values are |
1920 /// This map is intended to be used when all associated values are |
1921 /// different (the map is actually invertable) or there are only a few |
1921 /// different (the map is actually invertable) or there are only a few |
1922 /// items with the same value. |
1922 /// items with the same value. |
1923 /// Otherwise consider to use \c IterableValueMap, which is more |
1923 /// Otherwise consider to use \c IterableValueMap, which is more |
1924 /// suitable and more efficient for such cases. It provides iterators |
1924 /// suitable and more efficient for such cases. It provides iterators |
1925 /// to traverse the items with the same associated value, but |
1925 /// to traverse the items with the same associated value, but |
1926 /// it does not have \c InverseMap. |
1926 /// it does not have \c InverseMap. |
1927 /// |
1927 /// |
1928 /// This type is not reference map, so it cannot be modified with |
1928 /// This type is not reference map, so it cannot be modified with |
2000 bool operator!=(ValueIt jt) const { return it != jt.it; } |
2000 bool operator!=(ValueIt jt) const { return it != jt.it; } |
2001 |
2001 |
2002 private: |
2002 private: |
2003 typename Container::const_iterator it; |
2003 typename Container::const_iterator it; |
2004 }; |
2004 }; |
2005 |
2005 |
2006 /// Alias for \c ValueIt |
2006 /// Alias for \c ValueIt |
2007 typedef ValueIt ValueIterator; |
2007 typedef ValueIt ValueIterator; |
2008 |
2008 |
2009 /// \brief Returns an iterator to the first value. |
2009 /// \brief Returns an iterator to the first value. |
2010 /// |
2010 /// |
2059 /// only one of them is returned. |
2059 /// only one of them is returned. |
2060 Key operator()(const Value& val) const { |
2060 Key operator()(const Value& val) const { |
2061 typename Container::const_iterator it = _inv_map.find(val); |
2061 typename Container::const_iterator it = _inv_map.find(val); |
2062 return it != _inv_map.end() ? it->second : INVALID; |
2062 return it != _inv_map.end() ? it->second : INVALID; |
2063 } |
2063 } |
2064 |
2064 |
2065 /// \brief Returns the number of items with the given value. |
2065 /// \brief Returns the number of items with the given value. |
2066 /// |
2066 /// |
2067 /// This function returns the number of items with the given value |
2067 /// This function returns the number of items with the given value |
2068 /// associated with it. |
2068 /// associated with it. |
2069 int count(const Value &val) const { |
2069 int count(const Value &val) const { |
2376 /// \relates RangeIdMap |
2376 /// \relates RangeIdMap |
2377 template <typename K, typename GR> |
2377 template <typename K, typename GR> |
2378 inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) { |
2378 inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) { |
2379 return RangeIdMap<GR, K>(graph); |
2379 return RangeIdMap<GR, K>(graph); |
2380 } |
2380 } |
2381 |
2381 |
2382 /// \brief Dynamic iterable \c bool map. |
2382 /// \brief Dynamic iterable \c bool map. |
2383 /// |
2383 /// |
2384 /// This class provides a special graph map type which can store a |
2384 /// This class provides a special graph map type which can store a |
2385 /// \c bool value for graph items (\c Node, \c Arc or \c Edge). |
2385 /// \c bool value for graph items (\c Node, \c Arc or \c Edge). |
2386 /// For both \c true and \c false values it is possible to iterate on |
2386 /// For both \c true and \c false values it is possible to iterate on |
2636 /// Creates an iterator with a value. It iterates on the |
2636 /// Creates an iterator with a value. It iterates on the |
2637 /// keys mapped to the given value. |
2637 /// keys mapped to the given value. |
2638 /// \param map The IterableBoolMap. |
2638 /// \param map The IterableBoolMap. |
2639 /// \param value The value. |
2639 /// \param value The value. |
2640 ItemIt(const IterableBoolMap& map, bool value) |
2640 ItemIt(const IterableBoolMap& map, bool value) |
2641 : Parent(value ? |
2641 : Parent(value ? |
2642 (map._sep > 0 ? |
2642 (map._sep > 0 ? |
2643 map._array[map._sep - 1] : INVALID) : |
2643 map._array[map._sep - 1] : INVALID) : |
2644 (map._sep < int(map._array.size()) ? |
2644 (map._sep < int(map._array.size()) ? |
2645 map._array.back() : INVALID)), _map(&map) {} |
2645 map._array.back() : INVALID)), _map(&map) {} |
2646 |
2646 |
3784 /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. |
3784 /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. |
3785 template <typename GR, typename From, typename To> |
3785 template <typename GR, typename From, typename To> |
3786 void mapCopy(const GR& gr, const From& from, To& to) { |
3786 void mapCopy(const GR& gr, const From& from, To& to) { |
3787 typedef typename To::Key Item; |
3787 typedef typename To::Key Item; |
3788 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
3788 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
3789 |
3789 |
3790 for (ItemIt it(gr); it != INVALID; ++it) { |
3790 for (ItemIt it(gr); it != INVALID; ++it) { |
3791 to.set(it, from[it]); |
3791 to.set(it, from[it]); |
3792 } |
3792 } |
3793 } |
3793 } |
3794 |
3794 |
3795 /// \brief Compare two graph maps. |
3795 /// \brief Compare two graph maps. |
3796 /// |
3796 /// |
3797 /// This function compares the values of two graph maps. It returns |
3797 /// This function compares the values of two graph maps. It returns |
3798 /// \c true if the maps assign the same value for all items in the graph. |
3798 /// \c true if the maps assign the same value for all items in the graph. |
3799 /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal |
3799 /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal |
3800 /// and their \c Value types must be comparable using \c %operator==(). |
3800 /// and their \c Value types must be comparable using \c %operator==(). |
3801 /// |
3801 /// |
3802 /// \param gr The graph for which the maps are defined. |
3802 /// \param gr The graph for which the maps are defined. |
3804 /// \param map2 The second map. |
3804 /// \param map2 The second map. |
3805 template <typename GR, typename Map1, typename Map2> |
3805 template <typename GR, typename Map1, typename Map2> |
3806 bool mapCompare(const GR& gr, const Map1& map1, const Map2& map2) { |
3806 bool mapCompare(const GR& gr, const Map1& map1, const Map2& map2) { |
3807 typedef typename Map2::Key Item; |
3807 typedef typename Map2::Key Item; |
3808 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
3808 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
3809 |
3809 |
3810 for (ItemIt it(gr); it != INVALID; ++it) { |
3810 for (ItemIt it(gr); it != INVALID; ++it) { |
3811 if (!(map1[it] == map2[it])) return false; |
3811 if (!(map1[it] == map2[it])) return false; |
3812 } |
3812 } |
3813 return true; |
3813 return true; |
3814 } |
3814 } |