gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 4 0
merge default
1 file changed with 80 insertions and 26 deletions:
↑ Collapse diff ↑
Ignore white space 48 line context
... ...
@@ -518,73 +518,73 @@
518 518
    Node runningNode(const InArcIt &e) const {
519 519
      return Parent::source(static_cast<const Arc&>(e));
520 520
    }
521 521

	
522 522
    // Base node of the iterator
523 523
    //
524 524
    // Returns the base node of the iterator
525 525
    Node baseNode(const IncEdgeIt &e) const {
526 526
      return e.direction ? u(e) : v(e);
527 527
    }
528 528
    // Running node of the iterator
529 529
    //
530 530
    // Returns the running node of the iterator
531 531
    Node runningNode(const IncEdgeIt &e) const {
532 532
      return e.direction ? v(e) : u(e);
533 533
    }
534 534

	
535 535

	
536 536
    template <typename _Value>
537 537
    class ArcMap 
538 538
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
539 539
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
540 540

	
541 541
    public:
542
      ArcMap(const Graph& _g) 
542
      explicit ArcMap(const Graph& _g) 
543 543
	: Parent(_g) {}
544 544
      ArcMap(const Graph& _g, const _Value& _v) 
545 545
	: Parent(_g, _v) {}
546 546

	
547 547
      ArcMap& operator=(const ArcMap& cmap) {
548 548
	return operator=<ArcMap>(cmap);
549 549
      }
550 550

	
551 551
      template <typename CMap>
552 552
      ArcMap& operator=(const CMap& cmap) {
553 553
        Parent::operator=(cmap);
554 554
	return *this;
555 555
      }
556 556

	
557 557
    };
558 558

	
559 559

	
560 560
    template <typename _Value>
561 561
    class EdgeMap 
562 562
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
563 563
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
564 564

	
565 565
    public:
566
      EdgeMap(const Graph& _g) 
566
      explicit EdgeMap(const Graph& _g) 
567 567
	: Parent(_g) {}
568 568

	
569 569
      EdgeMap(const Graph& _g, const _Value& _v) 
570 570
	: Parent(_g, _v) {}
571 571

	
572 572
      EdgeMap& operator=(const EdgeMap& cmap) {
573 573
	return operator=<EdgeMap>(cmap);
574 574
      }
575 575

	
576 576
      template <typename CMap>
577 577
      EdgeMap& operator=(const CMap& cmap) {
578 578
        Parent::operator=(cmap);
579 579
	return *this;
580 580
      }
581 581

	
582 582
    };
583 583

	
584 584

	
585 585
    // Alteration extension
586 586

	
587 587
    Edge addEdge(const Node& from, const Node& to) {
588 588
      Edge edge = Parent::addEdge(from, to);
589 589
      notifier(Edge()).add(edge);
590 590
      std::vector<Arc> arcs;
Ignore white space 48 line context
... ...
@@ -583,97 +583,97 @@
583 583
      return Parent::source(static_cast<const Arc&>(arc));
584 584
    }
585 585

	
586 586
    // Base node of the iterator
587 587
    //
588 588
    // Returns the base node of the iterator
589 589
    Node baseNode(const IncEdgeIt &edge) const {
590 590
      return edge._direction ? u(edge) : v(edge);
591 591
    }
592 592
    // Running node of the iterator
593 593
    //
594 594
    // Returns the running node of the iterator
595 595
    Node runningNode(const IncEdgeIt &edge) const {
596 596
      return edge._direction ? v(edge) : u(edge);
597 597
    }
598 598

	
599 599
    // Mappable extension
600 600

	
601 601
    template <typename _Value>
602 602
    class NodeMap
603 603
      : public MapExtender<DefaultMap<Graph, Node, _Value> > {
604 604
      typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
605 605

	
606 606
    public:
607
      NodeMap(const Graph& graph)
607
      explicit NodeMap(const Graph& graph)
608 608
        : Parent(graph) {}
609 609
      NodeMap(const Graph& graph, const _Value& value)
610 610
        : Parent(graph, value) {}
611 611

	
612 612
    private:
613 613
      NodeMap& operator=(const NodeMap& cmap) {
614 614
        return operator=<NodeMap>(cmap);
615 615
      }
616 616

	
617 617
      template <typename CMap>
618 618
      NodeMap& operator=(const CMap& cmap) {
619 619
        Parent::operator=(cmap);
620 620
        return *this;
621 621
      }
622 622

	
623 623
    };
