# HG changeset patch
# User Alpar Juttner <alpar@cs.elte.hu>
# Date 1238826658 -3600
# Node ID 66969f54d61de7c2024d58358135912901540862
# Parent eda12d8ac95313c837f493e8fd2ca49adc49de26
DescriptorMap->RangeIdMap, InvertableMap->CrossRefMap (#160)
diff --git a/lemon/maps.h b/lemon/maps.h
|
a
|
b
|
|
| 1832 | 1832 | /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or |
| 1833 | 1833 | /// \c GR::Edge). |
| 1834 | 1834 | /// |
| 1835 | | /// \see DescriptorMap |
| | 1835 | /// \see RangeIdMap |
| 1836 | 1836 | template <typename GR, typename K> |
| 1837 | 1837 | class IdMap : public MapBase<K, int> { |
| 1838 | 1838 | public: |
| … |
… |
|
| 1898 | 1898 | }; |
| 1899 | 1899 | |
| 1900 | 1900 | |
| 1901 | | /// \brief General invertable graph map type. |
| | 1901 | /// \brief General cross reference graph map type. |
| 1902 | 1902 | |
| 1903 | 1903 | /// This class provides simple invertable graph maps. |
| 1904 | 1904 | /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap" |
| … |
… |
|
| 1915 | 1915 | /// |
| 1916 | 1916 | /// \see IterableValueMap |
| 1917 | 1917 | template <typename GR, typename K, typename V> |
| 1918 | | class InvertableMap |
| | 1918 | class CrossRefMap |
| 1919 | 1919 | : protected ItemSetTraits<GR, K>::template Map<V>::Type { |
| 1920 | 1920 | private: |
| 1921 | 1921 | |
| … |
… |
|
| 1927 | 1927 | |
| 1928 | 1928 | public: |
| 1929 | 1929 | |
| 1930 | | /// The graph type of InvertableMap. |
| | 1930 | /// The graph type of CrossRefMap. |
| 1931 | 1931 | typedef GR Graph; |
| 1932 | | /// The key type of InvertableMap (\c Node, \c Arc or \c Edge). |
| | 1932 | /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge). |
| 1933 | 1933 | typedef K Item; |
| 1934 | | /// The key type of InvertableMap (\c Node, \c Arc or \c Edge). |
| | 1934 | /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge). |
| 1935 | 1935 | typedef K Key; |
| 1936 | | /// The value type of InvertableMap. |
| | 1936 | /// The value type of CrossRefMap. |
| 1937 | 1937 | typedef V Value; |
| 1938 | 1938 | |
| 1939 | 1939 | /// \brief Constructor. |
| 1940 | 1940 | /// |
| 1941 | | /// Construct a new InvertableMap for the given graph. |
| 1942 | | explicit InvertableMap(const Graph& graph) : Map(graph) {} |
| | 1941 | /// Construct a new CrossRefMap for the given graph. |
| | 1942 | explicit CrossRefMap(const Graph& graph) : Map(graph) {} |
| 1943 | 1943 | |
| 1944 | 1944 | /// \brief Forward iterator for values. |
| 1945 | 1945 | /// |
| … |
… |
|
| 1948 | 1948 | /// be accessed in the <tt>[beginValue, endValue)</tt> range. |
| 1949 | 1949 | class ValueIterator |
| 1950 | 1950 | : public std::iterator<std::forward_iterator_tag, Value> { |
| 1951 | | friend class InvertableMap; |
| | 1951 | friend class CrossRefMap; |
| 1952 | 1952 | private: |
| 1953 | 1953 | ValueIterator(typename Container::const_iterator _it) |
| 1954 | 1954 | : it(_it) {} |
| … |
… |
|
| 2072 | 2072 | /// \brief Constructor |
| 2073 | 2073 | /// |
| 2074 | 2074 | /// Constructor of the InverseMap. |
| 2075 | | explicit InverseMap(const InvertableMap& inverted) |
| | 2075 | explicit InverseMap(const CrossRefMap& inverted) |
| 2076 | 2076 | : _inverted(inverted) {} |
| 2077 | 2077 | |
| 2078 | 2078 | /// The value type of the InverseMap. |
| 2079 | | typedef typename InvertableMap::Key Value; |
| | 2079 | typedef typename CrossRefMap::Key Value; |
| 2080 | 2080 | /// The key type of the InverseMap. |
| 2081 | | typedef typename InvertableMap::Value Key; |
| | 2081 | typedef typename CrossRefMap::Value Key; |
| 2082 | 2082 | |
| 2083 | 2083 | /// \brief Subscript operator. |
| 2084 | 2084 | /// |
| … |
… |
|
| 2089 | 2089 | } |
| 2090 | 2090 | |
| 2091 | 2091 | private: |
| 2092 | | const InvertableMap& _inverted; |
| | 2092 | const CrossRefMap& _inverted; |
| 2093 | 2093 | }; |
| 2094 | 2094 | |
| 2095 | 2095 | /// \brief It gives back the read-only inverse map. |
| … |
… |
|
| 2101 | 2101 | |
| 2102 | 2102 | }; |
| 2103 | 2103 | |
| 2104 | | /// \brief Provides a mutable, continuous and unique descriptor for each |
| 2105 | | /// item in a graph. |
| | 2104 | /// \brief Provides continuous and unique ID for the |
| | 2105 | /// items of a graph. |
| 2106 | 2106 | /// |
| 2107 | | /// DescriptorMap provides a unique and continuous (but mutable) |
| 2108 | | /// descriptor (id) for each item of the same type (\c Node, \c Arc or |
| | 2107 | /// RangeIdMap provides a unique and continuous |
| | 2108 | /// ID for each item of a given type (\c Node, \c Arc or |
| 2109 | 2109 | /// \c Edge) in a graph. This id is |
| 2110 | 2110 | /// - \b unique: different items get different ids, |
| 2111 | 2111 | /// - \b continuous: the range of the ids is the set of integers |
| 2112 | 2112 | /// between 0 and \c n-1, where \c n is the number of the items of |
| 2113 | | /// this type (\c Node, \c Arc or \c Edge). So the id of an item can |
| 2114 | | /// change if you delete an other item of the same type, i.e. this |
| 2115 | | /// id is mutable. |
| | 2113 | /// this type (\c Node, \c Arc or \c Edge). |
| | 2114 | /// - So, the ids will can change when you deleting an item of the same type. |
| 2116 | 2115 | /// |
| 2117 | 2116 | /// Thus this id is not (necessarily) the same as what can get using |
| 2118 | 2117 | /// the \c id() function of the graph or \ref IdMap. |
| … |
… |
|
| 2125 | 2124 | /// |
| 2126 | 2125 | /// \see IdMap |
| 2127 | 2126 | template <typename GR, typename K> |
| 2128 | | class DescriptorMap |
| | 2127 | class RangeIdMap |
| 2129 | 2128 | : protected ItemSetTraits<GR, K>::template Map<int>::Type { |
| 2130 | 2129 | |
| 2131 | 2130 | typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map; |
| 2132 | 2131 | |
| 2133 | 2132 | public: |
| 2134 | | /// The graph type of DescriptorMap. |
| | 2133 | /// The graph type of RangeIdMap. |
| 2135 | 2134 | typedef GR Graph; |
| 2136 | | /// The key type of DescriptorMap (\c Node, \c Arc or \c Edge). |
| | 2135 | /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge). |
| 2137 | 2136 | typedef K Item; |
| 2138 | | /// The key type of DescriptorMap (\c Node, \c Arc or \c Edge). |
| | 2137 | /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge). |
| 2139 | 2138 | typedef K Key; |
| 2140 | | /// The value type of DescriptorMap. |
| | 2139 | /// The value type of RangeIdMap. |
| 2141 | 2140 | typedef int Value; |
| 2142 | 2141 | |
| 2143 | 2142 | /// \brief Constructor. |
| 2144 | 2143 | /// |
| 2145 | | /// Constructor for descriptor map. |
| 2146 | | explicit DescriptorMap(const Graph& gr) : Map(gr) { |
| | 2144 | /// Constructor. |
| | 2145 | explicit RangeIdMap(const Graph& gr) : Map(gr) { |
| 2147 | 2146 | Item it; |
| 2148 | 2147 | const typename Map::Notifier* nf = Map::notifier(); |
| 2149 | 2148 | for (nf->first(it); it != INVALID; nf->next(it)) { |
| … |
… |
|
| 2244 | 2243 | _inv_map[pi] = q; |
| 2245 | 2244 | } |
| 2246 | 2245 | |
| 2247 | | /// \brief Gives back the \e descriptor of the item. |
| | 2246 | /// \brief Gives back the \e RangeId of the item |
| 2248 | 2247 | /// |
| 2249 | | /// Gives back the mutable and unique \e descriptor of the map. |
| | 2248 | /// Gives back the \e RangeId of the item. |
| 2250 | 2249 | int operator[](const Item& item) const { |
| 2251 | 2250 | return Map::operator[](item); |
| 2252 | 2251 | } |
| 2253 | 2252 | |
| 2254 | | /// \brief Gives back the item by its descriptor. |
| 2255 | | /// |
| 2256 | | /// Gives back th item by its descriptor. |
| | 2253 | /// \brief Gives back the item belonging to a RangeId |
| | 2254 | /// |
| | 2255 | /// Gives back the item belonging to a RangeId. |
| 2257 | 2256 | Item operator()(int id) const { |
| 2258 | 2257 | return _inv_map[id]; |
| 2259 | 2258 | } |
| … |
… |
|
| 2265 | 2264 | |
| 2266 | 2265 | public: |
| 2267 | 2266 | |
| 2268 | | /// \brief The inverse map type of DescriptorMap. |
| | 2267 | /// \brief The inverse map type of RangeIdMap. |
| 2269 | 2268 | /// |
| 2270 | | /// The inverse map type of DescriptorMap. |
| | 2269 | /// The inverse map type of RangeIdMap. |
| 2271 | 2270 | class InverseMap { |
| 2272 | 2271 | public: |
| 2273 | 2272 | /// \brief Constructor |
| 2274 | 2273 | /// |
| 2275 | 2274 | /// Constructor of the InverseMap. |
| 2276 | | explicit InverseMap(const DescriptorMap& inverted) |
| | 2275 | explicit InverseMap(const RangeIdMap& inverted) |
| 2277 | 2276 | : _inverted(inverted) {} |
| 2278 | 2277 | |
| 2279 | 2278 | |
| 2280 | 2279 | /// The value type of the InverseMap. |
| 2281 | | typedef typename DescriptorMap::Key Value; |
| | 2280 | typedef typename RangeIdMap::Key Value; |
| 2282 | 2281 | /// The key type of the InverseMap. |
| 2283 | | typedef typename DescriptorMap::Value Key; |
| | 2282 | typedef typename RangeIdMap::Value Key; |
| 2284 | 2283 | |
| 2285 | 2284 | /// \brief Subscript operator. |
| 2286 | 2285 | /// |
| … |
… |
|
| 2298 | 2297 | } |
| 2299 | 2298 | |
| 2300 | 2299 | private: |
| 2301 | | const DescriptorMap& _inverted; |
| | 2300 | const RangeIdMap& _inverted; |
| 2302 | 2301 | }; |
| 2303 | 2302 | |
| 2304 | 2303 | /// \brief Gives back the inverse of the map. |
diff --git a/test/graph_utils_test.cc b/test/graph_utils_test.cc
|
a
|
b
|
|
| 38 | 38 | for (int i = 0; i < 10; ++i) { |
| 39 | 39 | digraph.addNode(); |
| 40 | 40 | } |
| 41 | | DescriptorMap<Digraph, Node> nodes(digraph); |
| 42 | | typename DescriptorMap<Digraph, Node>::InverseMap invNodes(nodes); |
| | 41 | RangeIdMap<Digraph, Node> nodes(digraph); |
| | 42 | typename RangeIdMap<Digraph, Node>::InverseMap invNodes(nodes); |
| 43 | 43 | for (int i = 0; i < 100; ++i) { |
| 44 | 44 | int src = rnd[invNodes.size()]; |
| 45 | 45 | int trg = rnd[invNodes.size()]; |
| 46 | 46 | digraph.addArc(invNodes[src], invNodes[trg]); |
| 47 | 47 | } |
| 48 | 48 | typename Digraph::template ArcMap<bool> found(digraph, false); |
| 49 | | DescriptorMap<Digraph, Arc> arcs(digraph); |
| | 49 | RangeIdMap<Digraph, Arc> arcs(digraph); |
| 50 | 50 | for (NodeIt src(digraph); src != INVALID; ++src) { |
| 51 | 51 | for (NodeIt trg(digraph); trg != INVALID; ++trg) { |
| 52 | 52 | for (ConArcIt<Digraph> con(digraph, src, trg); con != INVALID; ++con) { |
| … |
… |
|
| 113 | 113 | for (int i = 0; i < 10; ++i) { |
| 114 | 114 | graph.addNode(); |
| 115 | 115 | } |
| 116 | | DescriptorMap<Graph, Node> nodes(graph); |
| 117 | | typename DescriptorMap<Graph, Node>::InverseMap invNodes(nodes); |
| | 116 | RangeIdMap<Graph, Node> nodes(graph); |
| | 117 | typename RangeIdMap<Graph, Node>::InverseMap invNodes(nodes); |
| 118 | 118 | for (int i = 0; i < 100; ++i) { |
| 119 | 119 | int src = rnd[invNodes.size()]; |
| 120 | 120 | int trg = rnd[invNodes.size()]; |
| 121 | 121 | graph.addEdge(invNodes[src], invNodes[trg]); |
| 122 | 122 | } |
| 123 | 123 | typename Graph::template EdgeMap<int> found(graph, 0); |
| 124 | | DescriptorMap<Graph, Edge> edges(graph); |
| | 124 | RangeIdMap<Graph, Edge> edges(graph); |
| 125 | 125 | for (NodeIt src(graph); src != INVALID; ++src) { |
| 126 | 126 | for (NodeIt trg(graph); trg != INVALID; ++trg) { |
| 127 | 127 | for (ConEdgeIt<Graph> con(graph, src, trg); con != INVALID; ++con) { |