gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Rename ValueIterator to ValueIt in graph maps (#302) but keep ValueIterator as an alias in CrossRefMap (only for reverse compatibility).
0 2 0
default
2 files changed with 42 insertions and 36 deletions:
↑ Collapse diff ↑
Ignore white space 24 line context
... ...
@@ -1898,25 +1898,25 @@
1898 1898
    /// Gives back the inverse of the IdMap.
1899 1899
    InverseMap inverse() const { return InverseMap(*_graph);}
1900 1900
  };
1901 1901

	
1902 1902

	
1903 1903
  /// \brief General cross reference graph map type.
1904 1904

	
1905 1905
  /// This class provides simple invertable graph maps.
1906 1906
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1907 1907
  /// and if a key is set to a new value, then stores it in the inverse map.
1908 1908
  /// The graph items can be accessed by their values either using
1909 1909
  /// \c InverseMap or \c operator()(), and the values of the map can be
1910
  /// accessed with an STL compatible forward iterator (\c ValueIterator).
1910
  /// accessed with an STL compatible forward iterator (\c ValueIt).
1911 1911
  /// 
1912 1912
  /// This map is intended to be used when all associated values are
1913 1913
  /// different (the map is actually invertable) or there are only a few
1914 1914
  /// items with the same value.
1915 1915
  /// Otherwise consider to use \c IterableValueMap, which is more 
1916 1916
  /// suitable and more efficient for such cases. It provides iterators
1917 1917
  /// to traverse the items with the same associated value, however
1918 1918
  /// it does not have \c InverseMap.
1919 1919
  ///
1920 1920
  /// This type is not reference map, so it cannot be modified with
1921 1921
  /// the subscript operator.
1922 1922
  ///
... ...
@@ -1952,76 +1952,79 @@
1952 1952
    /// \brief Constructor.
1953 1953
    ///
1954 1954
    /// Construct a new CrossRefMap for the given graph.
1955 1955
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1956 1956

	
1957 1957
    /// \brief Forward iterator for values.
1958 1958
    ///
1959 1959
    /// This iterator is an STL compatible forward
1960 1960
    /// iterator on the values of the map. The values can
1961 1961
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1962 1962
    /// They are considered with multiplicity, so each value is
1963 1963
    /// traversed for each item it is assigned to.
1964
    class ValueIterator
1964
    class ValueIt