624 624

	
625 625
    template <typename _Value>
626 626
    class ArcMap
627 627
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
628 628
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
629 629

	
630 630
    public:
631
      ArcMap(const Graph& graph)
631
      explicit ArcMap(const Graph& graph)
632 632
        : Parent(graph) {}
633 633
      ArcMap(const Graph& graph, const _Value& value)
634 634
        : Parent(graph, value) {}
635 635

	
636 636
    private:
637 637
      ArcMap& operator=(const ArcMap& cmap) {
638 638
        return operator=<ArcMap>(cmap);
639 639
      }
640 640

	
641 641
      template <typename CMap>
642 642
      ArcMap& operator=(const CMap& cmap) {
643 643
        Parent::operator=(cmap);
644 644
        return *this;
645 645
      }
646 646
    };
647 647

	
648 648

	
649 649
    template <typename _Value>
650 650
    class EdgeMap
651 651
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
652 652
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
653 653

	
654 654
    public:
655
      EdgeMap(const Graph& graph)
655
      explicit EdgeMap(const Graph& graph)
656 656
        : Parent(graph) {}
657 657

	
658 658
      EdgeMap(const Graph& graph, const _Value& value)
659 659
        : Parent(graph, value) {}
660 660

	
661 661
    private:
662 662
      EdgeMap& operator=(const EdgeMap& cmap) {
663 663
        return operator=<EdgeMap>(cmap);
664 664
      }
665 665

	
666 666
      template <typename CMap>
667 667
      EdgeMap& operator=(const CMap& cmap) {
668 668
        Parent::operator=(cmap);
669 669
        return *this;
670 670
      }
671 671

	
672 672
    };
673 673

	
674 674
    // Alteration extension
675 675

	
676 676
    Node addNode() {
677 677
      Node node = Parent::addNode();
678 678
      notifier(Node()).add(node);
679 679
      return node;
Ignore white space 48 line context
... ...
@@ -1881,94 +1881,97 @@
1881 1881
      /// \brief Constructor.
1882 1882
      ///
1883 1883
      /// Constructor for creating an id-to-item map.
1884 1884
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1885 1885

	
1886 1886
      /// \brief Gives back the given item from its id.
1887 1887
      ///
1888 1888
      /// Gives back the given item from its id.
1889 1889
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1890 1890

	
1891 1891
    private:
1892 1892
      const Graph* _graph;
1893 1893
    };
1894 1894

	
1895 1895
    /// \brief Gives back the inverse of the map.
1896 1896
    ///
1897 1897
    /// Gives back the inverse of the IdMap.
1898 1898
    InverseMap inverse() const { return InverseMap(*_graph);}
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
1918 1919
  template <typename GR, typename K, typename V>
1919 1920
  class CrossRefMap
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;
1933 1934
    typedef GR Digraph;
1934 1935
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1935 1936
    typedef K Item;
1936 1937
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1937 1938
    typedef K Key;
1938 1939
    /// The value type of CrossRefMap.
1939 1940
    typedef V Value;
1940 1941

	
1941 1942
    /// \brief Constructor.
1942 1943
    ///
1943 1944
    /// Construct a new CrossRefMap for the given graph.
1944 1945
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
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) {}
1957 1960
    public:
1958 1961

	
1959 1962
      ValueIterator() {}
1960 1963

	
1961 1964
      ValueIterator& operator++() { ++it; return *this; }
1962 1965
      ValueIterator operator++(int) {
1963 1966
        ValueIterator tmp(*this);
1964 1967
        operator++();
1965 1968
        return tmp;
1966 1969
      }
1967 1970

	
1968 1971
      const Value& operator*() const { return it->first; }
1969 1972
      const Value* operator->() const { return &(it->first); }
1970 1973

	
1971 1974
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1972 1975
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1973 1976

	
1974 1977
    private:
... ...
@@ -1979,134 +1982,150 @@
1979 1982
    ///
1980 1983
    /// Returns an stl compatible iterator to the
1981 1984
    /// first value of the map. The values of the
1982 1985
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1983 1986
    /// range.
1984 1987
    ValueIterator beginValue() const {
1985 1988
      return ValueIterator(_inv_map.begin());
1986 1989
    }
1987 1990

	
1988 1991
    /// \brief Returns an iterator after the last value.
1989 1992
    ///
