gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 4 0
merge default
1 file changed with 77 insertions and 23 deletions:
↑ Collapse diff ↑
Show white space 2 line context
... ...
@@ -541,3 +541,3 @@
541 541
    public:
542
      ArcMap(const Graph& _g) 
542
      explicit ArcMap(const Graph& _g) 
543 543
	: Parent(_g) {}
... ...
@@ -565,3 +565,3 @@
565 565
    public:
566
      EdgeMap(const Graph& _g) 
566
      explicit EdgeMap(const Graph& _g) 
567 567
	: Parent(_g) {}
Show white space 2 line context
... ...
@@ -606,3 +606,3 @@
606 606
    public:
607
      NodeMap(const Graph& graph)
607
      explicit NodeMap(const Graph& graph)
608 608
        : Parent(graph) {}
... ...
@@ -630,3 +630,3 @@
630 630
    public:
631
      ArcMap(const Graph& graph)
631
      explicit ArcMap(const Graph& graph)
632 632
        : Parent(graph) {}
... ...
@@ -654,3 +654,3 @@
654 654
    public:
655
      EdgeMap(const Graph& graph)
655
      explicit EdgeMap(const Graph& graph)
656 656
        : Parent(graph) {}
Show white space 2 line context
... ...
@@ -1904,6 +1904,4 @@
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
... ...
@@ -1911,2 +1909,5 @@
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.
... ...
@@ -1925,3 +1926,3 @@
1925 1926

	
1926
    typedef std::map<V, K> Container;
1927
    typedef std::multimap<V, K> Container;
1927 1928
    Container _inv_map;
... ...
@@ -1950,2 +1951,4 @@
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
... ...
@@ -2002,7 +2005,11 @@
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);
... ...
@@ -2018,7 +2025,10 @@
2018 2025

	
2019
    /// \brief Gives back the item 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
      typename Container::const_iterator it = _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;
... ...
@@ -2034,5 +2044,9 @@
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
      }
... ...
@@ -2048,5 +2062,9 @@
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
        }
... ...
@@ -2086,4 +2104,5 @@
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 {
Show white space 2 line context
... ...
@@ -24,2 +24,3 @@
24 24
#include <lemon/maps.h>
25
#include <lemon/list_graph.h>
25 26

	
... ...
@@ -351,2 +352,36 @@
351 352

	
353
  // CrossRefMap
354
  {
355
    typedef ListDigraph Graph;
356
    DIGRAPH_TYPEDEFS(Graph);
357

	
358
    checkConcept<ReadWriteMap<Node, int>,
359
                 CrossRefMap<Graph, Node, int> >();
360
    
361
    Graph gr;
362
    typedef CrossRefMap<Graph, Node, char> CRMap;
363
    typedef CRMap::ValueIterator ValueIt;
364
    CRMap map(gr);
365
    
366
    Node n0 = gr.addNode();
367
    Node n1 = gr.addNode();
368
    Node n2 = gr.addNode();
369
    
370
    map.set(n0, 'A');
371
    map.set(n1, 'B');
372
    map.set(n2, 'C');
373
    map.set(n2, 'A');
374
    map.set(n0, 'C');
375

	
376
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
377
          "Wrong CrossRefMap");
378
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
379
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
380
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
381

	
382
    ValueIt it = map.beginValue();
383
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
384
          it == map.endValue(), "Wrong value iterator");
385
  }
386

	
352 387
  return 0;
0 comments (0 inline)