1965 1965
      : public std::iterator<std::forward_iterator_tag, Value> {
1966 1966
      friend class CrossRefMap;
1967 1967
    private:
1968
      ValueIterator(typename Container::const_iterator _it)
1968
      ValueIt(typename Container::const_iterator _it)
1969 1969
        : it(_it) {}
1970 1970
    public:
1971 1971

	
1972 1972
      /// Constructor
1973
      ValueIterator() {}
1973
      ValueIt() {}
1974 1974

	
1975 1975
      /// \e
1976
      ValueIterator& operator++() { ++it; return *this; }
1976
      ValueIt& operator++() { ++it; return *this; }
1977 1977
      /// \e
1978
      ValueIterator operator++(int) {
1979
        ValueIterator tmp(*this);
1978
      ValueIt operator++(int) {
1979
        ValueIt tmp(*this);
1980 1980
        operator++();
1981 1981
        return tmp;
1982 1982
      }
1983 1983

	
1984 1984
      /// \e
1985 1985
      const Value& operator*() const { return it->first; }
1986 1986
      /// \e
1987 1987
      const Value* operator->() const { return &(it->first); }
1988 1988

	
1989 1989
      /// \e
1990
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1990
      bool operator==(ValueIt jt) const { return it == jt.it; }
1991 1991
      /// \e
1992
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1992
      bool operator!=(ValueIt jt) const { return it != jt.it; }
1993 1993

	
1994 1994
    private:
1995 1995
      typename Container::const_iterator it;
1996 1996
    };
1997
    
1998
    /// Alias for \c ValueIt
1999
    typedef ValueIt ValueIterator;
1997 2000

	
1998 2001
    /// \brief Returns an iterator to the first value.
1999 2002
    ///
2000 2003
    /// Returns an STL compatible iterator to the
2001 2004
    /// first value of the map. The values of the
2002 2005
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
2003 2006
    /// range.
2004
    ValueIterator beginValue() const {
2005
      return ValueIterator(_inv_map.begin());
2007
    ValueIt beginValue() const {
2008
      return ValueIt(_inv_map.begin());
2006 2009
    }
2007 2010

	
2008 2011
    /// \brief Returns an iterator after the last value.
2009 2012
    ///
2010 2013
    /// Returns an STL compatible iterator after the
2011 2014
    /// last value of the map. The values of the
2012 2015
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
2013 2016
    /// range.
2014
    ValueIterator endValue() const {
2015
      return ValueIterator(_inv_map.end());
2017
    ValueIt endValue() const {
2018
      return ValueIt(_inv_map.end());
2016 2019
    }
2017 2020

	
2018 2021
    /// \brief Sets the value associated with the given key.
2019 2022
    ///
2020 2023
    /// Sets the value associated with the given key.
2021 2024
    void set(const Key& key, const Value& val) {
2022 2025
      Value oldval = Map::operator[](key);
2023 2026
      typename Container::iterator it;
2024 2027
      for (it = _inv_map.equal_range(oldval).first;
2025 2028
           it != _inv_map.equal_range(oldval).second; ++it) {
2026 2029
        if (it->second == key) {
2027 2030
          _inv_map.erase(it);
... ...
@@ -3014,25 +3017,25 @@
3014 3017
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
3015 3018
      Item prev, next;
3016 3019
      Value value;
3017 3020
    };
3018 3021
  }
3019 3022

	
3020 3023
  /// \brief Dynamic iterable map for comparable values.
3021 3024
  ///
3022 3025
  /// This class provides a special graph map type which can store a
3023 3026
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
3024 3027
  /// For each value it is possible to iterate on the keys mapped to
3025 3028
  /// the value (\c ItemIt), and the values of the map can be accessed
3026
  /// with an STL compatible forward iterator (\c ValueIterator).
3029
  /// with an STL compatible forward iterator (\c ValueIt).
3027 3030
  /// The map stores a linked list for each value, which contains
3028 3031
  /// the items mapped to the value, and the used values are stored
3029 3032
  /// in balanced binary tree (\c std::map).
3030 3033
  ///
3031 3034
  /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
3032 3035
  /// specialized for \c bool and \c int values, respectively.
3033 3036
  ///
3034 3037
  /// This type is not reference map, so it cannot be modified with
3035 3038
  /// the subscript operator.
3036 3039
  ///
3037 3040
  /// \tparam GR The graph type.
3038 3041
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
... ...
@@ -3102,76 +3105,76 @@
3102 3105
        }
3103 3106
        it->second = key;
3104 3107
      }
3105 3108
    }
3106 3109

	
3107 3110
  public:
3108 3111

	
3109 3112
    /// \brief Forward iterator for values.
3110 3113
    ///
3111 3114
    /// This iterator is an STL compatible forward
3112 3115
    /// iterator on the values of the map. The values can
3113 3116
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3114
    class ValueIterator
3117
    class ValueIt
3115 3118
      : public std::iterator<std::forward_iterator_tag, Value> {
3116 3119
      friend class IterableValueMap;
3117 3120
    private:
3118
      ValueIterator(typename std::map<Value, Key>::const_iterator _it)
3121
      ValueIt(typename std::map<Value, Key>::const_iterator _it)
3119 3122
        : it(_it) {}
3120 3123
    public:
3121 3124

	
3122 3125
      /// Constructor
3123
      ValueIterator() {}
3126
      ValueIt() {}
3124 3127

	
3125 3128
      /// \e
3126
      ValueIterator& operator++() { ++it; return *this; }
3129
      ValueIt& operator++() { ++it; return *this; }
3127 3130
      /// \e
3128
      ValueIterator operator++(int) {
3129
        ValueIterator tmp(*this);
3131
      ValueIt operator++(int) {
3132
        ValueIt tmp(*this);
3130 3133
        operator++();
3131 3134
        return tmp;
3132 3135
      }
3133 3136

	
3134 3137
      /// \e
3135 3138
      const Value& operator*() const { return it->first; }
3136 3139
      /// \e
3137 3140
      const Value* operator->() const { return &(it->first); }
3138 3141

	
3139 3142
      /// \e
3140
      bool operator==(ValueIterator jt) const { return it == jt.it; }
3143
      bool operator==(ValueIt jt) const { return it == jt.it; }
3141 3144
      /// \e
3142
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
3145
      bool operator!=(ValueIt jt) const { return it != jt.it; }
3143 3146

	
3144 3147
    private:
3145 3148
      typename std::map<Value, Key>::const_iterator it;
3146 3149
    };
3147 3150

	
3148 3151
    /// \brief Returns an iterator to the first value.
3149 3152
    ///
3150 3153
    /// Returns an STL compatible iterator to the
3151 3154
    /// first value of the map. The values of the
3152 3155
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3153 3156
    /// range.
3154
    ValueIterator beginValue() const {
3155
      return ValueIterator(_first.begin());
3157
    ValueIt beginValue() const {
3158
      return ValueIt(_first.begin());
3156 3159
    }
3157 3160

	
3158 3161
    /// \brief Returns an iterator after the last value.
3159 3162
    ///
3160 3163
    /// Returns an STL compatible iterator after the
3161 3164
    /// last value of the map. The values of the
3162 3165
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3163 3166
    /// range.
3164
    ValueIterator endValue() const {
3165
      return ValueIterator(_first.end());
3167
    ValueIt endValue() const {
3168
      return ValueIt(_first.end());
3166 3169
    }
3167 3170

	
3168 3171
    /// \brief Set operation of the map.
3169 3172
    ///
3170 3173
    /// Set operation of the map.
3171 3174
    void set(const Key& key, const Value& value) {
3172 3175
      unlace(key);
3173 3176
      Parent::operator[](key).value = value;
3174 3177
      lace(key);
3175 3178
    }
3176 3179

	
3177 3180
    /// \brief Const subscript operator of the map.
... ...
@@ -3271,27 +3274,27 @@
3271 3274
  };
3272 3275

	
3273 3276
  /// \brief Map of the source nodes of arcs in a digraph.
3274 3277
  ///
3275 3278
  /// SourceMap provides access for the source node of each arc in a digraph,
3276 3279
  /// which is returned by the \c source() function of the digraph.
3277 3280
  /// \tparam GR The digraph type.
3278 3281
  /// \see TargetMap
3279 3282
  template <typename GR>
3280 3283
  class SourceMap {
3281 3284
  public:
3282 3285

	
3283
    ///\e
3286
    /// The key type (the \c Arc type of the digraph).
3284 3287
    typedef typename GR::Arc Key;
3285
    ///\e
3288
    /// The value type (the \c Node type of the digraph).
3286 3289
    typedef typename GR::Node Value;
3287 3290

	
3288 3291
    /// \brief Constructor
3289 3292
    ///
3290 3293
    /// Constructor.
3291 3294
    /// \param digraph The digraph that the map belongs to.
3292 3295
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
3293 3296

	
3294 3297
    /// \brief Returns the source node of the given arc.
3295 3298
    ///
3296 3299
    /// Returns the source node of the given arc.
3297 3300
    Value operator[](const Key& arc) const {
... ...
@@ -3312,27 +3315,27 @@
3312 3315
  }
3313 3316

	
3314 3317
  /// \brief Map of the target nodes of arcs in a digraph.
3315 3318
  ///
3316 3319
  /// TargetMap provides access for the target node of each arc in a digraph,
3317 3320
  /// which is returned by the \c target() function of the digraph.
3318 3321
  /// \tparam GR The digraph type.
3319 3322
  /// \see SourceMap
3320 3323
  template <typename GR>
3321 3324
  class TargetMap {
3322 3325
  public:
3323 3326

	
3324
    ///\e
3327
    /// The key type (the \c Arc type of the digraph).
3325 3328
    typedef typename GR::Arc Key;
3326
    ///\e
3329
    /// The value type (the \c Node type of the digraph).
3327 3330
    typedef typename GR::Node Value;
3328 3331

	
3329 3332
    /// \brief Constructor
3330 3333
    ///
3331 3334
    /// Constructor.
3332 3335
    /// \param digraph The digraph that the map belongs to.
3333 3336
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
3334 3337

	
3335 3338
    /// \brief Returns the target node of the given arc.
3336 3339
    ///
3337 3340
    /// Returns the target node of the given arc.
3338 3341
    Value operator[](const Key& e) const {
... ...
@@ -3354,26 +3357,28 @@
3354 3357

	
3355 3358
  /// \brief Map of the "forward" directed arc view of edges in a graph.
3356 3359
  ///
3357 3360
  /// ForwardMap provides access for the "forward" directed arc view of
3358 3361
  /// each edge in a graph, which is returned by the \c direct() function
3359 3362
  /// of the graph with \c true parameter.
3360 3363
  /// \tparam GR The graph type.
3361 3364
  /// \see BackwardMap
3362 3365
  template <typename GR>
3363 3366
  class ForwardMap {
3364 3367
  public:
3365 3368

	
3369
    /// The key type (the \c Edge type of the digraph).
3370
    typedef typename GR::Edge Key;
3371
    /// The value type (the \c Arc type of the digraph).
3366 3372
    typedef typename GR::Arc Value;
3367
    typedef typename GR::Edge Key;
3368 3373

	
3369 3374
    /// \brief Constructor
3370 3375
    ///
3371 3376
    /// Constructor.
3372 3377
    /// \param graph The graph that the map belongs to.
3373 3378
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
3374 3379

	
3375 3380
    /// \brief Returns the "forward" directed arc view of the given edge.
3376 3381
    ///
3377 3382
    /// Returns the "forward" directed arc view of the given edge.
3378 3383
    Value operator[](const Key& key) const {
3379 3384
      return _graph.direct(key, true);
... ...
@@ -3394,26 +3399,28 @@
3394 3399

	
3395 3400
  /// \brief Map of the "backward" directed arc view of edges in a graph.
3396 3401
  ///
3397 3402
  /// BackwardMap provides access for the "backward" directed arc view of
3398 3403
  /// each edge in a graph, which is returned by the \c direct() function
3399 3404
  /// of the graph with \c false parameter.
3400 3405
  /// \tparam GR The graph type.
3401 3406
  /// \see ForwardMap
3402 3407
  template <typename GR>
3403 3408
  class BackwardMap {
3404 3409
  public:
3405 3410

	
3411
    /// The key type (the \c Edge type of the digraph).
3412
    typedef typename GR::Edge Key;
3413
    /// The value type (the \c Arc type of the digraph).
3406 3414
    typedef typename GR::Arc Value;
3407
    typedef typename GR::Edge Key;
3408 3415

	
3409 3416
    /// \brief Constructor
3410 3417
    ///
3411 3418
    /// Constructor.
3412 3419
    /// \param graph The graph that the map belongs to.
3413 3420
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
3414 3421

	
3415 3422
    /// \brief Returns the "backward" directed arc view of the given edge.
3416 3423
    ///
3417 3424
    /// Returns the "backward" directed arc view of the given edge.
3418 3425
    Value operator[](const Key& key) const {
3419 3426
      return _graph.direct(key, false);
Ignore white space 6 line context
... ...
@@ -517,45 +517,44 @@
517 517
    typedef ListDigraph Graph;
518 518
    DIGRAPH_TYPEDEFS(Graph);
519 519

	
520 520
    checkConcept<ReadWriteMap<Node, int>,
521 521
                 CrossRefMap<Graph, Node, int> >();
522 522
    checkConcept<ReadWriteMap<Node, bool>,
523 523
                 CrossRefMap<Graph, Node, bool> >();
524 524
    checkConcept<ReadWriteMap<Node, double>,
525 525
                 CrossRefMap<Graph, Node, double> >();
526 526
    
527 527
    Graph gr;
528 528
    typedef CrossRefMap<Graph, Node, char> CRMap;
529
    typedef CRMap::ValueIterator ValueIt;
530 529
    CRMap map(gr);
531 530
    
532 531
    Node n0 = gr.addNode();
533 532
    Node n1 = gr.addNode();
534 533
    Node n2 = gr.addNode();
535 534
    
536 535
    map.set(n0, 'A');
537 536
    map.set(n1, 'B');
538 537
    map.set(n2, 'C');
539 538
    
540 539
    check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
541 540
          "Wrong CrossRefMap");
542 541
    check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
543 542
          "Wrong CrossRefMap");
544 543
    check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
545 544
          "Wrong CrossRefMap");
546 545
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
547 546
          "Wrong CrossRefMap::count()");
548 547
    
549
    ValueIt it = map.beginValue();
548
    CRMap::ValueIt it = map.beginValue();
550 549
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
551 550
          it == map.endValue(), "Wrong value iterator");
552 551
    
553 552
    map.set(n2, 'A');
554 553

	
555 554
    check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
556 555
          "Wrong CrossRefMap");
557 556
    check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
558 557
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
559 558
    check(map('C') == INVALID && map.inverse()['C'] == INVALID,
560 559
          "Wrong CrossRefMap");
561 560
    check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
... ...
@@ -733,28 +732,28 @@
733 732
    for (int i = 0; i < num; ++i) {
734 733
      map1.set(items[i], static_cast<double>(i));
735 734
    }
736 735
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
737 736

	
738 737
    for (int i = 0; i < num; ++i) {
739 738
      Ivm::ItemIt it(map1, static_cast<double>(i));
740 739
      check(static_cast<Item>(it) == items[i], "Wrong value");
741 740
      ++it;
742 741
      check(static_cast<Item>(it) == INVALID, "Wrong value");
743 742
    }
744 743

	
745
    for (Ivm::ValueIterator vit = map1.beginValue();
744
    for (Ivm::ValueIt vit = map1.beginValue();
746 745
         vit != map1.endValue(); ++vit) {
747 746
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
748
            "Wrong ValueIterator");
747
            "Wrong ValueIt");
749 748
    }
750 749

	
751 750
    for (int i = 0; i < num; ++i) {
752 751
      map1.set(items[i], static_cast<double>(i % 2));
753 752
    }
754 753
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
755 754

	
756 755
    int n = 0;
757 756
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
758 757
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
759 758
      ++n;
760 759
    }
0 comments (0 inline)