gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Remove InverseMap and DescriptorMap
0 2 0
1.0
2 files changed with 8 insertions and 413 deletions:
↑ Collapse diff ↑
Ignore white space 48 line context
... ...
@@ -1826,453 +1826,48 @@
1826 1826
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1827 1827

	
1828 1828
      /// \brief Constructor.
1829 1829
      ///
1830 1830
      /// Constructor for creating an id-to-item map.
1831 1831
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1832 1832

	
1833 1833
      /// \brief Gives back the given item from its id.
1834 1834
      ///
1835 1835
      /// Gives back the given item from its id.
1836 1836
      ///
1837 1837
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1838 1838

	
1839 1839
    private:
1840 1840
      const Graph* _graph;
1841 1841
    };
1842 1842

	
1843 1843
    /// \brief Gives back the inverse of the map.
1844 1844
    ///
1845 1845
    /// Gives back the inverse of the IdMap.
1846 1846
    InverseMap inverse() const { return InverseMap(*_graph);}
1847 1847

	
1848 1848
  };
1849 1849

	
1850

	
1851
  /// \brief General invertable graph-map type.
1852

	
1853
  /// This type provides simple invertable graph-maps.
1854
  /// The InvertableMap wraps an arbitrary ReadWriteMap
1855
  /// and if a key is set to a new value then store it
1856
  /// in the inverse map.
1857
  ///
1858
  /// The values of the map can be accessed
1859
  /// with stl compatible forward iterator.
1860
  ///
1861
  /// \tparam _Graph The graph type.
1862
  /// \tparam _Item The item type of the graph.
1863
  /// \tparam _Value The value type of the map.
1864
  ///
1865
  /// \see IterableValueMap
1866
  template <typename _Graph, typename _Item, typename _Value>
1867
  class InvertableMap