1990 1993
    /// Returns an stl compatible iterator after the
1991 1994
    /// last value of the map. The values of the
1992 1995
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1993 1996
    /// range.
1994 1997
    ValueIterator endValue() const {
1995 1998
      return ValueIterator(_inv_map.end());
1996 1999
    }
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) {
2005
        _inv_map.erase(it);
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) {
2010
          _inv_map.erase(it);
2011
          break;
2012
        }
2006 2013
      }
2007
      _inv_map.insert(make_pair(val, key));
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 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;
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) {
2037
        _inv_map.erase(it);
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) {
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]) {
2051
          _inv_map.erase(it);
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]) {
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.
2058 2076
    ///
2059 2077
    /// Clear the keys from the map and the inverse map. It is called by the
2060 2078
    /// \c AlterationNotifier.
2061 2079
    virtual void clear() {
2062 2080
      _inv_map.clear();
2063 2081
      Map::clear();
2064 2082
    }
2065 2083

	
2066 2084
  public:
2067 2085

	
2068 2086
    /// \brief The inverse map type.
2069 2087
    ///
2070 2088
    /// The inverse of this map. The subscript operator of the map
2071 2089
    /// gives back the item that was last assigned to the value.
2072 2090
    class InverseMap {
2073 2091
    public:
2074 2092
      /// \brief Constructor
2075 2093
      ///
2076 2094
      /// Constructor of the InverseMap.
2077 2095
      explicit InverseMap(const CrossRefMap& inverted)
2078 2096
        : _inverted(inverted) {}
2079 2097

	
2080 2098
      /// The value type of the InverseMap.
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;
2095 2114
    };
2096 2115

	
2097 2116
    /// \brief It gives back the read-only inverse map.
2098 2117
    ///
2099 2118
    /// It gives back the read-only inverse map.
2100 2119
    InverseMap inverse() const {
2101 2120
      return InverseMap(*this);
2102 2121
    }
2103 2122

	
2104 2123
  };
2105 2124

	
2106 2125
  /// \brief Provides continuous and unique ID for the
2107 2126
  /// items of a graph.
2108 2127
  ///
2109 2128
  /// RangeIdMap provides a unique and continuous
2110 2129
  /// ID for each item of a given type (\c Node, \c Arc or
2111 2130
  /// \c Edge) in a graph. This id is
2112 2131
  ///  - \b unique: different items get different ids,
Ignore white space 48 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
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 <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25
#include <lemon/list_graph.h>
25 26

	
26 27
#include "test_tools.h"
27 28

	
28 29
using namespace lemon;
29 30
using namespace lemon::concepts;
30 31

	
31 32
struct A {};
32 33
inline bool operator<(A, A) { return true; }
33 34
struct B {};
34 35

	
35 36
class C {
36 37
  int x;
37 38
public:
38 39
  C(int _x) : x(_x) {}
39 40
};
40 41

	
41 42
class F {
42 43
public:
43 44
  typedef A argument_type;
44 45
  typedef B result_type;
45 46

	
46 47
  B operator()(const A&) const { return B(); }
47 48
private:
48 49
  F& operator=(const F&);
... ...
@@ -327,27 +328,61 @@
327 328

	
328 329
  // LoggerBoolMap
329 330
  {
330 331
    typedef std::vector<int> vec;
331 332
    vec v1;
332 333
    vec v2(10);
333 334
    LoggerBoolMap<std::back_insert_iterator<vec> >
334 335
      map1(std::back_inserter(v1));
335 336
    LoggerBoolMap<vec::iterator> map2(v2.begin());
336 337
    map1.set(10, false);
337 338
    map1.set(20, true);   map2.set(20, true);
338 339
    map1.set(30, false);  map2.set(40, false);
339 340
    map1.set(50, true);   map2.set(50, true);
340 341
    map1.set(60, true);   map2.set(60, true);
341 342
    check(v1.size() == 3 && v2.size() == 10 &&
342 343
          v1[0]==20 && v1[1]==50 && v1[2]==60 &&
343 344
          v2[0]==20 && v2[1]==50 && v2[2]==60,
344 345
          "Something is wrong with LoggerBoolMap");
345 346

	
346 347
    int i = 0;
347 348
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
348 349
          it != map2.end(); ++it )
349 350
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
350 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
  }
351 386

	
352 387
  return 0;
353 388
}
0 comments (0 inline)