COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/hugo/map_iterator.h @ 822:88226d9fe821

Last change on this file since 822:88226d9fe821 was 822:88226d9fe821, checked in by Balazs Dezso, 20 years ago

The MapFactories? have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.

File size: 5.8 KB
Line 
1// -*- c++ -*-
2#ifndef MAP_ITERATOR_H
3#define MAP_ITERATOR_H
4
5#include <hugo/extended_pair.h>
6
7namespace hugo {
8
9
10  template <typename Map>
11  class MapIterator;
12
13  template <typename Map>
14  class MapConstIterator;
15
16  /** Compatible iterator with the stl maps' iterators.
17   *  It iterates on pairs of a key and a value.
18   */
19  template <typename Map> 
20  class MapIterator {
21    //    friend class Map;
22    friend class MapConstIterator<Map>;
23
24  public:
25
26    /// The key type of the iterator.
27    typedef typename Map::KeyType KeyType;
28    /// The iterator to iterate on the keys.
29    typedef typename Map::KeyIt KeyIt;
30
31    /// The value type of the iterator.
32    typedef typename Map::ValueType ValueType;
33    /// The reference type of the iterator.
34    typedef typename Map::ReferenceType ReferenceType;
35    /// The pointer type of the iterator.
36    typedef typename Map::PointerType PointerType;
37
38    /// The const value type of the iterator.
39    typedef typename Map::ConstValueType ConstValueType;
40    /// The const reference type of the iterator.
41    typedef typename Map::ConstReferenceType ConstReferenceType;
42    /// The pointer type of the iterator.
43    typedef typename Map::ConstPointerType ConstPointerType;
44   
45  public:
46
47    /** Constructor to initalize the the iterators returned
48     *  by the begin() and end().
49     */
50    MapIterator (Map& pmap, const KeyIt& pit)
51      : map(&pmap), it(pit) {}
52
53  public:
54
55    /** Default constructor.
56     */
57    MapIterator() {}
58
59    typedef extended_pair<const KeyType&, const KeyType&,
60      ReferenceType, ReferenceType> PairReferenceType;
61
62    /** Dereference operator for map.
63     */ 
64    PairReferenceType operator*() {
65      return PairReferenceType(it, (*map)[it]);
66    }
67
68    class PairPointerType {
69      friend class MapIterator;
70    private:
71      PairReferenceType data;
72      PairPointerType(const KeyType& key, ReferenceType val)
73        : data(key, val) {}
74    public:
75      PairReferenceType* operator->() {return &data;}
76    };
77
78    /** Arrow operator for map.
79     */ 
80    PairPointerType operator->() {
81      return PairPointerType(it, ((*map)[it]));
82    }
83
84    /** The pre increment operator of the map.
85     */
86    MapIterator& operator++() {
87      ++it;
88      return *this;
89    }
90
91    /** The post increment operator of the map.
92     */
93    MapIterator operator++(int) {
94      MapIterator tmp(it);
95      ++it;
96      return tmp;
97    }
98
99    /** The equality operator of the map.
100     */
101    bool operator==(const MapIterator& p_it) const {
102      return p_it.it == it;
103    }
104       
105    /** The not-equality operator of the map.
106     */
107    bool operator!=(const MapIterator& p_it) const {
108      return !(*this == p_it);
109    }
110
111    /** The equality operator of the map.
112     */
113    bool operator==(const MapConstIterator<Map>& p_it) const {
114      return p_it.it == it;
115    }
116       
117    /** The not-equality operator of the map.
118     */
119    bool operator!=(const MapConstIterator<Map>& p_it) const {
120      return !(*this == p_it);
121    }
122       
123  private:
124    Map* map;
125    KeyIt it;
126  };
127
128  /** Compatible iterator with the stl maps' iterators.
129   *  It iterates on pairs of a key and a value.
130   */
131  template <typename Map>
132  class MapConstIterator {
133    // friend class Map;
134    friend class MapIterator<Map>;
135
136  public:
137
138    /// The key type of the iterator.
139    typedef typename Map::KeyType KeyType;
140    /// The iterator to iterate on the keys.
141    typedef typename Map::KeyIt KeyIt;
142
143    /// The value type of the iterator.
144    typedef typename Map::ValueType ValueType;
145    /// The reference type of the iterator.
146    typedef typename Map::ReferenceType ReferenceType;
147    /// The pointer type of the iterator.
148    typedef typename Map::PointerType PointerType;
149
150    /// The const value type of the iterator.
151    typedef typename Map::ConstValueType ConstValueType;
152    /// The const reference type of the iterator.
153    typedef typename Map::ConstReferenceType ConstReferenceType;
154    /// The pointer type of the iterator.
155    typedef typename Map::ConstPointerType ConstPointerType;
156
157  public:   
158
159    /** Constructor to initalize the the iterators returned
160     *  by the begin() and end().
161     */
162
163    MapConstIterator (const Map& pmap, const KeyIt& pit)
164      : map(&pmap), it(pit) {}
165
166  public:
167
168    /** Default constructor.
169     */
170    MapConstIterator() {}
171
172    typedef extended_pair<const KeyType&, const KeyType&,
173      ConstReferenceType, ConstReferenceType> PairReferenceType;
174
175    /** Dereference operator for map.
176     */ 
177    PairReferenceType operator*() {
178      return PairReferenceType(it, (*map)[it]);
179    }
180
181    class PairPointerType {
182      friend class MapConstIterator;
183    private:
184      PairReferenceType data;
185      PairPointerType(const KeyType& key, ConstReferenceType val)
186        : data(key, val) {}
187    public:
188      PairReferenceType* operator->() {return &data;}
189    };
190
191    /** Arrow operator for map.
192     */ 
193    PairPointerType operator->() {
194      return PairPointerType(it, ((*map)[it]));
195    }
196
197    /** The pre increment operator of the map.
198     */
199    MapConstIterator& operator++() {
200      ++it;
201      return *this;
202    }
203
204    /** The post increment operator of the map.
205     */
206    MapConstIterator operator++(int) {
207      MapConstIterator<Map> tmp(it);
208      ++it;
209      return tmp;
210    }
211
212    /** The equality operator of the map.
213     */
214    bool operator==(const MapIterator<Map>& p_it) const {
215      return p_it.it == it;
216    }
217       
218    /** The not-equality operator of the map.
219     */
220    bool operator!=(const MapIterator<Map>& p_it) const {
221      return !(*this == p_it);
222    }
223
224    /** The equality operator of the map.
225     */
226    bool operator==(const MapConstIterator& p_it) const {
227      return p_it.it == it;
228    }
229       
230    /** The not-equality operator of the map.
231     */
232    bool operator!=(const MapConstIterator& p_it) const {
233      return !(*this == p_it);
234    }
235       
236  private:
237    const Map* map;
238    KeyIt it;
239  };
240
241}
242
243#endif
Note: See TracBrowser for help on using the repository browser.