1868
    : protected ItemSetTraits<_Graph, _Item>::template Map<_Value>::Type {
1869
  private:
1870

	
1871
    typedef typename ItemSetTraits<_Graph, _Item>::
1872
    template Map<_Value>::Type Map;
1873
    typedef _Graph Graph;
1874

	
1875
    typedef std::map<_Value, _Item> Container;
1876
    Container _inv_map;
1877

	
1878
  public:
1879

	
1880
    /// The key type of InvertableMap (Node, Arc, Edge).
1881
    typedef typename Map::Key Key;
1882
    /// The value type of the InvertableMap.
1883
    typedef typename Map::Value Value;
1884

	
1885

	
1886

	
1887
    /// \brief Constructor.
1888
    ///
1889
    /// Construct a new InvertableMap for the graph.
1890
    ///
1891
    explicit InvertableMap(const Graph& graph) : Map(graph) {}
1892

	
1893
    /// \brief Forward iterator for values.
1894
    ///
1895
    /// This iterator is an stl compatible forward
1896
    /// iterator on the values of the map. The values can
1897
    /// be accessed in the [beginValue, endValue) range.
1898
    ///
1899
    class ValueIterator
1900
      : public std::iterator<std::forward_iterator_tag, Value> {
1901
      friend class InvertableMap;
1902
    private:
1903
      ValueIterator(typename Container::const_iterator _it)
1904
        : it(_it) {}
1905
    public:
1906

	
1907
      ValueIterator() {}
1908

	
1909
      ValueIterator& operator++() { ++it; return *this; }
1910
      ValueIterator operator++(int) {
1911
        ValueIterator tmp(*this);
1912
        operator++();
1913
        return tmp;
1914
      }
1915

	
1916
      const Value& operator*() const { return it->first; }
1917
      const Value* operator->() const { return &(it->first); }
1918

	
1919
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1920
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1921

	
1922
    private:
1923
      typename Container::const_iterator it;
1924
    };
1925

	
1926
    /// \brief Returns an iterator to the first value.
1927
    ///
1928
    /// Returns an stl compatible iterator to the
1929
    /// first value of the map. The values of the
1930
    /// map can be accessed in the [beginValue, endValue)
1931
    /// range.
1932
    ValueIterator beginValue() const {
1933
      return ValueIterator(_inv_map.begin());
1934
    }
1935

	
1936
    /// \brief Returns an iterator after the last value.
1937
    ///
1938
    /// Returns an stl compatible iterator after the
1939
    /// last value of the map. The values of the
1940
    /// map can be accessed in the [beginValue, endValue)
1941
    /// range.
1942
    ValueIterator endValue() const {
1943
      return ValueIterator(_inv_map.end());
1944
    }
1945

	
1946
    /// \brief The setter function of the map.
1947
    ///
1948
    /// Sets the mapped value.
1949
    void set(const Key& key, const Value& val) {
1950
      Value oldval = Map::operator[](key);
1951
      typename Container::iterator it = _inv_map.find(oldval);
1952
      if (it != _inv_map.end() && it->second == key) {
1953
        _inv_map.erase(it);
1954
      }
1955
      _inv_map.insert(make_pair(val, key));
1956
      Map::set(key, val);
1957
    }
1958

	
1959
    /// \brief The getter function of the map.
1960
    ///
1961
    /// It gives back the value associated with the key.
1962
    typename MapTraits<Map>::ConstReturnValue
1963
    operator[](const Key& key) const {
1964
      return Map::operator[](key);
1965
    }
1966

	
1967
    /// \brief Gives back the item by its value.
1968
    ///
1969
    /// Gives back the item by its value.
1970
    Key operator()(const Value& key) const {
1971
      typename Container::const_iterator it = _inv_map.find(key);
1972
      return it != _inv_map.end() ? it->second : INVALID;
1973
    }
1974

	
1975
  protected:
1976

	
1977
    /// \brief Erase the key from the map.
1978
    ///
1979
    /// Erase the key to the map. It is called by the
1980
    /// \c AlterationNotifier.
1981
    virtual void erase(const Key& key) {
1982
      Value val = Map::operator[](key);
1983
      typename Container::iterator it = _inv_map.find(val);
1984
      if (it != _inv_map.end() && it->second == key) {
1985
        _inv_map.erase(it);
1986
      }
1987
      Map::erase(key);
1988
    }
1989

	
1990
    /// \brief Erase more keys from the map.
1991
    ///
1992
    /// Erase more keys from the map. It is called by the
1993
    /// \c AlterationNotifier.
1994
    virtual void erase(const std::vector<Key>& keys) {
1995
      for (int i = 0; i < int(keys.size()); ++i) {
1996
        Value val = Map::operator[](keys[i]);
1997
        typename Container::iterator it = _inv_map.find(val);
1998
        if (it != _inv_map.end() && it->second == keys[i]) {
1999
          _inv_map.erase(it);
2000
        }
2001
      }
2002
      Map::erase(keys);
2003
    }
2004

	
2005
    /// \brief Clear the keys from the map and inverse map.
2006
    ///
2007
    /// Clear the keys from the map and inverse map. It is called by the
2008
    /// \c AlterationNotifier.
2009
    virtual void clear() {
2010
      _inv_map.clear();
2011
      Map::clear();
2012
    }
2013

	
2014
  public:
2015

	
2016
    /// \brief The inverse map type.
2017
    ///
2018
    /// The inverse of this map. The subscript operator of the map
2019
    /// gives back always the item what was last assigned to the value.
2020
    class InverseMap {
2021
    public:
2022
      /// \brief Constructor of the InverseMap.
2023
      ///
2024
      /// Constructor of the InverseMap.
2025
      explicit InverseMap(const InvertableMap& inverted)
2026
        : _inverted(inverted) {}
2027

	
2028
      /// The value type of the InverseMap.
2029
      typedef typename InvertableMap::Key Value;
2030
      /// The key type of the InverseMap.
2031
      typedef typename InvertableMap::Value Key;
2032

	
2033
      /// \brief Subscript operator.
2034
      ///
2035
      /// Subscript operator. It gives back always the item
2036
      /// what was last assigned to the value.
2037
      Value operator[](const Key& key) const {
2038
        return _inverted(key);
2039
      }
2040

	
2041
    private:
2042
      const InvertableMap& _inverted;
2043
    };
2044

	
2045
    /// \brief It gives back the just readable inverse map.
2046
    ///
2047
    /// It gives back the just readable inverse map.
2048
    InverseMap inverse() const {
2049
      return InverseMap(*this);
2050
    }
2051

	
2052

	
2053

	
2054
  };
2055

	
2056
  /// \brief Provides a mutable, continuous and unique descriptor for each
2057
  /// item in the graph.
2058
  ///
2059
  /// The DescriptorMap class provides a unique and continuous (but mutable)
2060
  /// descriptor (id) for each item of the same type (e.g. node) in the
2061
  /// graph. This id is <ul><li>\b unique: different items (nodes) get
2062
  /// different ids <li>\b continuous: the range of the ids is the set of
2063
  /// integers between 0 and \c n-1, where \c n is the number of the items of
2064
  /// this type (e.g. nodes) (so the id of a node can change if you delete an
2065
  /// other node, i.e. this id is mutable).  </ul> This map can be inverted
2066
  /// with its member class \c InverseMap, or with the \c operator() member.
2067
  ///
2068
  /// \tparam _Graph The graph class the \c DescriptorMap belongs to.
2069
  /// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or
2070
  /// Edge.
2071
  template <typename _Graph, typename _Item>
2072
  class DescriptorMap
2073
    : protected ItemSetTraits<_Graph, _Item>::template Map<int>::Type {
2074

	
2075
    typedef _Item Item;
2076
    typedef typename ItemSetTraits<_Graph, _Item>::template Map<int>::Type Map;
2077

	
2078
  public:
2079
    /// The graph class of DescriptorMap.
2080
    typedef _Graph Graph;
2081

	
2082
    /// The key type of DescriptorMap (Node, Arc, Edge).
2083
    typedef typename Map::Key Key;
2084
    /// The value type of DescriptorMap.
2085
    typedef typename Map::Value Value;
2086

	
2087
    /// \brief Constructor.
2088
    ///
2089
    /// Constructor for descriptor map.
2090
    explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
2091
      Item it;
2092
      const typename Map::Notifier* nf = Map::notifier();
2093
      for (nf->first(it); it != INVALID; nf->next(it)) {
2094
        Map::set(it, _inv_map.size());
2095
        _inv_map.push_back(it);
2096
      }
2097
    }
2098

	
2099
  protected:
2100

	
2101
    /// \brief Add a new key to the map.
2102
    ///
2103
    /// Add a new key to the map. It is called by the
2104
    /// \c AlterationNotifier.
2105
    virtual void add(const Item& item) {
2106
      Map::add(item);
2107
      Map::set(item, _inv_map.size());
2108
      _inv_map.push_back(item);
2109
    }
2110

	
2111
    /// \brief Add more new keys to the map.
2112
    ///
2113
    /// Add more new keys to the map. It is called by the
2114
    /// \c AlterationNotifier.
2115
    virtual void add(const std::vector<Item>& items) {
2116
      Map::add(items);
2117
      for (int i = 0; i < int(items.size()); ++i) {
2118
        Map::set(items[i], _inv_map.size());
2119
        _inv_map.push_back(items[i]);
2120
      }
2121
    }
2122

	
2123
    /// \brief Erase the key from the map.
2124
    ///
2125
    /// Erase the key from the map. It is called by the
2126
    /// \c AlterationNotifier.
2127
    virtual void erase(const Item& item) {
2128
      Map::set(_inv_map.back(), Map::operator[](item));
2129
      _inv_map[Map::operator[](item)] = _inv_map.back();
2130
      _inv_map.pop_back();
2131
      Map::erase(item);
2132
    }
2133

	
2134
    /// \brief Erase more keys from the map.
2135
    ///
2136
    /// Erase more keys from the map. It is called by the
2137
    /// \c AlterationNotifier.
2138
    virtual void erase(const std::vector<Item>& items) {
2139
      for (int i = 0; i < int(items.size()); ++i) {
2140
        Map::set(_inv_map.back(), Map::operator[](items[i]));
2141
        _inv_map[Map::operator[](items[i])] = _inv_map.back();
2142
        _inv_map.pop_back();
2143
      }
2144
      Map::erase(items);
2145
    }
2146

	
2147
    /// \brief Build the unique map.
2148
    ///
2149
    /// Build the unique map. It is called by the
2150
    /// \c AlterationNotifier.
2151
    virtual void build() {
2152
      Map::build();
2153
      Item it;
2154
      const typename Map::Notifier* nf = Map::notifier();
2155
      for (nf->first(it); it != INVALID; nf->next(it)) {
2156
        Map::set(it, _inv_map.size());
2157
        _inv_map.push_back(it);
2158
      }
2159
    }
2160

	
2161
    /// \brief Clear the keys from the map.
2162
    ///
2163
    /// Clear the keys from the map. It is called by the
2164
    /// \c AlterationNotifier.
2165
    virtual void clear() {
2166
      _inv_map.clear();
2167
      Map::clear();
2168
    }
2169

	
2170
  public:
2171

	
2172
    /// \brief Returns the maximal value plus one.
2173
    ///
2174
    /// Returns the maximal value plus one in the map.
2175
    unsigned int size() const {
2176
      return _inv_map.size();
2177
    }
2178

	
2179
    /// \brief Swaps the position of the two items in the map.
2180
    ///
2181
    /// Swaps the position of the two items in the map.
2182
    void swap(const Item& p, const Item& q) {
2183
      int pi = Map::operator[](p);
2184
      int qi = Map::operator[](q);
2185
      Map::set(p, qi);
2186
      _inv_map[qi] = p;
2187
      Map::set(q, pi);
2188
      _inv_map[pi] = q;
2189
    }
2190

	
2191
    /// \brief Gives back the \e descriptor of the item.
2192
    ///
2193
    /// Gives back the mutable and unique \e descriptor of the map.
2194
    int operator[](const Item& item) const {
2195
      return Map::operator[](item);
2196
    }
2197

	
2198
    /// \brief Gives back the item by its descriptor.
2199
    ///
2200
    /// Gives back th item by its descriptor.
2201
    Item operator()(int id) const {
2202
      return _inv_map[id];
2203
    }
2204

	
2205
  private:
2206

	
2207
    typedef std::vector<Item> Container;
2208
    Container _inv_map;
2209

	
2210
  public:
2211
    /// \brief The inverse map type of DescriptorMap.
2212
    ///
2213
    /// The inverse map type of DescriptorMap.
2214
    class InverseMap {
2215
    public:
2216
      /// \brief Constructor of the InverseMap.
2217
      ///
2218
      /// Constructor of the InverseMap.
2219
      explicit InverseMap(const DescriptorMap& inverted)
2220
        : _inverted(inverted) {}
2221

	
2222

	
2223
      /// The value type of the InverseMap.
2224
      typedef typename DescriptorMap::Key Value;
2225
      /// The key type of the InverseMap.
2226
      typedef typename DescriptorMap::Value Key;
2227

	
2228
      /// \brief Subscript operator.
2229
      ///
2230
      /// Subscript operator. It gives back the item
2231
      /// that the descriptor belongs to currently.
2232
      Value operator[](const Key& key) const {
2233
        return _inverted(key);
2234
      }
2235

	
2236
      /// \brief Size of the map.
2237
      ///
2238
      /// Returns the size of the map.
2239
      unsigned int size() const {
2240
        return _inverted.size();
2241
      }
2242

	
2243
    private:
2244
      const DescriptorMap& _inverted;
2245
    };
2246

	
2247
    /// \brief Gives back the inverse of the map.
2248
    ///
2249
    /// Gives back the inverse of the map.
2250
    const InverseMap inverse() const {
2251
      return InverseMap(*this);
2252
    }
2253
  };
2254

	
2255 1850
  /// \brief Returns the source of the given arc.
2256 1851
  ///
2257 1852
  /// The SourceMap gives back the source Node of the given arc.
2258 1853
  /// \see TargetMap
2259 1854
  template <typename Digraph>
2260 1855
  class SourceMap {
2261 1856
  public:
2262 1857

	
2263 1858
    typedef typename Digraph::Node Value;
2264 1859
    typedef typename Digraph::Arc Key;
2265 1860

	
2266 1861
    /// \brief Constructor
2267 1862
    ///
2268 1863
    /// Constructor
2269 1864
    /// \param _digraph The digraph that the map belongs to.
2270 1865
    explicit SourceMap(const Digraph& digraph) : _digraph(digraph) {}
2271 1866

	
2272 1867
    /// \brief The subscript operator.
2273 1868
    ///
2274 1869
    /// The subscript operator.
2275 1870
    /// \param arc The arc
2276 1871
    /// \return The source of the arc
2277 1872
    Value operator[](const Key& arc) const {
2278 1873
      return _digraph.source(arc);
Ignore white space 48 line context
... ...
@@ -14,60 +14,60 @@
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <cstdlib>
20 20
#include <ctime>
21 21

	
22 22
#include <lemon/random.h>
23 23
#include <lemon/list_graph.h>
24 24
#include <lemon/smart_graph.h>
25 25
#include <lemon/maps.h>
26 26

	
27 27
#include "graph_test.h"
28 28
#include "test_tools.h"
29 29

	
30 30
using namespace lemon;
31 31

	
32 32
template <typename Digraph>
33 33
void checkFindArcs() {
34 34
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
35 35

	
36 36
  {
37 37
    Digraph digraph;
38
    typename Digraph::template NodeMap<int> nodes(digraph);
39
    std::vector<Node> invNodes;
38 40
    for (int i = 0; i < 10; ++i) {
39
      digraph.addNode();
41
      invNodes.push_back(digraph.addNode());
42
      nodes[invNodes.back()]=invNodes.size()-1;
40 43
    }
41
    DescriptorMap<Digraph, Node> nodes(digraph);
42
    typename DescriptorMap<Digraph, Node>::InverseMap invNodes(nodes);
43 44
    for (int i = 0; i < 100; ++i) {
44 45
      int src = rnd[invNodes.size()];
45 46
      int trg = rnd[invNodes.size()];
46 47
      digraph.addArc(invNodes[src], invNodes[trg]);
47 48
    }
48 49
    typename Digraph::template ArcMap<bool> found(digraph, false);
49
    DescriptorMap<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) {
53 53
          check(digraph.source(con) == src, "Wrong source.");
54 54
          check(digraph.target(con) == trg, "Wrong target.");
55 55
          check(found[con] == false, "The arc found already.");
56 56
          found[con] = true;
57 57
        }
58 58
      }
59 59
    }
60 60
    for (ArcIt it(digraph); it != INVALID; ++it) {
61 61
      check(found[it] == true, "The arc is not found.");
62 62
    }
63 63
  }
64 64

	
65 65
  {
66 66
    int num = 5;
67 67
    Digraph fg;
68 68
    std::vector<Node> nodes;
69 69
    for (int i = 0; i < num; ++i) {
70 70
      nodes.push_back(fg.addNode());
71 71
    }
72 72
    for (int i = 0; i < num * num; ++i) {
73 73
      fg.addArc(nodes[i / num], nodes[i % num]);
... ...
@@ -89,60 +89,60 @@
89 89
    for (NodeIt src(fg); src != INVALID; ++src) {
90 90
      for (NodeIt trg(fg); trg != INVALID; ++trg) {
91 91
        Arc con1 = al1(src, trg);
92 92
        Arc con2 = al2(src, trg);
93 93
        Arc con3 = al3(src, trg);
94 94
        Arc con4 = findArc(fg, src, trg);
95 95
        check(con1 == con2 && con2 == con3 && con3 == con4,
96 96
              "Different results.")
97 97
        check(con1 != INVALID, "There is no connecting arc.");
98 98
        check(fg.source(con1) == src, "Wrong source.");
99 99
        check(fg.target(con1) == trg, "Wrong target.");
100 100
        check(al3(src, trg, con3) == INVALID,
101 101
              "There is more connecting arc.");
102 102
        check(findArc(fg, src, trg, con4) == INVALID,
103 103
              "There is more connecting arc.");
104 104
      }
105 105
    }
106 106
  }
107 107
}
108 108

	
109 109
template <typename Graph>
110 110
void checkFindEdges() {
111 111
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
112 112
  Graph graph;
113
  typename Graph::template NodeMap<int> nodes(graph);
114
  std::vector<Node> invNodes;
113 115
  for (int i = 0; i < 10; ++i) {
114
    graph.addNode();
116
    invNodes.push_back(graph.addNode());
117
    nodes[invNodes.back()]=invNodes.size()-1;
115 118
  }
116
  DescriptorMap<Graph, Node> nodes(graph);
117
  typename DescriptorMap<Graph, Node>::InverseMap invNodes(nodes);
118 119
  for (int i = 0; i < 100; ++i) {
119 120
    int src = rnd[invNodes.size()];
120 121
    int trg = rnd[invNodes.size()];
121 122
    graph.addEdge(invNodes[src], invNodes[trg]);
122 123
  }
123 124
  typename Graph::template EdgeMap<int> found(graph, 0);
124
  DescriptorMap<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) {
128 128
        check( (graph.u(con) == src && graph.v(con) == trg) ||
129 129
               (graph.v(con) == src && graph.u(con) == trg),
130 130
               "Wrong end nodes.");
131 131
        ++found[con];
132 132
        check(found[con] <= 2, "The edge found more than twice.");
133 133
      }
134 134
    }
135 135
  }
136 136
  for (EdgeIt it(graph); it != INVALID; ++it) {
137 137
    check( (graph.u(it) != graph.v(it) && found[it] == 2) ||
138 138
           (graph.u(it) == graph.v(it) && found[it] == 1),
139 139
           "The edge is not found correctly.");
140 140
  }
141 141
}
142 142

	
143 143
template <class Digraph>
144 144
void checkDeg()
145 145
{
146 146
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
147 147

	
148 148
  const int nodeNum = 10;
0 comments (0 inline)