↑ Collapse diff ↑
Show white space 3072 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-2008
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
#ifndef LEMON_BITS_ARRAY_MAP_H
20 20
#define LEMON_BITS_ARRAY_MAP_H
21 21

	
22 22
#include <memory>
23 23

	
24 24
#include <lemon/bits/traits.h>
25 25
#include <lemon/bits/alteration_notifier.h>
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
/// \ingroup graphbits
30 30
/// \file
31 31
/// \brief Graph map based on the array storage.
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \ingroup graphbits
36 36
  ///
37 37
  /// \brief Graph map based on the array storage.
38 38
  ///
39 39
  /// The ArrayMap template class is graph map structure what
40 40
  /// automatically updates the map when a key is added to or erased from
41 41
  /// the map. This map uses the allocators to implement
42 42
  /// the container functionality.
43 43
  ///
44 44
  /// The template parameters are the Graph the current Item type and
45 45
  /// the Value type of the map.
46 46
  template <typename _Graph, typename _Item, typename _Value>
47 47
  class ArrayMap
48 48
    : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase {
49 49
  public:
50 50
    /// The graph type of the maps.
51 51
    typedef _Graph Graph;
52 52
    /// The item type of the map.
53 53
    typedef _Item Item;
54 54
    /// The reference map tag.
55 55
    typedef True ReferenceMapTag;
56 56

	
57 57
    /// The key type of the maps.
58 58
    typedef _Item Key;
59 59
    /// The value type of the map.
60 60
    typedef _Value Value;
61 61

	
62 62
    /// The const reference type of the map.
63 63
    typedef const _Value& ConstReference;
64 64
    /// The reference type of the map.
65 65
    typedef _Value& Reference;
66 66

	
67 67
    /// The notifier type.
68 68
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
69 69

	
70 70
    /// The MapBase of the Map which imlements the core regisitry function.
71 71
    typedef typename Notifier::ObserverBase Parent;
72 72

	
73 73
  private:
74 74
    typedef std::allocator<Value> Allocator;
75 75

	
76 76
  public:
77 77

	
78 78
    /// \brief Graph initialized map constructor.
79 79
    ///
80 80
    /// Graph initialized map constructor.
81 81
    explicit ArrayMap(const Graph& graph) {
82 82
      Parent::attach(graph.notifier(Item()));
83 83
      allocate_memory();
84 84
      Notifier* nf = Parent::notifier();
85 85
      Item it;
86 86
      for (nf->first(it); it != INVALID; nf->next(it)) {
87 87
        int id = nf->id(it);;
88 88
        allocator.construct(&(values[id]), Value());
89 89
      }
90 90
    }
91 91

	
92 92
    /// \brief Constructor to use default value to initialize the map.
93 93
    ///
94 94
    /// It constructs a map and initialize all of the the map.
95 95
    ArrayMap(const Graph& graph, const Value& value) {
96 96
      Parent::attach(graph.notifier(Item()));
97 97
      allocate_memory();
98 98
      Notifier* nf = Parent::notifier();
99 99
      Item it;
100 100
      for (nf->first(it); it != INVALID; nf->next(it)) {
101 101
        int id = nf->id(it);;
102 102
        allocator.construct(&(values[id]), value);
103 103
      }
104 104
    }
105 105

	
106
  private:
106 107
    /// \brief Constructor to copy a map of the same map type.
107 108
    ///
108 109
    /// Constructor to copy a map of the same map type.
109 110
    ArrayMap(const ArrayMap& copy) : Parent() {
110 111
      if (copy.attached()) {
111 112
        attach(*copy.notifier());
112 113
      }
113 114
      capacity = copy.capacity;
114 115
      if (capacity == 0) return;
115 116
      values = allocator.allocate(capacity);
116 117
      Notifier* nf = Parent::notifier();
117 118
      Item it;
118 119
      for (nf->first(it); it != INVALID; nf->next(it)) {
119 120
        int id = nf->id(it);;
120 121
        allocator.construct(&(values[id]), copy.values[id]);
121 122
      }
122 123
    }
123 124

	
124 125
    /// \brief Assign operator.
125 126
    ///
126 127
    /// This operator assigns for each item in the map the
127 128
    /// value mapped to the same item in the copied map.
128 129
    /// The parameter map should be indiced with the same
129 130
    /// itemset because this assign operator does not change
130 131
    /// the container of the map.
131 132
    ArrayMap& operator=(const ArrayMap& cmap) {
132 133
      return operator=<ArrayMap>(cmap);
133 134
    }
134 135

	
135 136

	
136 137
    /// \brief Template assign operator.
137 138
    ///
138 139
    /// The given parameter should be conform to the ReadMap
139 140
    /// concecpt and could be indiced by the current item set of
140 141
    /// the NodeMap. In this case the value for each item
141 142
    /// is assigned by the value of the given ReadMap.
142 143
    template <typename CMap>
143 144
    ArrayMap& operator=(const CMap& cmap) {
144 145
      checkConcept<concepts::ReadMap<Key, _Value>, CMap>();
145 146
      const typename Parent::Notifier* nf = Parent::notifier();
146 147
      Item it;
147 148
      for (nf->first(it); it != INVALID; nf->next(it)) {
148 149
        set(it, cmap[it]);
149 150
      }
150 151
      return *this;
151 152
    }
152 153

	
154
  public:
153 155
    /// \brief The destructor of the map.
154 156
    ///
155 157
    /// The destructor of the map.
156 158
    virtual ~ArrayMap() {
157 159
      if (attached()) {
158 160
        clear();
159 161
        detach();
160 162
      }
161 163
    }
162 164

	
163 165
  protected:
164 166

	
165 167
    using Parent::attach;
166 168
    using Parent::detach;
167 169
    using Parent::attached;
168 170

	
169 171
  public:
170 172

	
171 173
    /// \brief The subscript operator.
172 174
    ///
173 175
    /// The subscript operator. The map can be subscripted by the
174 176
    /// actual keys of the graph.
175 177
    Value& operator[](const Key& key) {
176 178
      int id = Parent::notifier()->id(key);
177 179
      return values[id];
178 180
    }
179 181

	
180 182
    /// \brief The const subscript operator.
181 183
    ///
182 184
    /// The const subscript operator. The map can be subscripted by the
183 185
    /// actual keys of the graph.
184 186
    const Value& operator[](const Key& key) const {
185 187
      int id = Parent::notifier()->id(key);
186 188
      return values[id];
187 189
    }
188 190

	
189 191
    /// \brief Setter function of the map.
190 192
    ///
191 193
    /// Setter function of the map. Equivalent with map[key] = val.
192 194
    /// This is a compatibility feature with the not dereferable maps.
193 195
    void set(const Key& key, const Value& val) {
194 196
      (*this)[key] = val;
195 197
    }
196 198

	
197 199
  protected:
198 200

	
199 201
    /// \brief Adds a new key to the map.
200 202
    ///
201 203
    /// It adds a new key to the map. It called by the observer notifier
202 204
    /// and it overrides the add() member function of the observer base.
203 205
    virtual void add(const Key& key) {
204 206
      Notifier* nf = Parent::notifier();
205 207
      int id = nf->id(key);
206 208
      if (id >= capacity) {
207 209
        int new_capacity = (capacity == 0 ? 1 : capacity);
208 210
        while (new_capacity <= id) {
209 211
          new_capacity <<= 1;
210 212
        }
211 213
        Value* new_values = allocator.allocate(new_capacity);
212 214
        Item it;
213 215
        for (nf->first(it); it != INVALID; nf->next(it)) {
214 216
          int jd = nf->id(it);;
215 217
          if (id != jd) {
216 218
            allocator.construct(&(new_values[jd]), values[jd]);
217 219
            allocator.destroy(&(values[jd]));
218 220
          }
219 221
        }
220 222
        if (capacity != 0) allocator.deallocate(values, capacity);
221 223
        values = new_values;
222 224
        capacity = new_capacity;
223 225
      }
224 226
      allocator.construct(&(values[id]), Value());
225 227
    }
226 228

	
227 229
    /// \brief Adds more new keys to the map.
228 230
    ///
229 231
    /// It adds more new keys to the map. It called by the observer notifier
230 232
    /// and it overrides the add() member function of the observer base.
231 233
    virtual void add(const std::vector<Key>& keys) {
232 234
      Notifier* nf = Parent::notifier();
233 235
      int max_id = -1;
234 236
      for (int i = 0; i < int(keys.size()); ++i) {
235 237
        int id = nf->id(keys[i]);
236 238
        if (id > max_id) {
237 239
          max_id = id;
238 240
        }
239 241
      }
240 242
      if (max_id >= capacity) {
241 243
        int new_capacity = (capacity == 0 ? 1 : capacity);
242 244
        while (new_capacity <= max_id) {
243 245
          new_capacity <<= 1;
244 246
        }
245 247
        Value* new_values = allocator.allocate(new_capacity);
246 248
        Item it;
247 249
        for (nf->first(it); it != INVALID; nf->next(it)) {
248 250
          int id = nf->id(it);
249 251
          bool found = false;
250 252
          for (int i = 0; i < int(keys.size()); ++i) {
251 253
            int jd = nf->id(keys[i]);
252 254
            if (id == jd) {
253 255
              found = true;
254 256
              break;
255 257
            }
256 258
          }
257 259
          if (found) continue;
258 260
          allocator.construct(&(new_values[id]), values[id]);
259 261
          allocator.destroy(&(values[id]));
260 262
        }
261 263
        if (capacity != 0) allocator.deallocate(values, capacity);
262 264
        values = new_values;
263 265
        capacity = new_capacity;
264 266
      }
265 267
      for (int i = 0; i < int(keys.size()); ++i) {
266 268
        int id = nf->id(keys[i]);
267 269
        allocator.construct(&(values[id]), Value());
268 270
      }
269 271
    }
270 272

	
271 273
    /// \brief Erase a key from the map.
272 274
    ///
273 275
    /// Erase a key from the map. It called by the observer notifier
274 276
    /// and it overrides the erase() member function of the observer base.
275 277
    virtual void erase(const Key& key) {
276 278
      int id = Parent::notifier()->id(key);
277 279
      allocator.destroy(&(values[id]));
278 280
    }
279 281

	
280 282
    /// \brief Erase more keys from the map.
281 283
    ///
282 284
    /// Erase more keys from the map. It called by the observer notifier
283 285
    /// and it overrides the erase() member function of the observer base.
284 286
    virtual void erase(const std::vector<Key>& keys) {
285 287
      for (int i = 0; i < int(keys.size()); ++i) {
286 288
        int id = Parent::notifier()->id(keys[i]);
287 289
        allocator.destroy(&(values[id]));
288 290
      }
289 291
    }
290 292

	
291 293
    /// \brief Buildes the map.
292 294
    ///
293 295
    /// It buildes the map. It called by the observer notifier
294 296
    /// and it overrides the build() member function of the observer base.
295 297
    virtual void build() {
296 298
      Notifier* nf = Parent::notifier();
297 299
      allocate_memory();
298 300
      Item it;
299 301
      for (nf->first(it); it != INVALID; nf->next(it)) {
300 302
        int id = nf->id(it);;
301 303
        allocator.construct(&(values[id]), Value());
302 304
      }
303 305
    }
304 306

	
305 307
    /// \brief Clear the map.
306 308
    ///
307 309
    /// It erase all items from the map. It called by the observer notifier
308 310
    /// and it overrides the clear() member function of the observer base.
309 311
    virtual void clear() {
310 312
      Notifier* nf = Parent::notifier();
311 313
      if (capacity != 0) {
312 314
        Item it;
313 315
        for (nf->first(it); it != INVALID; nf->next(it)) {
314 316
          int id = nf->id(it);
315 317
          allocator.destroy(&(values[id]));
316 318
        }
317 319
        allocator.deallocate(values, capacity);
318 320
        capacity = 0;
319 321
      }
320 322
    }
321 323

	
322 324
  private:
323 325

	
324 326
    void allocate_memory() {
325 327
      int max_id = Parent::notifier()->maxId();
326 328
      if (max_id == -1) {
327 329
        capacity = 0;
328 330
        values = 0;
329 331
        return;
330 332
      }
331 333
      capacity = 1;
332 334
      while (capacity <= max_id) {
333 335
        capacity <<= 1;
334 336
      }
335 337
      values = allocator.allocate(capacity);
336 338
    }
337 339

	
338 340
    int capacity;
339 341
    Value* values;
340 342
    Allocator allocator;
341 343

	
342 344
  };
343 345

	
344 346
}
345 347

	
346 348
#endif
Show white space 3072 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-2008
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
#ifndef LEMON_BITS_GRAPH_EXTENDER_H
20 20
#define LEMON_BITS_GRAPH_EXTENDER_H
21 21

	
22 22
#include <lemon/core.h>
23 23

	
24 24
#include <lemon/bits/map_extender.h>
25 25
#include <lemon/bits/default_map.h>
26 26

	
27 27
#include <lemon/concept_check.h>
28 28
#include <lemon/concepts/maps.h>
29 29

	
30 30
///\ingroup graphbits
31 31
///\file
32 32
///\brief Extenders for the digraph types
33 33
namespace lemon {
34 34

	
35 35
  /// \ingroup graphbits
36 36
  ///
37 37
  /// \brief Extender for the Digraphs
38 38
  template <typename Base>
39 39
  class DigraphExtender : public Base {
40 40
  public:
41 41

	
42 42
    typedef Base Parent;
43 43
    typedef DigraphExtender Digraph;
44 44

	
45 45
    // Base extensions
46 46

	
47 47
    typedef typename Parent::Node Node;
48 48
    typedef typename Parent::Arc Arc;
49 49

	
50 50
    int maxId(Node) const {
51 51
      return Parent::maxNodeId();
52 52
    }
53 53

	
54 54
    int maxId(Arc) const {
55 55
      return Parent::maxArcId();
56 56
    }
57 57

	
58 58
    Node fromId(int id, Node) const {
59 59
      return Parent::nodeFromId(id);
60 60
    }
61 61

	
62 62
    Arc fromId(int id, Arc) const {
63 63
      return Parent::arcFromId(id);
64 64
    }
65 65

	
66 66
    Node oppositeNode(const Node &node, const Arc &arc) const {
67 67
      if (node == Parent::source(arc))
68 68
        return Parent::target(arc);
69 69
      else if(node == Parent::target(arc))
70 70
        return Parent::source(arc);
71 71
      else
72 72
        return INVALID;
73 73
    }
74 74

	
75 75
    // Alterable extension
76 76

	
77 77
    typedef AlterationNotifier<DigraphExtender, Node> NodeNotifier;
78 78
    typedef AlterationNotifier<DigraphExtender, Arc> ArcNotifier;
79 79

	
80 80

	
81 81
  protected:
82 82

	
83 83
    mutable NodeNotifier node_notifier;
84 84
    mutable ArcNotifier arc_notifier;
85 85

	
86 86
  public:
87 87

	
88 88
    NodeNotifier& notifier(Node) const {
89 89
      return node_notifier;
90 90
    }
91 91

	
92 92
    ArcNotifier& notifier(Arc) const {
93 93
      return arc_notifier;
94 94
    }
95 95

	
96 96
    class NodeIt : public Node {
97 97
      const Digraph* _digraph;
98 98
    public:
99 99

	
100 100
      NodeIt() {}
101 101

	
102 102
      NodeIt(Invalid i) : Node(i) { }
103 103

	
104 104
      explicit NodeIt(const Digraph& digraph) : _digraph(&digraph) {
105 105
        _digraph->first(static_cast<Node&>(*this));
106 106
      }
107 107

	
108 108
      NodeIt(const Digraph& digraph, const Node& node)
109 109
        : Node(node), _digraph(&digraph) {}
110 110

	
111 111
      NodeIt& operator++() {
112 112
        _digraph->next(*this);
113 113
        return *this;
114 114
      }
115 115

	
116 116
    };
117 117

	
118 118

	
119 119
    class ArcIt : public Arc {
120 120
      const Digraph* _digraph;
121 121
    public:
122 122

	
123 123
      ArcIt() { }
124 124

	
125 125
      ArcIt(Invalid i) : Arc(i) { }
126 126

	
127 127
      explicit ArcIt(const Digraph& digraph) : _digraph(&digraph) {
128 128
        _digraph->first(static_cast<Arc&>(*this));
129 129
      }
130 130

	
131 131
      ArcIt(const Digraph& digraph, const Arc& arc) :
132 132
        Arc(arc), _digraph(&digraph) { }
133 133

	
134 134
      ArcIt& operator++() {
135 135
        _digraph->next(*this);
136 136
        return *this;
137 137
      }
138 138

	
139 139
    };
140 140

	
141 141

	
142 142
    class OutArcIt : public Arc {
143 143
      const Digraph* _digraph;
144 144
    public:
145 145

	
146 146
      OutArcIt() { }
147 147

	
148 148
      OutArcIt(Invalid i) : Arc(i) { }
149 149

	
150 150
      OutArcIt(const Digraph& digraph, const Node& node)
151 151
        : _digraph(&digraph) {
152 152
        _digraph->firstOut(*this, node);
153 153
      }
154 154

	
155 155
      OutArcIt(const Digraph& digraph, const Arc& arc)
156 156
        : Arc(arc), _digraph(&digraph) {}
157 157

	
158 158
      OutArcIt& operator++() {
159 159
        _digraph->nextOut(*this);
160 160
        return *this;
161 161
      }
162 162

	
163 163
    };
164 164

	
165 165

	
166 166
    class InArcIt : public Arc {
167 167
      const Digraph* _digraph;
168 168
    public:
169 169

	
170 170
      InArcIt() { }
171 171

	
172 172
      InArcIt(Invalid i) : Arc(i) { }
173 173

	
174 174
      InArcIt(const Digraph& digraph, const Node& node)
175 175
        : _digraph(&digraph) {
176 176
        _digraph->firstIn(*this, node);
177 177
      }
178 178

	
179 179
      InArcIt(const Digraph& digraph, const Arc& arc) :
180 180
        Arc(arc), _digraph(&digraph) {}
181 181

	
182 182
      InArcIt& operator++() {
183 183
        _digraph->nextIn(*this);
184 184
        return *this;
185 185
      }
186 186

	
187 187
    };
188 188

	
189 189
    /// \brief Base node of the iterator
190 190
    ///
191 191
    /// Returns the base node (i.e. the source in this case) of the iterator
192 192
    Node baseNode(const OutArcIt &arc) const {
193 193
      return Parent::source(arc);
194 194
    }
195 195
    /// \brief Running node of the iterator
196 196
    ///
197 197
    /// Returns the running node (i.e. the target in this case) of the
198 198
    /// iterator
199 199
    Node runningNode(const OutArcIt &arc) const {
200 200
      return Parent::target(arc);
201 201
    }
202 202

	
203 203
    /// \brief Base node of the iterator
204 204
    ///
205 205
    /// Returns the base node (i.e. the target in this case) of the iterator
206 206
    Node baseNode(const InArcIt &arc) const {
207 207
      return Parent::target(arc);
208 208
    }
209 209
    /// \brief Running node of the iterator
210 210
    ///
211 211
    /// Returns the running node (i.e. the source in this case) of the
212 212
    /// iterator
213 213
    Node runningNode(const InArcIt &arc) const {
214 214
      return Parent::source(arc);
215 215
    }
216 216

	
217 217

	
218 218
    template <typename _Value>
219 219
    class NodeMap
220 220
      : public MapExtender<DefaultMap<Digraph, Node, _Value> > {
221 221
    public:
222 222
      typedef DigraphExtender Digraph;
223 223
      typedef MapExtender<DefaultMap<Digraph, Node, _Value> > Parent;
224 224

	
225 225
      explicit NodeMap(const Digraph& digraph)
226 226
        : Parent(digraph) {}
227 227
      NodeMap(const Digraph& digraph, const _Value& value)
228 228
        : Parent(digraph, value) {}
229 229

	
230
    private:
230 231
      NodeMap& operator=(const NodeMap& cmap) {
231 232
        return operator=<NodeMap>(cmap);
232 233
      }
233 234

	
234 235
      template <typename CMap>
235 236
      NodeMap& operator=(const CMap& cmap) {
236 237
        Parent::operator=(cmap);
237 238
        return *this;
238 239
      }
239 240

	
240 241
    };
241 242

	
242 243
    template <typename _Value>
243 244
    class ArcMap
244 245
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
245 246
    public:
246 247
      typedef DigraphExtender Digraph;
247 248
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
248 249

	
249 250
      explicit ArcMap(const Digraph& digraph)
250 251
        : Parent(digraph) {}
251 252
      ArcMap(const Digraph& digraph, const _Value& value)
252 253
        : Parent(digraph, value) {}
253 254

	
255
    private:
254 256
      ArcMap& operator=(const ArcMap& cmap) {
255 257
        return operator=<ArcMap>(cmap);
256 258
      }
257 259

	
258 260
      template <typename CMap>
259 261
      ArcMap& operator=(const CMap& cmap) {
260 262
        Parent::operator=(cmap);
261 263
        return *this;
262 264
      }
263 265
    };
264 266

	
265 267

	
266 268
    Node addNode() {
267 269
      Node node = Parent::addNode();
268 270
      notifier(Node()).add(node);
269 271
      return node;
270 272
    }
271 273

	
272 274
    Arc addArc(const Node& from, const Node& to) {
273 275
      Arc arc = Parent::addArc(from, to);
274 276
      notifier(Arc()).add(arc);
275 277
      return arc;
276 278
    }
277 279

	
278 280
    void clear() {
279 281
      notifier(Arc()).clear();
280 282
      notifier(Node()).clear();
281 283
      Parent::clear();
282 284
    }
283 285

	
284 286
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
285 287
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
286 288
      Parent::build(digraph, nodeRef, arcRef);
287 289
      notifier(Node()).build();
288 290
      notifier(Arc()).build();
289 291
    }
290 292

	
291 293
    void erase(const Node& node) {
292 294
      Arc arc;
293 295
      Parent::firstOut(arc, node);
294 296
      while (arc != INVALID ) {
295 297
        erase(arc);
296 298
        Parent::firstOut(arc, node);
297 299
      }
298 300

	
299 301
      Parent::firstIn(arc, node);
300 302
      while (arc != INVALID ) {
301 303
        erase(arc);
302 304
        Parent::firstIn(arc, node);
303 305
      }
304 306

	
305 307
      notifier(Node()).erase(node);
306 308
      Parent::erase(node);
307 309
    }
308 310

	
309 311
    void erase(const Arc& arc) {
310 312
      notifier(Arc()).erase(arc);
311 313
      Parent::erase(arc);
312 314
    }
313 315

	
314 316
    DigraphExtender() {
315 317
      node_notifier.setContainer(*this);
316 318
      arc_notifier.setContainer(*this);
317 319
    }
318 320

	
319 321

	
320 322
    ~DigraphExtender() {
321 323
      arc_notifier.clear();
322 324
      node_notifier.clear();
323 325
    }
324 326
  };
325 327

	
326 328
  /// \ingroup _graphbits
327 329
  ///
328 330
  /// \brief Extender for the Graphs
329 331
  template <typename Base>
330 332
  class GraphExtender : public Base {
331 333
  public:
332 334

	
333 335
    typedef Base Parent;
334 336
    typedef GraphExtender Graph;
335 337

	
336 338
    typedef True UndirectedTag;
337 339

	
338 340
    typedef typename Parent::Node Node;
339 341
    typedef typename Parent::Arc Arc;
340 342
    typedef typename Parent::Edge Edge;
341 343

	
342 344
    // Graph extension
343 345

	
344 346
    int maxId(Node) const {
345 347
      return Parent::maxNodeId();
346 348
    }
347 349

	
348 350
    int maxId(Arc) const {
349 351
      return Parent::maxArcId();
350 352
    }
351 353

	
352 354
    int maxId(Edge) const {
353 355
      return Parent::maxEdgeId();
354 356
    }
355 357

	
356 358
    Node fromId(int id, Node) const {
357 359
      return Parent::nodeFromId(id);
358 360
    }
359 361

	
360 362
    Arc fromId(int id, Arc) const {
361 363
      return Parent::arcFromId(id);
362 364
    }
363 365

	
364 366
    Edge fromId(int id, Edge) const {
365 367
      return Parent::edgeFromId(id);
366 368
    }
367 369

	
368 370
    Node oppositeNode(const Node &n, const Edge &e) const {
369 371
      if( n == Parent::u(e))
370 372
        return Parent::v(e);
371 373
      else if( n == Parent::v(e))
372 374
        return Parent::u(e);
373 375
      else
374 376
        return INVALID;
375 377
    }
376 378

	
377 379
    Arc oppositeArc(const Arc &arc) const {
378 380
      return Parent::direct(arc, !Parent::direction(arc));
379 381
    }
380 382

	
381 383
    using Parent::direct;
382 384
    Arc direct(const Edge &edge, const Node &node) const {
383 385
      return Parent::direct(edge, Parent::u(edge) == node);
384 386
    }
385 387

	
386 388
    // Alterable extension
387 389

	
388 390
    typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;
389 391
    typedef AlterationNotifier<GraphExtender, Arc> ArcNotifier;
390 392
    typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;
391 393

	
392 394

	
393 395
  protected:
394 396

	
395 397
    mutable NodeNotifier node_notifier;
396 398
    mutable ArcNotifier arc_notifier;
397 399
    mutable EdgeNotifier edge_notifier;
398 400

	
399 401
  public:
400 402

	
401 403
    NodeNotifier& notifier(Node) const {
402 404
      return node_notifier;
403 405
    }
404 406

	
405 407
    ArcNotifier& notifier(Arc) const {
406 408
      return arc_notifier;
407 409
    }
408 410

	
409 411
    EdgeNotifier& notifier(Edge) const {
410 412
      return edge_notifier;
411 413
    }
412 414

	
413 415

	
414 416

	
415 417
    class NodeIt : public Node {
416 418
      const Graph* _graph;
417 419
    public:
418 420

	
419 421
      NodeIt() {}
420 422

	
421 423
      NodeIt(Invalid i) : Node(i) { }
422 424

	
423 425
      explicit NodeIt(const Graph& graph) : _graph(&graph) {
424 426
        _graph->first(static_cast<Node&>(*this));
425 427
      }
426 428

	
427 429
      NodeIt(const Graph& graph, const Node& node)
428 430
        : Node(node), _graph(&graph) {}
429 431

	
430 432
      NodeIt& operator++() {
431 433
        _graph->next(*this);
432 434
        return *this;
433 435
      }
434 436

	
435 437
    };
436 438

	
437 439

	
438 440
    class ArcIt : public Arc {
439 441
      const Graph* _graph;
440 442
    public:
441 443

	
442 444
      ArcIt() { }
443 445

	
444 446
      ArcIt(Invalid i) : Arc(i) { }
445 447

	
446 448
      explicit ArcIt(const Graph& graph) : _graph(&graph) {
447 449
        _graph->first(static_cast<Arc&>(*this));
448 450
      }
449 451

	
450 452
      ArcIt(const Graph& graph, const Arc& arc) :
451 453
        Arc(arc), _graph(&graph) { }
452 454

	
453 455
      ArcIt& operator++() {
454 456
        _graph->next(*this);
455 457
        return *this;
456 458
      }
457 459

	
458 460
    };
459 461

	
460 462

	
461 463
    class OutArcIt : public Arc {
462 464
      const Graph* _graph;
463 465
    public:
464 466

	
465 467
      OutArcIt() { }
466 468

	
467 469
      OutArcIt(Invalid i) : Arc(i) { }
468 470

	
469 471
      OutArcIt(const Graph& graph, const Node& node)
470 472
        : _graph(&graph) {
471 473
        _graph->firstOut(*this, node);
472 474
      }
473 475

	
474 476
      OutArcIt(const Graph& graph, const Arc& arc)
475 477
        : Arc(arc), _graph(&graph) {}
476 478

	
477 479
      OutArcIt& operator++() {
478 480
        _graph->nextOut(*this);
479 481
        return *this;
480 482
      }
481 483

	
482 484
    };
483 485

	
484 486

	
485 487
    class InArcIt : public Arc {
486 488
      const Graph* _graph;
487 489
    public:
488 490

	
489 491
      InArcIt() { }
490 492

	
491 493
      InArcIt(Invalid i) : Arc(i) { }
492 494

	
493 495
      InArcIt(const Graph& graph, const Node& node)
494 496
        : _graph(&graph) {
495 497
        _graph->firstIn(*this, node);
496 498
      }
497 499

	
498 500
      InArcIt(const Graph& graph, const Arc& arc) :
499 501
        Arc(arc), _graph(&graph) {}
500 502

	
501 503
      InArcIt& operator++() {
502 504
        _graph->nextIn(*this);
503 505
        return *this;
504 506
      }
505 507

	
506 508
    };
507 509

	
508 510

	
509 511
    class EdgeIt : public Parent::Edge {
510 512
      const Graph* _graph;
511 513
    public:
512 514

	
513 515
      EdgeIt() { }
514 516

	
515 517
      EdgeIt(Invalid i) : Edge(i) { }
516 518

	
517 519
      explicit EdgeIt(const Graph& graph) : _graph(&graph) {
518 520
        _graph->first(static_cast<Edge&>(*this));
519 521
      }
520 522

	
521 523
      EdgeIt(const Graph& graph, const Edge& edge) :
522 524
        Edge(edge), _graph(&graph) { }
523 525

	
524 526
      EdgeIt& operator++() {
525 527
        _graph->next(*this);
526 528
        return *this;
527 529
      }
528 530

	
529 531
    };
530 532

	
531 533
    class IncEdgeIt : public Parent::Edge {
532 534
      friend class GraphExtender;
533 535
      const Graph* _graph;
534 536
      bool _direction;
535 537
    public:
536 538

	
537 539
      IncEdgeIt() { }
538 540

	
539 541
      IncEdgeIt(Invalid i) : Edge(i), _direction(false) { }
540 542

	
541 543
      IncEdgeIt(const Graph& graph, const Node &node) : _graph(&graph) {
542 544
        _graph->firstInc(*this, _direction, node);
543 545
      }
544 546

	
545 547
      IncEdgeIt(const Graph& graph, const Edge &edge, const Node &node)
546 548
        : _graph(&graph), Edge(edge) {
547 549
        _direction = (_graph->source(edge) == node);
548 550
      }
549 551

	
550 552
      IncEdgeIt& operator++() {
551 553
        _graph->nextInc(*this, _direction);
552 554
        return *this;
553 555
      }
554 556
    };
555 557

	
556 558
    /// \brief Base node of the iterator
557 559
    ///
558 560
    /// Returns the base node (ie. the source in this case) of the iterator
559 561
    Node baseNode(const OutArcIt &arc) const {
560 562
      return Parent::source(static_cast<const Arc&>(arc));
561 563
    }
562 564
    /// \brief Running node of the iterator
563 565
    ///
564 566
    /// Returns the running node (ie. the target in this case) of the
565 567
    /// iterator
566 568
    Node runningNode(const OutArcIt &arc) const {
567 569
      return Parent::target(static_cast<const Arc&>(arc));
568 570
    }
569 571

	
570 572
    /// \brief Base node of the iterator
571 573
    ///
572 574
    /// Returns the base node (ie. the target in this case) of the iterator
573 575
    Node baseNode(const InArcIt &arc) const {
574 576
      return Parent::target(static_cast<const Arc&>(arc));
575 577
    }
576 578
    /// \brief Running node of the iterator
577 579
    ///
578 580
    /// Returns the running node (ie. the source in this case) of the
579 581
    /// iterator
580 582
    Node runningNode(const InArcIt &arc) const {
581 583
      return Parent::source(static_cast<const Arc&>(arc));
582 584
    }
583 585

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

	
597 599
    // Mappable extension
598 600

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

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

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

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

	
621 624
    };
622 625

	
623 626
    template <typename _Value>
624 627
    class ArcMap
625 628
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
626 629
    public:
627 630
      typedef GraphExtender Graph;
628 631
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
629 632

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

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

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

	
646 650

	
647 651
    template <typename _Value>
648 652
    class EdgeMap
649 653
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
650 654
    public:
651 655
      typedef GraphExtender Graph;
652 656
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
653 657

	
654 658
      EdgeMap(const Graph& graph)
655 659
        : Parent(graph) {}
656 660

	
657 661
      EdgeMap(const Graph& graph, const _Value& value)
658 662
        : Parent(graph, value) {}
659 663

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

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

	
670 675
    };
671 676

	
672 677
    // Alteration extension
673 678

	
674 679
    Node addNode() {
675 680
      Node node = Parent::addNode();
676 681
      notifier(Node()).add(node);
677 682
      return node;
678 683
    }
679 684

	
680 685
    Edge addEdge(const Node& from, const Node& to) {
681 686
      Edge edge = Parent::addEdge(from, to);
682 687
      notifier(Edge()).add(edge);
683 688
      std::vector<Arc> ev;
684 689
      ev.push_back(Parent::direct(edge, true));
685 690
      ev.push_back(Parent::direct(edge, false));
686 691
      notifier(Arc()).add(ev);
687 692
      return edge;
688 693
    }
689 694

	
690 695
    void clear() {
691 696
      notifier(Arc()).clear();
692 697
      notifier(Edge()).clear();
693 698
      notifier(Node()).clear();
694 699
      Parent::clear();
695 700
    }
696 701

	
697 702
    template <typename Graph, typename NodeRefMap, typename EdgeRefMap>
698 703
    void build(const Graph& graph, NodeRefMap& nodeRef,
699 704
               EdgeRefMap& edgeRef) {
700 705
      Parent::build(graph, nodeRef, edgeRef);
701 706
      notifier(Node()).build();
702 707
      notifier(Edge()).build();
703 708
      notifier(Arc()).build();
704 709
    }
705 710

	
706 711
    void erase(const Node& node) {
707 712
      Arc arc;
708 713
      Parent::firstOut(arc, node);
709 714
      while (arc != INVALID ) {
710 715
        erase(arc);
711 716
        Parent::firstOut(arc, node);
712 717
      }
713 718

	
714 719
      Parent::firstIn(arc, node);
715 720
      while (arc != INVALID ) {
716 721
        erase(arc);
717 722
        Parent::firstIn(arc, node);
718 723
      }
719 724

	
720 725
      notifier(Node()).erase(node);
721 726
      Parent::erase(node);
722 727
    }
723 728

	
724 729
    void erase(const Edge& edge) {
725 730
      std::vector<Arc> av;
726 731
      av.push_back(Parent::direct(edge, true));
727 732
      av.push_back(Parent::direct(edge, false));
728 733
      notifier(Arc()).erase(av);
729 734
      notifier(Edge()).erase(edge);
730 735
      Parent::erase(edge);
731 736
    }
732 737

	
733 738
    GraphExtender() {
734 739
      node_notifier.setContainer(*this);
735 740
      arc_notifier.setContainer(*this);
736 741
      edge_notifier.setContainer(*this);
737 742
    }
738 743

	
739 744
    ~GraphExtender() {
740 745
      edge_notifier.clear();
741 746
      arc_notifier.clear();
742 747
      node_notifier.clear();
743 748
    }
744 749

	
745 750
  };
746 751

	
747 752
}
748 753

	
749 754
#endif
Show white space 3072 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-2008
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
#ifndef LEMON_BITS_MAP_EXTENDER_H
20 20
#define LEMON_BITS_MAP_EXTENDER_H
21 21

	
22 22
#include <iterator>
23 23

	
24 24
#include <lemon/bits/traits.h>
25 25

	
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
///\file
30 30
///\brief Extenders for iterable maps.
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \ingroup graphbits
35 35
  ///
36 36
  /// \brief Extender for maps
37 37
  template <typename _Map>
38 38
  class MapExtender : public _Map {
39 39
  public:
40 40

	
41 41
    typedef _Map Parent;
42 42
    typedef MapExtender Map;
43 43

	
44 44

	
45 45
    typedef typename Parent::Graph Graph;
46 46
    typedef typename Parent::Key Item;
47 47

	
48 48
    typedef typename Parent::Key Key;
49 49
    typedef typename Parent::Value Value;
50 50

	
51 51
    class MapIt;
52 52
    class ConstMapIt;
53 53

	
54 54
    friend class MapIt;
55 55
    friend class ConstMapIt;
56 56

	
57 57
  public:
58 58

	
59 59
    MapExtender(const Graph& graph)
60 60
      : Parent(graph) {}
61 61

	
62 62
    MapExtender(const Graph& graph, const Value& value)
63 63
      : Parent(graph, value) {}
64 64

	
65
  private:
65 66
    MapExtender& operator=(const MapExtender& cmap) {
66 67
      return operator=<MapExtender>(cmap);
67 68
    }
68 69

	
69 70
    template <typename CMap>
70 71
    MapExtender& operator=(const CMap& cmap) {
71 72
      Parent::operator=(cmap);
72 73
      return *this;
73 74
    }
74 75

	
76
  public:
75 77
    class MapIt : public Item {
76 78
    public:
77 79

	
78 80
      typedef Item Parent;
79 81
      typedef typename Map::Value Value;
80 82

	
81 83
      MapIt() {}
82 84

	
83 85
      MapIt(Invalid i) : Parent(i) { }
84 86

	
85 87
      explicit MapIt(Map& _map) : map(_map) {
86 88
        map.notifier()->first(*this);
87 89
      }
88 90

	
89 91
      MapIt(const Map& _map, const Item& item)
90 92
        : Parent(item), map(_map) {}
91 93

	
92 94
      MapIt& operator++() {
93 95
        map.notifier()->next(*this);
94 96
        return *this;
95 97
      }
96 98

	
97 99
      typename MapTraits<Map>::ConstReturnValue operator*() const {
98 100
        return map[*this];
99 101
      }
100 102

	
101 103
      typename MapTraits<Map>::ReturnValue operator*() {
102 104
        return map[*this];
103 105
      }
104 106

	
105 107
      void set(const Value& value) {
106 108
        map.set(*this, value);
107 109
      }
108 110

	
109 111
    protected:
110 112
      Map& map;
111 113

	
112 114
    };
113 115

	
114 116
    class ConstMapIt : public Item {
115 117
    public:
116 118

	
117 119
      typedef Item Parent;
118 120

	
119 121
      typedef typename Map::Value Value;
120 122

	
121 123
      ConstMapIt() {}
122 124

	
123 125
      ConstMapIt(Invalid i) : Parent(i) { }
124 126

	
125 127
      explicit ConstMapIt(Map& _map) : map(_map) {
126 128
        map.notifier()->first(*this);
127 129
      }
128 130

	
129 131
      ConstMapIt(const Map& _map, const Item& item)
130 132
        : Parent(item), map(_map) {}
131 133

	
132 134
      ConstMapIt& operator++() {
133 135
        map.notifier()->next(*this);
134 136
        return *this;
135 137
      }
136 138

	
137 139
      typename MapTraits<Map>::ConstReturnValue operator*() const {
138 140
        return map[*this];
139 141
      }
140 142

	
141 143
    protected:
142 144
      const Map& map;
143 145
    };
144 146

	
145 147
    class ItemIt : public Item {
146 148
    public:
147 149

	
148 150
      typedef Item Parent;
149 151

	
150 152
      ItemIt() {}
151 153

	
152 154
      ItemIt(Invalid i) : Parent(i) { }
153 155

	
154 156
      explicit ItemIt(Map& _map) : map(_map) {
155 157
        map.notifier()->first(*this);
156 158
      }
157 159

	
158 160
      ItemIt(const Map& _map, const Item& item)
159 161
        : Parent(item), map(_map) {}
160 162

	
161 163
      ItemIt& operator++() {
162 164
        map.notifier()->next(*this);
163 165
        return *this;
164 166
      }
165 167

	
166 168
    protected:
167 169
      const Map& map;
168 170

	
169 171
    };
170 172
  };
171 173

	
172 174
  /// \ingroup graphbits
173 175
  ///
174 176
  /// \brief Extender for maps which use a subset of the items.
175 177
  template <typename _Graph, typename _Map>
176 178
  class SubMapExtender : public _Map {
177 179
  public:
178 180

	
179 181
    typedef _Map Parent;
180 182
    typedef SubMapExtender Map;
181 183

	
182 184
    typedef _Graph Graph;
183 185

	
184 186
    typedef typename Parent::Key Item;
185 187

	
186 188
    typedef typename Parent::Key Key;
187 189
    typedef typename Parent::Value Value;
188 190

	
189 191
    class MapIt;
190 192
    class ConstMapIt;
191 193

	
192 194
    friend class MapIt;
193 195
    friend class ConstMapIt;
194 196

	
195 197
  public:
196 198

	
197 199
    SubMapExtender(const Graph& _graph)
198 200
      : Parent(_graph), graph(_graph) {}
199 201

	
200 202
    SubMapExtender(const Graph& _graph, const Value& _value)
201 203
      : Parent(_graph, _value), graph(_graph) {}
202 204

	
205
  private:
203 206
    SubMapExtender& operator=(const SubMapExtender& cmap) {
204 207
      return operator=<MapExtender>(cmap);
205 208
    }
206 209

	
207 210
    template <typename CMap>
208 211
    SubMapExtender& operator=(const CMap& cmap) {
209 212
      checkConcept<concepts::ReadMap<Key, Value>, CMap>();
210 213
      Item it;
211 214
      for (graph.first(it); it != INVALID; graph.next(it)) {
212 215
        Parent::set(it, cmap[it]);
213 216
      }
214 217
      return *this;
215 218
    }
216 219

	
220
  public:
217 221
    class MapIt : public Item {
218 222
    public:
219 223

	
220 224
      typedef Item Parent;
221 225
      typedef typename Map::Value Value;
222 226

	
223 227
      MapIt() {}
224 228

	
225 229
      MapIt(Invalid i) : Parent(i) { }
226 230

	
227 231
      explicit MapIt(Map& _map) : map(_map) {
228 232
        map.graph.first(*this);
229 233
      }
230 234

	
231 235
      MapIt(const Map& _map, const Item& item)
232 236
        : Parent(item), map(_map) {}
233 237

	
234 238
      MapIt& operator++() {
235 239
        map.graph.next(*this);
236 240
        return *this;
237 241
      }
238 242

	
239 243
      typename MapTraits<Map>::ConstReturnValue operator*() const {
240 244
        return map[*this];
241 245
      }
242 246

	
243 247
      typename MapTraits<Map>::ReturnValue operator*() {
244 248
        return map[*this];
245 249
      }
246 250

	
247 251
      void set(const Value& value) {
248 252
        map.set(*this, value);
249 253
      }
250 254

	
251 255
    protected:
252 256
      Map& map;
253 257

	
254 258
    };
255 259

	
256 260
    class ConstMapIt : public Item {
257 261
    public:
258 262

	
259 263
      typedef Item Parent;
260 264

	
261 265
      typedef typename Map::Value Value;
262 266

	
263 267
      ConstMapIt() {}
264 268

	
265 269
      ConstMapIt(Invalid i) : Parent(i) { }
266 270

	
267 271
      explicit ConstMapIt(Map& _map) : map(_map) {
268 272
        map.graph.first(*this);
269 273
      }
270 274

	
271 275
      ConstMapIt(const Map& _map, const Item& item)
272 276
        : Parent(item), map(_map) {}
273 277

	
274 278
      ConstMapIt& operator++() {
275 279
        map.graph.next(*this);
276 280
        return *this;
277 281
      }
278 282

	
279 283
      typename MapTraits<Map>::ConstReturnValue operator*() const {
280 284
        return map[*this];
281 285
      }
282 286

	
283 287
    protected:
284 288
      const Map& map;
285 289
    };
286 290

	
287 291
    class ItemIt : public Item {
288 292
    public:
289 293

	
290 294
      typedef Item Parent;
291 295

	
292 296
      ItemIt() {}
293 297

	
294 298
      ItemIt(Invalid i) : Parent(i) { }
295 299

	
296 300
      explicit ItemIt(Map& _map) : map(_map) {
297 301
        map.graph.first(*this);
298 302
      }
299 303

	
300 304
      ItemIt(const Map& _map, const Item& item)
301 305
        : Parent(item), map(_map) {}
302 306

	
303 307
      ItemIt& operator++() {
304 308
        map.graph.next(*this);
305 309
        return *this;
306 310
      }
307 311

	
308 312
    protected:
309 313
      const Map& map;
310 314

	
311 315
    };
312 316

	
313 317
  private:
314 318

	
315 319
    const Graph& graph;
316 320

	
317 321
  };
318 322

	
319 323
}
320 324

	
321 325
#endif
Show white space 3072 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-2008
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
#ifndef LEMON_BITS_VECTOR_MAP_H
20 20
#define LEMON_BITS_VECTOR_MAP_H
21 21

	
22 22
#include <vector>
23 23
#include <algorithm>
24 24

	
25 25
#include <lemon/core.h>
26 26
#include <lemon/bits/alteration_notifier.h>
27 27

	
28 28
#include <lemon/concept_check.h>
29 29
#include <lemon/concepts/maps.h>
30 30

	
31 31
///\ingroup graphbits
32 32
///
33 33
///\file
34 34
///\brief Vector based graph maps.
35 35
namespace lemon {
36 36

	
37 37
  /// \ingroup graphbits
38 38
  ///
39 39
  /// \brief Graph map based on the std::vector storage.
40 40
  ///
41 41
  /// The VectorMap template class is graph map structure what
42 42
  /// automatically updates the map when a key is added to or erased from
43 43
  /// the map. This map type uses the std::vector to store the values.
44 44
  ///
45 45
  /// \tparam _Notifier The AlterationNotifier that will notify this map.
46 46
  /// \tparam _Item The item type of the graph items.
47 47
  /// \tparam _Value The value type of the map.
48 48
  /// \todo Fix the doc: there is _Graph parameter instead of _Notifier.
49 49
  template <typename _Graph, typename _Item, typename _Value>
50 50
  class VectorMap
51 51
    : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase {
52 52
  private:
53 53

	
54 54
    /// The container type of the map.
55 55
    typedef std::vector<_Value> Container;
56 56

	
57 57
  public:
58 58

	
59 59
    /// The graph type of the map.
60 60
    typedef _Graph Graph;
61 61
    /// The item type of the map.
62 62
    typedef _Item Item;
63 63
    /// The reference map tag.
64 64
    typedef True ReferenceMapTag;
65 65

	
66 66
    /// The key type of the map.
67 67
    typedef _Item Key;
68 68
    /// The value type of the map.
69 69
    typedef _Value Value;
70 70

	
71 71
    /// The notifier type.
72 72
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
73 73

	
74 74
    /// The map type.
75 75
    typedef VectorMap Map;
76 76
    /// The base class of the map.
77 77
    typedef typename Notifier::ObserverBase Parent;
78 78

	
79 79
    /// The reference type of the map;
80 80
    typedef typename Container::reference Reference;
81 81
    /// The const reference type of the map;
82 82
    typedef typename Container::const_reference ConstReference;
83 83

	
84 84

	
85 85
    /// \brief Constructor to attach the new map into the notifier.
86 86
    ///
87 87
    /// It constructs a map and attachs it into the notifier.
88 88
    /// It adds all the items of the graph to the map.
89 89
    VectorMap(const Graph& graph) {
90 90
      Parent::attach(graph.notifier(Item()));
91 91
      container.resize(Parent::notifier()->maxId() + 1);
92 92
    }
93 93

	
94 94
    /// \brief Constructor uses given value to initialize the map.
95 95
    ///
96 96
    /// It constructs a map uses a given value to initialize the map.
97 97
    /// It adds all the items of the graph to the map.
98 98
    VectorMap(const Graph& graph, const Value& value) {
99 99
      Parent::attach(graph.notifier(Item()));
100 100
      container.resize(Parent::notifier()->maxId() + 1, value);
101 101
    }
102 102

	
103
  private:
103 104
    /// \brief Copy constructor
104 105
    ///
105 106
    /// Copy constructor.
106 107
    VectorMap(const VectorMap& _copy) : Parent() {
107 108
      if (_copy.attached()) {
108 109
        Parent::attach(*_copy.notifier());
109 110
        container = _copy.container;
110 111
      }
111 112
    }
112 113

	
113 114
    /// \brief Assign operator.
114 115
    ///
115 116
    /// This operator assigns for each item in the map the
116 117
    /// value mapped to the same item in the copied map.
117 118
    /// The parameter map should be indiced with the same
118 119
    /// itemset because this assign operator does not change
119 120
    /// the container of the map.
120 121
    VectorMap& operator=(const VectorMap& cmap) {
121 122
      return operator=<VectorMap>(cmap);
122 123
    }
123 124

	
124 125

	
125 126
    /// \brief Template assign operator.
126 127
    ///
127 128
    /// The given parameter should be conform to the ReadMap
128 129
    /// concecpt and could be indiced by the current item set of
129 130
    /// the NodeMap. In this case the value for each item
130 131
    /// is assigned by the value of the given ReadMap.
131 132
    template <typename CMap>
132 133
    VectorMap& operator=(const CMap& cmap) {
133 134
      checkConcept<concepts::ReadMap<Key, _Value>, CMap>();
134 135
      const typename Parent::Notifier* nf = Parent::notifier();
135 136
      Item it;
136 137
      for (nf->first(it); it != INVALID; nf->next(it)) {
137 138
        set(it, cmap[it]);
138 139
      }
139 140
      return *this;
140 141
    }
141 142

	
142 143
  public:
143 144

	
144 145
    /// \brief The subcript operator.
145 146
    ///
146 147
    /// The subscript operator. The map can be subscripted by the
147 148
    /// actual items of the graph.
148 149
    Reference operator[](const Key& key) {
149 150
      return container[Parent::notifier()->id(key)];
150 151
    }
151 152

	
152 153
    /// \brief The const subcript operator.
153 154
    ///
154 155
    /// The const subscript operator. The map can be subscripted by the
155 156
    /// actual items of the graph.
156 157
    ConstReference operator[](const Key& key) const {
157 158
      return container[Parent::notifier()->id(key)];
158 159
    }
159 160

	
160 161

	
161 162
    /// \brief The setter function of the map.
162 163
    ///
163 164
    /// It the same as operator[](key) = value expression.
164 165
    void set(const Key& key, const Value& value) {
165 166
      (*this)[key] = value;
166 167
    }
167 168

	
168 169
  protected:
169 170

	
170 171
    /// \brief Adds a new key to the map.
171 172
    ///
172 173
    /// It adds a new key to the map. It called by the observer notifier
173 174
    /// and it overrides the add() member function of the observer base.
174 175
    virtual void add(const Key& key) {
175 176
      int id = Parent::notifier()->id(key);
176 177
      if (id >= int(container.size())) {
177 178
        container.resize(id + 1);
178 179
      }
179 180
    }
180 181

	
181 182
    /// \brief Adds more new keys to the map.
182 183
    ///
183 184
    /// It adds more new keys to the map. It called by the observer notifier
184 185
    /// and it overrides the add() member function of the observer base.
185 186
    virtual void add(const std::vector<Key>& keys) {
186 187
      int max = container.size() - 1;
187 188
      for (int i = 0; i < int(keys.size()); ++i) {
188 189
        int id = Parent::notifier()->id(keys[i]);
189 190
        if (id >= max) {
190 191
          max = id;
191 192
        }
192 193
      }
193 194
      container.resize(max + 1);
194 195
    }
195 196

	
196 197
    /// \brief Erase a key from the map.
197 198
    ///
198 199
    /// Erase a key from the map. It called by the observer notifier
199 200
    /// and it overrides the erase() member function of the observer base.
200 201
    virtual void erase(const Key& key) {
201 202
      container[Parent::notifier()->id(key)] = Value();
202 203
    }
203 204

	
204 205
    /// \brief Erase more keys from the map.
205 206
    ///
206 207
    /// Erase more keys from the map. It called by the observer notifier
207 208
    /// and it overrides the erase() member function of the observer base.
208 209
    virtual void erase(const std::vector<Key>& keys) {
209 210
      for (int i = 0; i < int(keys.size()); ++i) {
210 211
        container[Parent::notifier()->id(keys[i])] = Value();
211 212
      }
212 213
    }
213 214

	
214 215
    /// \brief Buildes the map.
215 216
    ///
216 217
    /// It buildes the map. It called by the observer notifier
217 218
    /// and it overrides the build() member function of the observer base.
218 219
    virtual void build() {
219 220
      int size = Parent::notifier()->maxId() + 1;
220 221
      container.reserve(size);
221 222
      container.resize(size);
222 223
    }
223 224

	
224 225
    /// \brief Clear the map.
225 226
    ///
226 227
    /// It erase all items from the map. It called by the observer notifier
227 228
    /// and it overrides the clear() member function of the observer base.
228 229
    virtual void clear() {
229 230
      container.clear();
230 231
    }
231 232

	
232 233
  private:
233 234

	
234 235
    Container container;
235 236

	
236 237
  };
237 238

	
238 239
}
239 240

	
240 241
#endif
Show white space 3072 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-2008
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
#ifndef LEMON_CONCEPT_DIGRAPH_H
20 20
#define LEMON_CONCEPT_DIGRAPH_H
21 21

	
22 22
///\ingroup graph_concepts
23 23
///\file
24 24
///\brief The concept of directed graphs.
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concepts/maps.h>
28 28
#include <lemon/concept_check.h>
29 29
#include <lemon/concepts/graph_components.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \ingroup graph_concepts
35 35
    ///
36 36
    /// \brief Class describing the concept of directed graphs.
37 37
    ///
38 38
    /// This class describes the \ref concept "concept" of the
39 39
    /// immutable directed digraphs.
40 40
    ///
41 41
    /// Note that actual digraph implementation like @ref ListDigraph or
42 42
    /// @ref SmartDigraph may have several additional functionality.
43 43
    ///
44 44
    /// \sa concept
45 45
    class Digraph {
46 46
    private:
47 47
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
48 48

	
49 49
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
50 50
      ///
51 51
      Digraph(const Digraph &) {};
52 52
      ///\brief Assignment of \ref Digraph "Digraph"s to another ones are
53 53
      ///\e not allowed. Use DigraphCopy() instead.
54 54

	
55 55
      ///Assignment of \ref Digraph "Digraph"s to another ones are
56 56
      ///\e not allowed.  Use DigraphCopy() instead.
57 57

	
58 58
      void operator=(const Digraph &) {}
59 59
    public:
60 60
      ///\e
61 61

	
62 62
      /// Defalult constructor.
63 63

	
64 64
      /// Defalult constructor.
65 65
      ///
66 66
      Digraph() { }
67 67
      /// Class for identifying a node of the digraph
68 68

	
69 69
      /// This class identifies a node of the digraph. It also serves
70 70
      /// as a base class of the node iterators,
71 71
      /// thus they will convert to this type.
72 72
      class Node {
73 73
      public:
74 74
        /// Default constructor
75 75

	
76 76
        /// @warning The default constructor sets the iterator
77 77
        /// to an undefined value.
78 78
        Node() { }
79 79
        /// Copy constructor.
80 80

	
81 81
        /// Copy constructor.
82 82
        ///
83 83
        Node(const Node&) { }
84 84

	
85 85
        /// Invalid constructor \& conversion.
86 86

	
87 87
        /// This constructor initializes the iterator to be invalid.
88 88
        /// \sa Invalid for more details.
89 89
        Node(Invalid) { }
90 90
        /// Equality operator
91 91

	
92 92
        /// Two iterators are equal if and only if they point to the
93 93
        /// same object or both are invalid.
94 94
        bool operator==(Node) const { return true; }
95 95

	
96 96
        /// Inequality operator
97 97

	
98 98
        /// \sa operator==(Node n)
99 99
        ///
100 100
        bool operator!=(Node) const { return true; }
101 101

	
102 102
        /// Artificial ordering operator.
103 103

	
104 104
        /// To allow the use of digraph descriptors as key type in std::map or
105 105
        /// similar associative container we require this.
106 106
        ///
107 107
        /// \note This operator only have to define some strict ordering of
108 108
        /// the items; this order has nothing to do with the iteration
109 109
        /// ordering of the items.
110 110
        bool operator<(Node) const { return false; }
111 111

	
112 112
      };
113 113

	
114 114
      /// This iterator goes through each node.
115 115

	
116 116
      /// This iterator goes through each node.
117 117
      /// Its usage is quite simple, for example you can count the number
118 118
      /// of nodes in digraph \c g of type \c Digraph like this:
119 119
      ///\code
120 120
      /// int count=0;
121 121
      /// for (Digraph::NodeIt n(g); n!=INVALID; ++n) ++count;
122 122
      ///\endcode
123 123
      class NodeIt : public Node {
124 124
      public:
125 125
        /// Default constructor
126 126

	
127 127
        /// @warning The default constructor sets the iterator
128 128
        /// to an undefined value.
129 129
        NodeIt() { }
130 130
        /// Copy constructor.
131 131

	
132 132
        /// Copy constructor.
133 133
        ///
134 134
        NodeIt(const NodeIt& n) : Node(n) { }
135 135
        /// Invalid constructor \& conversion.
136 136

	
137 137
        /// Initialize the iterator to be invalid.
138 138
        /// \sa Invalid for more details.
139 139
        NodeIt(Invalid) { }
140 140
        /// Sets the iterator to the first node.
141 141

	
142 142
        /// Sets the iterator to the first node of \c g.
143 143
        ///
144 144
        NodeIt(const Digraph&) { }
145 145
        /// Node -> NodeIt conversion.
146 146

	
147 147
        /// Sets the iterator to the node of \c the digraph pointed by
148 148
        /// the trivial iterator.
149 149
        /// This feature necessitates that each time we
150 150
        /// iterate the arc-set, the iteration order is the same.
151 151
        NodeIt(const Digraph&, const Node&) { }
152 152
        /// Next node.
153 153

	
154 154
        /// Assign the iterator to the next node.
155 155
        ///
156 156
        NodeIt& operator++() { return *this; }
157 157
      };
158 158

	
159 159

	
160 160
      /// Class for identifying an arc of the digraph
161 161

	
162 162
      /// This class identifies an arc of the digraph. It also serves
163 163
      /// as a base class of the arc iterators,
164 164
      /// thus they will convert to this type.
165 165
      class Arc {
166 166
      public:
167 167
        /// Default constructor
168 168

	
169 169
        /// @warning The default constructor sets the iterator
170 170
        /// to an undefined value.
171 171
        Arc() { }
172 172
        /// Copy constructor.
173 173

	
174 174
        /// Copy constructor.
175 175
        ///
176 176
        Arc(const Arc&) { }
177 177
        /// Initialize the iterator to be invalid.
178 178

	
179 179
        /// Initialize the iterator to be invalid.
180 180
        ///
181 181
        Arc(Invalid) { }
182 182
        /// Equality operator
183 183

	
184 184
        /// Two iterators are equal if and only if they point to the
185 185
        /// same object or both are invalid.
186 186
        bool operator==(Arc) const { return true; }
187 187
        /// Inequality operator
188 188

	
189 189
        /// \sa operator==(Arc n)
190 190
        ///
191 191
        bool operator!=(Arc) const { return true; }
192 192

	
193 193
        /// Artificial ordering operator.
194 194

	
195 195
        /// To allow the use of digraph descriptors as key type in std::map or
196 196
        /// similar associative container we require this.
197 197
        ///
198 198
        /// \note This operator only have to define some strict ordering of
199 199
        /// the items; this order has nothing to do with the iteration
200 200
        /// ordering of the items.
201 201
        bool operator<(Arc) const { return false; }
202 202
      };
203 203

	
204 204
      /// This iterator goes trough the outgoing arcs of a node.
205 205

	
206 206
      /// This iterator goes trough the \e outgoing arcs of a certain node
207 207
      /// of a digraph.
208 208
      /// Its usage is quite simple, for example you can count the number
209 209
      /// of outgoing arcs of a node \c n
210 210
      /// in digraph \c g of type \c Digraph as follows.
211 211
      ///\code
212 212
      /// int count=0;
213 213
      /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
214 214
      ///\endcode
215 215

	
216 216
      class OutArcIt : public Arc {
217 217
      public:
218 218
        /// Default constructor
219 219

	
220 220
        /// @warning The default constructor sets the iterator
221 221
        /// to an undefined value.
222 222
        OutArcIt() { }
223 223
        /// Copy constructor.
224 224

	
225 225
        /// Copy constructor.
226 226
        ///
227 227
        OutArcIt(const OutArcIt& e) : Arc(e) { }
228 228
        /// Initialize the iterator to be invalid.
229 229

	
230 230
        /// Initialize the iterator to be invalid.
231 231
        ///
232 232
        OutArcIt(Invalid) { }
233 233
        /// This constructor sets the iterator to the first outgoing arc.
234 234

	
235 235
        /// This constructor sets the iterator to the first outgoing arc of
236 236
        /// the node.
237 237
        OutArcIt(const Digraph&, const Node&) { }
238 238
        /// Arc -> OutArcIt conversion
239 239

	
240 240
        /// Sets the iterator to the value of the trivial iterator.
241 241
        /// This feature necessitates that each time we
242 242
        /// iterate the arc-set, the iteration order is the same.
243 243
        OutArcIt(const Digraph&, const Arc&) { }
244 244
        ///Next outgoing arc
245 245

	
246 246
        /// Assign the iterator to the next
247 247
        /// outgoing arc of the corresponding node.
248 248
        OutArcIt& operator++() { return *this; }
249 249
      };
250 250

	
251 251
      /// This iterator goes trough the incoming arcs of a node.
252 252

	
253 253
      /// This iterator goes trough the \e incoming arcs of a certain node
254 254
      /// of a digraph.
255 255
      /// Its usage is quite simple, for example you can count the number
256 256
      /// of outgoing arcs of a node \c n
257 257
      /// in digraph \c g of type \c Digraph as follows.
258 258
      ///\code
259 259
      /// int count=0;
260 260
      /// for(Digraph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
261 261
      ///\endcode
262 262

	
263 263
      class InArcIt : public Arc {
264 264
      public:
265 265
        /// Default constructor
266 266

	
267 267
        /// @warning The default constructor sets the iterator
268 268
        /// to an undefined value.
269 269
        InArcIt() { }
270 270
        /// Copy constructor.
271 271

	
272 272
        /// Copy constructor.
273 273
        ///
274 274
        InArcIt(const InArcIt& e) : Arc(e) { }
275 275
        /// Initialize the iterator to be invalid.
276 276

	
277 277
        /// Initialize the iterator to be invalid.
278 278
        ///
279 279
        InArcIt(Invalid) { }
280 280
        /// This constructor sets the iterator to first incoming arc.
281 281

	
282 282
        /// This constructor set the iterator to the first incoming arc of
283 283
        /// the node.
284 284
        InArcIt(const Digraph&, const Node&) { }
285 285
        /// Arc -> InArcIt conversion
286 286

	
287 287
        /// Sets the iterator to the value of the trivial iterator \c e.
288 288
        /// This feature necessitates that each time we
289 289
        /// iterate the arc-set, the iteration order is the same.
290 290
        InArcIt(const Digraph&, const Arc&) { }
291 291
        /// Next incoming arc
292 292

	
293 293
        /// Assign the iterator to the next inarc of the corresponding node.
294 294
        ///
295 295
        InArcIt& operator++() { return *this; }
296 296
      };
297 297
      /// This iterator goes through each arc.
298 298

	
299 299
      /// This iterator goes through each arc of a digraph.
300 300
      /// Its usage is quite simple, for example you can count the number
301 301
      /// of arcs in a digraph \c g of type \c Digraph as follows:
302 302
      ///\code
303 303
      /// int count=0;
304 304
      /// for(Digraph::ArcIt e(g); e!=INVALID; ++e) ++count;
305 305
      ///\endcode
306 306
      class ArcIt : public Arc {
307 307
      public:
308 308
        /// Default constructor
309 309

	
310 310
        /// @warning The default constructor sets the iterator
311 311
        /// to an undefined value.
312 312
        ArcIt() { }
313 313
        /// Copy constructor.
314 314

	
315 315
        /// Copy constructor.
316 316
        ///
317 317
        ArcIt(const ArcIt& e) : Arc(e) { }
318 318
        /// Initialize the iterator to be invalid.
319 319

	
320 320
        /// Initialize the iterator to be invalid.
321 321
        ///
322 322
        ArcIt(Invalid) { }
323 323
        /// This constructor sets the iterator to the first arc.
324 324

	
325 325
        /// This constructor sets the iterator to the first arc of \c g.
326 326
        ///@param g the digraph
327 327
        ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
328 328
        /// Arc -> ArcIt conversion
329 329

	
330 330
        /// Sets the iterator to the value of the trivial iterator \c e.
331 331
        /// This feature necessitates that each time we
332 332
        /// iterate the arc-set, the iteration order is the same.
333 333
        ArcIt(const Digraph&, const Arc&) { }
334 334
        ///Next arc
335 335

	
336 336
        /// Assign the iterator to the next arc.
337 337
        ArcIt& operator++() { return *this; }
338 338
      };
339 339
      ///Gives back the target node of an arc.
340 340

	
341 341
      ///Gives back the target node of an arc.
342 342
      ///
343 343
      Node target(Arc) const { return INVALID; }
344 344
      ///Gives back the source node of an arc.
345 345

	
346 346
      ///Gives back the source node of an arc.
347 347
      ///
348 348
      Node source(Arc) const { return INVALID; }
349 349

	
350 350
      /// \brief Returns the ID of the node.
351 351
      int id(Node) const { return -1; }
352 352

	
353 353
      /// \brief Returns the ID of the arc.
354 354
      int id(Arc) const { return -1; }
355 355

	
356 356
      /// \brief Returns the node with the given ID.
357 357
      ///
358 358
      /// \pre The argument should be a valid node ID in the graph.
359 359
      Node nodeFromId(int) const { return INVALID; }
360 360

	
361 361
      /// \brief Returns the arc with the given ID.
362 362
      ///
363 363
      /// \pre The argument should be a valid arc ID in the graph.
364 364
      Arc arcFromId(int) const { return INVALID; }
365 365

	
366 366
      /// \brief Returns an upper bound on the node IDs.
367 367
      int maxNodeId() const { return -1; }
368 368

	
369 369
      /// \brief Returns an upper bound on the arc IDs.
370 370
      int maxArcId() const { return -1; }
371 371

	
372 372
      void first(Node&) const {}
373 373
      void next(Node&) const {}
374 374

	
375 375
      void first(Arc&) const {}
376 376
      void next(Arc&) const {}
377 377

	
378 378

	
379 379
      void firstIn(Arc&, const Node&) const {}
380 380
      void nextIn(Arc&) const {}
381 381

	
382 382
      void firstOut(Arc&, const Node&) const {}
383 383
      void nextOut(Arc&) const {}
384 384

	
385 385
      // The second parameter is dummy.
386 386
      Node fromId(int, Node) const { return INVALID; }
387 387
      // The second parameter is dummy.
388 388
      Arc fromId(int, Arc) const { return INVALID; }
389 389

	
390 390
      // Dummy parameter.
391 391
      int maxId(Node) const { return -1; }
392 392
      // Dummy parameter.
393 393
      int maxId(Arc) const { return -1; }
394 394

	
395 395
      /// \brief The base node of the iterator.
396 396
      ///
397 397
      /// Gives back the base node of the iterator.
398 398
      /// It is always the target of the pointed arc.
399 399
      Node baseNode(const InArcIt&) const { return INVALID; }
400 400

	
401 401
      /// \brief The running node of the iterator.
402 402
      ///
403 403
      /// Gives back the running node of the iterator.
404 404
      /// It is always the source of the pointed arc.
405 405
      Node runningNode(const InArcIt&) const { return INVALID; }
406 406

	
407 407
      /// \brief The base node of the iterator.
408 408
      ///
409 409
      /// Gives back the base node of the iterator.
410 410
      /// It is always the source of the pointed arc.
411 411
      Node baseNode(const OutArcIt&) const { return INVALID; }
412 412

	
413 413
      /// \brief The running node of the iterator.
414 414
      ///
415 415
      /// Gives back the running node of the iterator.
416 416
      /// It is always the target of the pointed arc.
417 417
      Node runningNode(const OutArcIt&) const { return INVALID; }
418 418

	
419 419
      /// \brief The opposite node on the given arc.
420 420
      ///
421 421
      /// Gives back the opposite node on the given arc.
422 422
      Node oppositeNode(const Node&, const Arc&) const { return INVALID; }
423 423

	
424 424
      /// \brief Read write map of the nodes to type \c T.
425 425
      ///
426 426
      /// ReadWrite map of the nodes to type \c T.
427 427
      /// \sa Reference
428 428
      template<class T>
429 429
      class NodeMap : public ReadWriteMap< Node, T > {
430 430
      public:
431 431

	
432 432
        ///\e
433 433
        NodeMap(const Digraph&) { }
434 434
        ///\e
435 435
        NodeMap(const Digraph&, T) { }
436 436

	
437
      private:
437 438
        ///Copy constructor
438 439
        NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
439 440
        ///Assignment operator
440 441
        template <typename CMap>
441 442
        NodeMap& operator=(const CMap&) {
442 443
          checkConcept<ReadMap<Node, T>, CMap>();
443 444
          return *this;
444 445
        }
445 446
      };
446 447

	
447 448
      /// \brief Read write map of the arcs to type \c T.
448 449
      ///
449 450
      /// Reference map of the arcs to type \c T.
450 451
      /// \sa Reference
451 452
      template<class T>
452 453
      class ArcMap : public ReadWriteMap<Arc,T> {
453 454
      public:
454 455

	
455 456
        ///\e
456 457
        ArcMap(const Digraph&) { }
457 458
        ///\e
458 459
        ArcMap(const Digraph&, T) { }
460
      private:
459 461
        ///Copy constructor
460 462
        ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { }
461 463
        ///Assignment operator
462 464
        template <typename CMap>
463 465
        ArcMap& operator=(const CMap&) {
464 466
          checkConcept<ReadMap<Arc, T>, CMap>();
465 467
          return *this;
466 468
        }
467 469
      };
468 470

	
469 471
      template <typename _Digraph>
470 472
      struct Constraints {
471 473
        void constraints() {
472 474
          checkConcept<IterableDigraphComponent<>, _Digraph>();
473 475
          checkConcept<IDableDigraphComponent<>, _Digraph>();
474 476
          checkConcept<MappableDigraphComponent<>, _Digraph>();
475 477
        }
476 478
      };
477 479

	
478 480
    };
479 481

	
480 482
  } //namespace concepts
481 483
} //namespace lemon
482 484

	
483 485

	
484 486

	
485 487
#endif // LEMON_CONCEPT_DIGRAPH_H
Show white space 3072 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-2008
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
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concept of Undirected Graphs.
22 22

	
23 23
#ifndef LEMON_CONCEPT_GRAPH_H
24 24
#define LEMON_CONCEPT_GRAPH_H
25 25

	
26 26
#include <lemon/concepts/graph_components.h>
27 27
#include <lemon/concepts/graph.h>
28 28
#include <lemon/core.h>
29 29

	
30 30
namespace lemon {
31 31
  namespace concepts {
32 32

	
33 33
    /// \ingroup graph_concepts
34 34
    ///
35 35
    /// \brief Class describing the concept of Undirected Graphs.
36 36
    ///
37 37
    /// This class describes the common interface of all Undirected
38 38
    /// Graphs.
39 39
    ///
40 40
    /// As all concept describing classes it provides only interface
41 41
    /// without any sensible implementation. So any algorithm for
42 42
    /// undirected graph should compile with this class, but it will not
43 43
    /// run properly, of course.
44 44
    ///
45 45
    /// The LEMON undirected graphs also fulfill the concept of
46 46
    /// directed graphs (\ref lemon::concepts::Digraph "Digraph
47 47
    /// Concept"). Each edges can be seen as two opposite
48 48
    /// directed arc and consequently the undirected graph can be
49 49
    /// seen as the direceted graph of these directed arcs. The
50 50
    /// Graph has the Edge inner class for the edges and
51 51
    /// the Arc type for the directed arcs. The Arc type is
52 52
    /// convertible to Edge or inherited from it so from a directed
53 53
    /// arc we can get the represented edge.
54 54
    ///
55 55
    /// In the sense of the LEMON each edge has a default
56 56
    /// direction (it should be in every computer implementation,
57 57
    /// because the order of edge's nodes defines an
58 58
    /// orientation). With the default orientation we can define that
59 59
    /// the directed arc is forward or backward directed. With the \c
60 60
    /// direction() and \c direct() function we can get the direction
61 61
    /// of the directed arc and we can direct an edge.
62 62
    ///
63 63
    /// The EdgeIt is an iterator for the edges. We can use
64 64
    /// the EdgeMap to map values for the edges. The InArcIt and
65 65
    /// OutArcIt iterates on the same edges but with opposite
66 66
    /// direction. The IncEdgeIt iterates also on the same edges
67 67
    /// as the OutArcIt and InArcIt but it is not convertible to Arc just
68 68
    /// to Edge.
69 69
    class Graph {
70 70
    public:
71 71
      /// \brief The undirected graph should be tagged by the
72 72
      /// UndirectedTag.
73 73
      ///
74 74
      /// The undirected graph should be tagged by the UndirectedTag. This
75 75
      /// tag helps the enable_if technics to make compile time
76 76
      /// specializations for undirected graphs.
77 77
      typedef True UndirectedTag;
78 78

	
79 79
      /// \brief The base type of node iterators,
80 80
      /// or in other words, the trivial node iterator.
81 81
      ///
82 82
      /// This is the base type of each node iterator,
83 83
      /// thus each kind of node iterator converts to this.
84 84
      /// More precisely each kind of node iterator should be inherited
85 85
      /// from the trivial node iterator.
86 86
      class Node {
87 87
      public:
88 88
        /// Default constructor
89 89

	
90 90
        /// @warning The default constructor sets the iterator
91 91
        /// to an undefined value.
92 92
        Node() { }
93 93
        /// Copy constructor.
94 94

	
95 95
        /// Copy constructor.
96 96
        ///
97 97
        Node(const Node&) { }
98 98

	
99 99
        /// Invalid constructor \& conversion.
100 100

	
101 101
        /// This constructor initializes the iterator to be invalid.
102 102
        /// \sa Invalid for more details.
103 103
        Node(Invalid) { }
104 104
        /// Equality operator
105 105

	
106 106
        /// Two iterators are equal if and only if they point to the
107 107
        /// same object or both are invalid.
108 108
        bool operator==(Node) const { return true; }
109 109

	
110 110
        /// Inequality operator
111 111

	
112 112
        /// \sa operator==(Node n)
113 113
        ///
114 114
        bool operator!=(Node) const { return true; }
115 115

	
116 116
        /// Artificial ordering operator.
117 117

	
118 118
        /// To allow the use of graph descriptors as key type in std::map or
119 119
        /// similar associative container we require this.
120 120
        ///
121 121
        /// \note This operator only have to define some strict ordering of
122 122
        /// the items; this order has nothing to do with the iteration
123 123
        /// ordering of the items.
124 124
        bool operator<(Node) const { return false; }
125 125

	
126 126
      };
127 127

	
128 128
      /// This iterator goes through each node.
129 129

	
130 130
      /// This iterator goes through each node.
131 131
      /// Its usage is quite simple, for example you can count the number
132 132
      /// of nodes in graph \c g of type \c Graph like this:
133 133
      ///\code
134 134
      /// int count=0;
135 135
      /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
136 136
      ///\endcode
137 137
      class NodeIt : public Node {
138 138
      public:
139 139
        /// Default constructor
140 140

	
141 141
        /// @warning The default constructor sets the iterator
142 142
        /// to an undefined value.
143 143
        NodeIt() { }
144 144
        /// Copy constructor.
145 145

	
146 146
        /// Copy constructor.
147 147
        ///
148 148
        NodeIt(const NodeIt& n) : Node(n) { }
149 149
        /// Invalid constructor \& conversion.
150 150

	
151 151
        /// Initialize the iterator to be invalid.
152 152
        /// \sa Invalid for more details.
153 153
        NodeIt(Invalid) { }
154 154
        /// Sets the iterator to the first node.
155 155

	
156 156
        /// Sets the iterator to the first node of \c g.
157 157
        ///
158 158
        NodeIt(const Graph&) { }
159 159
        /// Node -> NodeIt conversion.
160 160

	
161 161
        /// Sets the iterator to the node of \c the graph pointed by
162 162
        /// the trivial iterator.
163 163
        /// This feature necessitates that each time we
164 164
        /// iterate the arc-set, the iteration order is the same.
165 165
        NodeIt(const Graph&, const Node&) { }
166 166
        /// Next node.
167 167

	
168 168
        /// Assign the iterator to the next node.
169 169
        ///
170 170
        NodeIt& operator++() { return *this; }
171 171
      };
172 172

	
173 173

	
174 174
      /// The base type of the edge iterators.
175 175

	
176 176
      /// The base type of the edge iterators.
177 177
      ///
178 178
      class Edge {
179 179
      public:
180 180
        /// Default constructor
181 181

	
182 182
        /// @warning The default constructor sets the iterator
183 183
        /// to an undefined value.
184 184
        Edge() { }
185 185
        /// Copy constructor.
186 186

	
187 187
        /// Copy constructor.
188 188
        ///
189 189
        Edge(const Edge&) { }
190 190
        /// Initialize the iterator to be invalid.
191 191

	
192 192
        /// Initialize the iterator to be invalid.
193 193
        ///
194 194
        Edge(Invalid) { }
195 195
        /// Equality operator
196 196

	
197 197
        /// Two iterators are equal if and only if they point to the
198 198
        /// same object or both are invalid.
199 199
        bool operator==(Edge) const { return true; }
200 200
        /// Inequality operator
201 201

	
202 202
        /// \sa operator==(Edge n)
203 203
        ///
204 204
        bool operator!=(Edge) const { return true; }
205 205

	
206 206
        /// Artificial ordering operator.
207 207

	
208 208
        /// To allow the use of graph descriptors as key type in std::map or
209 209
        /// similar associative container we require this.
210 210
        ///
211 211
        /// \note This operator only have to define some strict ordering of
212 212
        /// the items; this order has nothing to do with the iteration
213 213
        /// ordering of the items.
214 214
        bool operator<(Edge) const { return false; }
215 215
      };
216 216

	
217 217
      /// This iterator goes through each edge.
218 218

	
219 219
      /// This iterator goes through each edge of a graph.
220 220
      /// Its usage is quite simple, for example you can count the number
221 221
      /// of edges in a graph \c g of type \c Graph as follows:
222 222
      ///\code
223 223
      /// int count=0;
224 224
      /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
225 225
      ///\endcode
226 226
      class EdgeIt : public Edge {
227 227
      public:
228 228
        /// Default constructor
229 229

	
230 230
        /// @warning The default constructor sets the iterator
231 231
        /// to an undefined value.
232 232
        EdgeIt() { }
233 233
        /// Copy constructor.
234 234

	
235 235
        /// Copy constructor.
236 236
        ///
237 237
        EdgeIt(const EdgeIt& e) : Edge(e) { }
238 238
        /// Initialize the iterator to be invalid.
239 239

	
240 240
        /// Initialize the iterator to be invalid.
241 241
        ///
242 242
        EdgeIt(Invalid) { }
243 243
        /// This constructor sets the iterator to the first edge.
244 244

	
245 245
        /// This constructor sets the iterator to the first edge.
246 246
        EdgeIt(const Graph&) { }
247 247
        /// Edge -> EdgeIt conversion
248 248

	
249 249
        /// Sets the iterator to the value of the trivial iterator.
250 250
        /// This feature necessitates that each time we
251 251
        /// iterate the edge-set, the iteration order is the
252 252
        /// same.
253 253
        EdgeIt(const Graph&, const Edge&) { }
254 254
        /// Next edge
255 255

	
256 256
        /// Assign the iterator to the next edge.
257 257
        EdgeIt& operator++() { return *this; }
258 258
      };
259 259

	
260 260
      /// \brief This iterator goes trough the incident undirected
261 261
      /// arcs of a node.
262 262
      ///
263 263
      /// This iterator goes trough the incident edges
264 264
      /// of a certain node of a graph. You should assume that the
265 265
      /// loop arcs will be iterated twice.
266 266
      ///
267 267
      /// Its usage is quite simple, for example you can compute the
268 268
      /// degree (i.e. count the number of incident arcs of a node \c n
269 269
      /// in graph \c g of type \c Graph as follows.
270 270
      ///
271 271
      ///\code
272 272
      /// int count=0;
273 273
      /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
274 274
      ///\endcode
275 275
      class IncEdgeIt : public Edge {
276 276
      public:
277 277
        /// Default constructor
278 278

	
279 279
        /// @warning The default constructor sets the iterator
280 280
        /// to an undefined value.
281 281
        IncEdgeIt() { }
282 282
        /// Copy constructor.
283 283

	
284 284
        /// Copy constructor.
285 285
        ///
286 286
        IncEdgeIt(const IncEdgeIt& e) : Edge(e) { }
287 287
        /// Initialize the iterator to be invalid.
288 288

	
289 289
        /// Initialize the iterator to be invalid.
290 290
        ///
291 291
        IncEdgeIt(Invalid) { }
292 292
        /// This constructor sets the iterator to first incident arc.
293 293

	
294 294
        /// This constructor set the iterator to the first incident arc of
295 295
        /// the node.
296 296
        IncEdgeIt(const Graph&, const Node&) { }
297 297
        /// Edge -> IncEdgeIt conversion
298 298

	
299 299
        /// Sets the iterator to the value of the trivial iterator \c e.
300 300
        /// This feature necessitates that each time we
301 301
        /// iterate the arc-set, the iteration order is the same.
302 302
        IncEdgeIt(const Graph&, const Edge&) { }
303 303
        /// Next incident arc
304 304

	
305 305
        /// Assign the iterator to the next incident arc
306 306
        /// of the corresponding node.
307 307
        IncEdgeIt& operator++() { return *this; }
308 308
      };
309 309

	
310 310
      /// The directed arc type.
311 311

	
312 312
      /// The directed arc type. It can be converted to the
313 313
      /// edge or it should be inherited from the undirected
314 314
      /// arc.
315 315
      class Arc : public Edge {
316 316
      public:
317 317
        /// Default constructor
318 318

	
319 319
        /// @warning The default constructor sets the iterator
320 320
        /// to an undefined value.
321 321
        Arc() { }
322 322
        /// Copy constructor.
323 323

	
324 324
        /// Copy constructor.
325 325
        ///
326 326
        Arc(const Arc& e) : Edge(e) { }
327 327
        /// Initialize the iterator to be invalid.
328 328

	
329 329
        /// Initialize the iterator to be invalid.
330 330
        ///
331 331
        Arc(Invalid) { }
332 332
        /// Equality operator
333 333

	
334 334
        /// Two iterators are equal if and only if they point to the
335 335
        /// same object or both are invalid.
336 336
        bool operator==(Arc) const { return true; }
337 337
        /// Inequality operator
338 338

	
339 339
        /// \sa operator==(Arc n)
340 340
        ///
341 341
        bool operator!=(Arc) const { return true; }
342 342

	
343 343
        /// Artificial ordering operator.
344 344

	
345 345
        /// To allow the use of graph descriptors as key type in std::map or
346 346
        /// similar associative container we require this.
347 347
        ///
348 348
        /// \note This operator only have to define some strict ordering of
349 349
        /// the items; this order has nothing to do with the iteration
350 350
        /// ordering of the items.
351 351
        bool operator<(Arc) const { return false; }
352 352

	
353 353
      };
354 354
      /// This iterator goes through each directed arc.
355 355

	
356 356
      /// This iterator goes through each arc of a graph.
357 357
      /// Its usage is quite simple, for example you can count the number
358 358
      /// of arcs in a graph \c g of type \c Graph as follows:
359 359
      ///\code
360 360
      /// int count=0;
361 361
      /// for(Graph::ArcIt e(g); e!=INVALID; ++e) ++count;
362 362
      ///\endcode
363 363
      class ArcIt : public Arc {
364 364
      public:
365 365
        /// Default constructor
366 366

	
367 367
        /// @warning The default constructor sets the iterator
368 368
        /// to an undefined value.
369 369
        ArcIt() { }
370 370
        /// Copy constructor.
371 371

	
372 372
        /// Copy constructor.
373 373
        ///
374 374
        ArcIt(const ArcIt& e) : Arc(e) { }
375 375
        /// Initialize the iterator to be invalid.
376 376

	
377 377
        /// Initialize the iterator to be invalid.
378 378
        ///
379 379
        ArcIt(Invalid) { }
380 380
        /// This constructor sets the iterator to the first arc.
381 381

	
382 382
        /// This constructor sets the iterator to the first arc of \c g.
383 383
        ///@param g the graph
384 384
        ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
385 385
        /// Arc -> ArcIt conversion
386 386

	
387 387
        /// Sets the iterator to the value of the trivial iterator \c e.
388 388
        /// This feature necessitates that each time we
389 389
        /// iterate the arc-set, the iteration order is the same.
390 390
        ArcIt(const Graph&, const Arc&) { }
391 391
        ///Next arc
392 392

	
393 393
        /// Assign the iterator to the next arc.
394 394
        ArcIt& operator++() { return *this; }
395 395
      };
396 396

	
397 397
      /// This iterator goes trough the outgoing directed arcs of a node.
398 398

	
399 399
      /// This iterator goes trough the \e outgoing arcs of a certain node
400 400
      /// of a graph.
401 401
      /// Its usage is quite simple, for example you can count the number
402 402
      /// of outgoing arcs of a node \c n
403 403
      /// in graph \c g of type \c Graph as follows.
404 404
      ///\code
405 405
      /// int count=0;
406 406
      /// for (Graph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
407 407
      ///\endcode
408 408

	
409 409
      class OutArcIt : public Arc {
410 410
      public:
411 411
        /// Default constructor
412 412

	
413 413
        /// @warning The default constructor sets the iterator
414 414
        /// to an undefined value.
415 415
        OutArcIt() { }
416 416
        /// Copy constructor.
417 417

	
418 418
        /// Copy constructor.
419 419
        ///
420 420
        OutArcIt(const OutArcIt& e) : Arc(e) { }
421 421
        /// Initialize the iterator to be invalid.
422 422

	
423 423
        /// Initialize the iterator to be invalid.
424 424
        ///
425 425
        OutArcIt(Invalid) { }
426 426
        /// This constructor sets the iterator to the first outgoing arc.
427 427

	
428 428
        /// This constructor sets the iterator to the first outgoing arc of
429 429
        /// the node.
430 430
        ///@param n the node
431 431
        ///@param g the graph
432 432
        OutArcIt(const Graph& n, const Node& g) {
433 433
          ignore_unused_variable_warning(n);
434 434
          ignore_unused_variable_warning(g);
435 435
        }
436 436
        /// Arc -> OutArcIt conversion
437 437

	
438 438
        /// Sets the iterator to the value of the trivial iterator.
439 439
        /// This feature necessitates that each time we
440 440
        /// iterate the arc-set, the iteration order is the same.
441 441
        OutArcIt(const Graph&, const Arc&) { }
442 442
        ///Next outgoing arc
443 443

	
444 444
        /// Assign the iterator to the next
445 445
        /// outgoing arc of the corresponding node.
446 446
        OutArcIt& operator++() { return *this; }
447 447
      };
448 448

	
449 449
      /// This iterator goes trough the incoming directed arcs of a node.
450 450

	
451 451
      /// This iterator goes trough the \e incoming arcs of a certain node
452 452
      /// of a graph.
453 453
      /// Its usage is quite simple, for example you can count the number
454 454
      /// of outgoing arcs of a node \c n
455 455
      /// in graph \c g of type \c Graph as follows.
456 456
      ///\code
457 457
      /// int count=0;
458 458
      /// for(Graph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
459 459
      ///\endcode
460 460

	
461 461
      class InArcIt : public Arc {
462 462
      public:
463 463
        /// Default constructor
464 464

	
465 465
        /// @warning The default constructor sets the iterator
466 466
        /// to an undefined value.
467 467
        InArcIt() { }
468 468
        /// Copy constructor.
469 469

	
470 470
        /// Copy constructor.
471 471
        ///
472 472
        InArcIt(const InArcIt& e) : Arc(e) { }
473 473
        /// Initialize the iterator to be invalid.
474 474

	
475 475
        /// Initialize the iterator to be invalid.
476 476
        ///
477 477
        InArcIt(Invalid) { }
478 478
        /// This constructor sets the iterator to first incoming arc.
479 479

	
480 480
        /// This constructor set the iterator to the first incoming arc of
481 481
        /// the node.
482 482
        ///@param n the node
483 483
        ///@param g the graph
484 484
        InArcIt(const Graph& g, const Node& n) {
485 485
          ignore_unused_variable_warning(n);
486 486
          ignore_unused_variable_warning(g);
487 487
        }
488 488
        /// Arc -> InArcIt conversion
489 489

	
490 490
        /// Sets the iterator to the value of the trivial iterator \c e.
491 491
        /// This feature necessitates that each time we
492 492
        /// iterate the arc-set, the iteration order is the same.
493 493
        InArcIt(const Graph&, const Arc&) { }
494 494
        /// Next incoming arc
495 495

	
496 496
        /// Assign the iterator to the next inarc of the corresponding node.
497 497
        ///
498 498
        InArcIt& operator++() { return *this; }
499 499
      };
500 500

	
501 501
      /// \brief Read write map of the nodes to type \c T.
502 502
      ///
503 503
      /// ReadWrite map of the nodes to type \c T.
504 504
      /// \sa Reference
505 505
      template<class T>
506 506
      class NodeMap : public ReadWriteMap< Node, T >
507 507
      {
508 508
      public:
509 509

	
510 510
        ///\e
511 511
        NodeMap(const Graph&) { }
512 512
        ///\e
513 513
        NodeMap(const Graph&, T) { }
514 514

	
515
      private:
515 516
        ///Copy constructor
516 517
        NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
517 518
        ///Assignment operator
518 519
        template <typename CMap>
519 520
        NodeMap& operator=(const CMap&) {
520 521
          checkConcept<ReadMap<Node, T>, CMap>();
521 522
          return *this;
522 523
        }
523 524
      };
524 525

	
525 526
      /// \brief Read write map of the directed arcs to type \c T.
526 527
      ///
527 528
      /// Reference map of the directed arcs to type \c T.
528 529
      /// \sa Reference
529 530
      template<class T>
530 531
      class ArcMap : public ReadWriteMap<Arc,T>
531 532
      {
532 533
      public:
533 534

	
534 535
        ///\e
535 536
        ArcMap(const Graph&) { }
536 537
        ///\e
537 538
        ArcMap(const Graph&, T) { }
539
      private:
538 540
        ///Copy constructor
539 541
        ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { }
540 542
        ///Assignment operator
541 543
        template <typename CMap>
542 544
        ArcMap& operator=(const CMap&) {
543 545
          checkConcept<ReadMap<Arc, T>, CMap>();
544 546
          return *this;
545 547
        }
546 548
      };
547 549

	
548 550
      /// Read write map of the edges to type \c T.
549 551

	
550 552
      /// Reference map of the arcs to type \c T.
551 553
      /// \sa Reference
552 554
      template<class T>
553 555
      class EdgeMap : public ReadWriteMap<Edge,T>
554 556
      {
555 557
      public:
556 558

	
557 559
        ///\e
558 560
        EdgeMap(const Graph&) { }
559 561
        ///\e
560 562
        EdgeMap(const Graph&, T) { }
563
      private:
561 564
        ///Copy constructor
562 565
        EdgeMap(const EdgeMap& em) : ReadWriteMap<Edge,T>(em) {}
563 566
        ///Assignment operator
564 567
        template <typename CMap>
565 568
        EdgeMap& operator=(const CMap&) {
566 569
          checkConcept<ReadMap<Edge, T>, CMap>();
567 570
          return *this;
568 571
        }
569 572
      };
570 573

	
571 574
      /// \brief Direct the given edge.
572 575
      ///
573 576
      /// Direct the given edge. The returned arc source
574 577
      /// will be the given node.
575 578
      Arc direct(const Edge&, const Node&) const {
576 579
        return INVALID;
577 580
      }
578 581

	
579 582
      /// \brief Direct the given edge.
580 583
      ///
581 584
      /// Direct the given edge. The returned arc
582 585
      /// represents the given edge and the direction comes
583 586
      /// from the bool parameter. The source of the edge and
584 587
      /// the directed arc is the same when the given bool is true.
585 588
      Arc direct(const Edge&, bool) const {
586 589
        return INVALID;
587 590
      }
588 591

	
589 592
      /// \brief Returns true if the arc has default orientation.
590 593
      ///
591 594
      /// Returns whether the given directed arc is same orientation as
592 595
      /// the corresponding edge's default orientation.
593 596
      bool direction(Arc) const { return true; }
594 597

	
595 598
      /// \brief Returns the opposite directed arc.
596 599
      ///
597 600
      /// Returns the opposite directed arc.
598 601
      Arc oppositeArc(Arc) const { return INVALID; }
599 602

	
600 603
      /// \brief Opposite node on an arc
601 604
      ///
602 605
      /// \return the opposite of the given Node on the given Edge
603 606
      Node oppositeNode(Node, Edge) const { return INVALID; }
604 607

	
605 608
      /// \brief First node of the edge.
606 609
      ///
607 610
      /// \return the first node of the given Edge.
608 611
      ///
609 612
      /// Naturally edges don't have direction and thus
610 613
      /// don't have source and target node. But we use these two methods
611 614
      /// to query the two nodes of the arc. The direction of the arc
612 615
      /// which arises this way is called the inherent direction of the
613 616
      /// edge, and is used to define the "default" direction
614 617
      /// of the directed versions of the arcs.
615 618
      /// \sa direction
616 619
      Node u(Edge) const { return INVALID; }
617 620

	
618 621
      /// \brief Second node of the edge.
619 622
      Node v(Edge) const { return INVALID; }
620 623

	
621 624
      /// \brief Source node of the directed arc.
622 625
      Node source(Arc) const { return INVALID; }
623 626

	
624 627
      /// \brief Target node of the directed arc.
625 628
      Node target(Arc) const { return INVALID; }
626 629

	
627 630
      /// \brief Returns the id of the node.
628 631
      int id(Node) const { return -1; }
629 632

	
630 633
      /// \brief Returns the id of the edge.
631 634
      int id(Edge) const { return -1; }
632 635

	
633 636
      /// \brief Returns the id of the arc.
634 637
      int id(Arc) const { return -1; }
635 638

	
636 639
      /// \brief Returns the node with the given id.
637 640
      ///
638 641
      /// \pre The argument should be a valid node id in the graph.
639 642
      Node nodeFromId(int) const { return INVALID; }
640 643

	
641 644
      /// \brief Returns the edge with the given id.
642 645
      ///
643 646
      /// \pre The argument should be a valid edge id in the graph.
644 647
      Edge edgeFromId(int) const { return INVALID; }
645 648

	
646 649
      /// \brief Returns the arc with the given id.
647 650
      ///
648 651
      /// \pre The argument should be a valid arc id in the graph.
649 652
      Arc arcFromId(int) const { return INVALID; }
650 653

	
651 654
      /// \brief Returns an upper bound on the node IDs.
652 655
      int maxNodeId() const { return -1; }
653 656

	
654 657
      /// \brief Returns an upper bound on the edge IDs.
655 658
      int maxEdgeId() const { return -1; }
656 659

	
657 660
      /// \brief Returns an upper bound on the arc IDs.
658 661
      int maxArcId() const { return -1; }
659 662

	
660 663
      void first(Node&) const {}
661 664
      void next(Node&) const {}
662 665

	
663 666
      void first(Edge&) const {}
664 667
      void next(Edge&) const {}
665 668

	
666 669
      void first(Arc&) const {}
667 670
      void next(Arc&) const {}
668 671

	
669 672
      void firstOut(Arc&, Node) const {}
670 673
      void nextOut(Arc&) const {}
671 674

	
672 675
      void firstIn(Arc&, Node) const {}
673 676
      void nextIn(Arc&) const {}
674 677

	
675 678
      void firstInc(Edge &, bool &, const Node &) const {}
676 679
      void nextInc(Edge &, bool &) const {}
677 680

	
678 681
      // The second parameter is dummy.
679 682
      Node fromId(int, Node) const { return INVALID; }
680 683
      // The second parameter is dummy.
681 684
      Edge fromId(int, Edge) const { return INVALID; }
682 685
      // The second parameter is dummy.
683 686
      Arc fromId(int, Arc) const { return INVALID; }
684 687

	
685 688
      // Dummy parameter.
686 689
      int maxId(Node) const { return -1; }
687 690
      // Dummy parameter.
688 691
      int maxId(Edge) const { return -1; }
689 692
      // Dummy parameter.
690 693
      int maxId(Arc) const { return -1; }
691 694

	
692 695
      /// \brief Base node of the iterator
693 696
      ///
694 697
      /// Returns the base node (the source in this case) of the iterator
695 698
      Node baseNode(OutArcIt e) const {
696 699
        return source(e);
697 700
      }
698 701
      /// \brief Running node of the iterator
699 702
      ///
700 703
      /// Returns the running node (the target in this case) of the
701 704
      /// iterator
702 705
      Node runningNode(OutArcIt e) const {
703 706
        return target(e);
704 707
      }
705 708

	
706 709
      /// \brief Base node of the iterator
707 710
      ///
708 711
      /// Returns the base node (the target in this case) of the iterator
709 712
      Node baseNode(InArcIt e) const {
710 713
        return target(e);
711 714
      }
712 715
      /// \brief Running node of the iterator
713 716
      ///
714 717
      /// Returns the running node (the source in this case) of the
715 718
      /// iterator
716 719
      Node runningNode(InArcIt e) const {
717 720
        return source(e);
718 721
      }
719 722

	
720 723
      /// \brief Base node of the iterator
721 724
      ///
722 725
      /// Returns the base node of the iterator
723 726
      Node baseNode(IncEdgeIt) const {
724 727
        return INVALID;
725 728
      }
726 729

	
727 730
      /// \brief Running node of the iterator
728 731
      ///
729 732
      /// Returns the running node of the iterator
730 733
      Node runningNode(IncEdgeIt) const {
731 734
        return INVALID;
732 735
      }
733 736

	
734 737
      template <typename _Graph>
735 738
      struct Constraints {
736 739
        void constraints() {
737 740
          checkConcept<IterableGraphComponent<>, _Graph>();
738 741
          checkConcept<IDableGraphComponent<>, _Graph>();
739 742
          checkConcept<MappableGraphComponent<>, _Graph>();
740 743
        }
741 744
      };
742 745

	
743 746
    };
744 747

	
745 748
  }
746 749

	
747 750
}
748 751

	
749 752
#endif
Show white space 3072 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-2008
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
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concept of graph components.
22 22

	
23 23

	
24 24
#ifndef LEMON_CONCEPT_GRAPH_COMPONENTS_H
25 25
#define LEMON_CONCEPT_GRAPH_COMPONENTS_H
26 26

	
27 27
#include <lemon/core.h>
28 28
#include <lemon/concepts/maps.h>
29 29

	
30 30
#include <lemon/bits/alteration_notifier.h>
31 31

	
32 32
namespace lemon {
33 33
  namespace concepts {
34 34

	
35 35
    /// \brief Skeleton class for graph Node and Arc types
36 36
    ///
37 37
    /// This class describes the interface of Node and Arc (and Edge
38 38
    /// in undirected graphs) subtypes of graph types.
39 39
    ///
40 40
    /// \note This class is a template class so that we can use it to
41 41
    /// create graph skeleton classes. The reason for this is than Node
42 42
    /// and Arc types should \em not derive from the same base class.
43 43
    /// For Node you should instantiate it with character 'n' and for Arc
44 44
    /// with 'a'.
45 45

	
46 46
#ifndef DOXYGEN
47 47
    template <char _selector = '0'>
48 48
#endif
49 49
    class GraphItem {
50 50
    public:
51 51
      /// \brief Default constructor.
52 52
      ///
53 53
      /// \warning The default constructor is not required to set
54 54
      /// the item to some well-defined value. So you should consider it
55 55
      /// as uninitialized.
56 56
      GraphItem() {}
57 57
      /// \brief Copy constructor.
58 58
      ///
59 59
      /// Copy constructor.
60 60
      ///
61 61
      GraphItem(const GraphItem &) {}
62 62
      /// \brief Invalid constructor \& conversion.
63 63
      ///
64 64
      /// This constructor initializes the item to be invalid.
65 65
      /// \sa Invalid for more details.
66 66
      GraphItem(Invalid) {}
67 67
      /// \brief Assign operator for nodes.
68 68
      ///
69 69
      /// The nodes are assignable.
70 70
      ///
71 71
      GraphItem& operator=(GraphItem const&) { return *this; }
72 72
      /// \brief Equality operator.
73 73
      ///
74 74
      /// Two iterators are equal if and only if they represents the
75 75
      /// same node in the graph or both are invalid.
76 76
      bool operator==(GraphItem) const { return false; }
77 77
      /// \brief Inequality operator.
78 78
      ///
79 79
      /// \sa operator==(const Node& n)
80 80
      ///
81 81
      bool operator!=(GraphItem) const { return false; }
82 82

	
83 83
      /// \brief Artificial ordering operator.
84 84
      ///
85 85
      /// To allow the use of graph descriptors as key type in std::map or
86 86
      /// similar associative container we require this.
87 87
      ///
88 88
      /// \note This operator only have to define some strict ordering of
89 89
      /// the items; this order has nothing to do with the iteration
90 90
      /// ordering of the items.
91 91
      bool operator<(GraphItem) const { return false; }
92 92

	
93 93
      template<typename _GraphItem>
94 94
      struct Constraints {
95 95
        void constraints() {
96 96
          _GraphItem i1;
97 97
          _GraphItem i2 = i1;
98 98
          _GraphItem i3 = INVALID;
99 99

	
100 100
          i1 = i2 = i3;
101 101

	
102 102
          bool b;
103 103
          //          b = (ia == ib) && (ia != ib) && (ia < ib);
104 104
          b = (ia == ib) && (ia != ib);
105 105
          b = (ia == INVALID) && (ib != INVALID);
106 106
          b = (ia < ib);
107 107
        }
108 108

	
109 109
        const _GraphItem &ia;
110 110
        const _GraphItem &ib;
111 111
      };
112 112
    };
113 113

	
114 114
    /// \brief An empty base directed graph class.
115 115
    ///
116 116
    /// This class provides the minimal set of features needed for a
117 117
    /// directed graph structure. All digraph concepts have to be
118 118
    /// conform to this base directed graph. It just provides types
119 119
    /// for nodes and arcs and functions to get the source and the
120 120
    /// target of the arcs.
121 121
    class BaseDigraphComponent {
122 122
    public:
123 123

	
124 124
      typedef BaseDigraphComponent Digraph;
125 125

	
126 126
      /// \brief Node class of the digraph.
127 127
      ///
128 128
      /// This class represents the Nodes of the digraph.
129 129
      ///
130 130
      typedef GraphItem<'n'> Node;
131 131

	
132 132
      /// \brief Arc class of the digraph.
133 133
      ///
134 134
      /// This class represents the Arcs of the digraph.
135 135
      ///
136 136
      typedef GraphItem<'e'> Arc;
137 137

	
138 138
      /// \brief Gives back the target node of an arc.
139 139
      ///
140 140
      /// Gives back the target node of an arc.
141 141
      ///
142 142
      Node target(const Arc&) const { return INVALID;}
143 143

	
144 144
      /// \brief Gives back the source node of an arc.
145 145
      ///
146 146
      /// Gives back the source node of an arc.
147 147
      ///
148 148
      Node source(const Arc&) const { return INVALID;}
149 149

	
150 150
      /// \brief Gives back the opposite node on the given arc.
151 151
      ///
152 152
      /// Gives back the opposite node on the given arc.
153 153
      Node oppositeNode(const Node&, const Arc&) const {
154 154
        return INVALID;
155 155
      }
156 156

	
157 157
      template <typename _Digraph>
158 158
      struct Constraints {
159 159
        typedef typename _Digraph::Node Node;
160 160
        typedef typename _Digraph::Arc Arc;
161 161

	
162 162
        void constraints() {
163 163
          checkConcept<GraphItem<'n'>, Node>();
164 164
          checkConcept<GraphItem<'a'>, Arc>();
165 165
          {
166 166
            Node n;
167 167
            Arc e(INVALID);
168 168
            n = digraph.source(e);
169 169
            n = digraph.target(e);
170 170
            n = digraph.oppositeNode(n, e);
171 171
          }
172 172
        }
173 173

	
174 174
        const _Digraph& digraph;
175 175
      };
176 176
    };
177 177

	
178 178
    /// \brief An empty base undirected graph class.
179 179
    ///
180 180
    /// This class provides the minimal set of features needed for an
181 181
    /// undirected graph structure. All undirected graph concepts have
182 182
    /// to be conform to this base graph. It just provides types for
183 183
    /// nodes, arcs and edges and functions to get the
184 184
    /// source and the target of the arcs and edges,
185 185
    /// conversion from arcs to edges and function to get
186 186
    /// both direction of the edges.
187 187
    class BaseGraphComponent : public BaseDigraphComponent {
188 188
    public:
189 189
      typedef BaseDigraphComponent::Node Node;
190 190
      typedef BaseDigraphComponent::Arc Arc;
191 191
      /// \brief Undirected arc class of the graph.
192 192
      ///
193 193
      /// This class represents the edges of the graph.
194 194
      /// The undirected graphs can be used as a directed graph which
195 195
      /// for each arc contains the opposite arc too so the graph is
196 196
      /// bidirected. The edge represents two opposite
197 197
      /// directed arcs.
198 198
      class Edge : public GraphItem<'u'> {
199 199
      public:
200 200
        typedef GraphItem<'u'> Parent;
201 201
        /// \brief Default constructor.
202 202
        ///
203 203
        /// \warning The default constructor is not required to set
204 204
        /// the item to some well-defined value. So you should consider it
205 205
        /// as uninitialized.
206 206
        Edge() {}
207 207
        /// \brief Copy constructor.
208 208
        ///
209 209
        /// Copy constructor.
210 210
        ///
211 211
        Edge(const Edge &) : Parent() {}
212 212
        /// \brief Invalid constructor \& conversion.
213 213
        ///
214 214
        /// This constructor initializes the item to be invalid.
215 215
        /// \sa Invalid for more details.
216 216
        Edge(Invalid) {}
217 217
        /// \brief Converter from arc to edge.
218 218
        ///
219 219
        /// Besides the core graph item functionality each arc should
220 220
        /// be convertible to the represented edge.
221 221
        Edge(const Arc&) {}
222 222
        /// \brief Assign arc to edge.
223 223
        ///
224 224
        /// Besides the core graph item functionality each arc should
225 225
        /// be convertible to the represented edge.
226 226
        Edge& operator=(const Arc&) { return *this; }
227 227
      };
228 228

	
229 229
      /// \brief Returns the direction of the arc.
230 230
      ///
231 231
      /// Returns the direction of the arc. Each arc represents an
232 232
      /// edge with a direction. It gives back the
233 233
      /// direction.
234 234
      bool direction(const Arc&) const { return true; }
235 235

	
236 236
      /// \brief Returns the directed arc.
237 237
      ///
238 238
      /// Returns the directed arc from its direction and the
239 239
      /// represented edge.
240 240
      Arc direct(const Edge&, bool) const { return INVALID;}
241 241

	
242 242
      /// \brief Returns the directed arc.
243 243
      ///
244 244
      /// Returns the directed arc from its source and the
245 245
      /// represented edge.
246 246
      Arc direct(const Edge&, const Node&) const { return INVALID;}
247 247

	
248 248
      /// \brief Returns the opposite arc.
249 249
      ///
250 250
      /// Returns the opposite arc. It is the arc representing the
251 251
      /// same edge and has opposite direction.
252 252
      Arc oppositeArc(const Arc&) const { return INVALID;}
253 253

	
254 254
      /// \brief Gives back one ending of an edge.
255 255
      ///
256 256
      /// Gives back one ending of an edge.
257 257
      Node u(const Edge&) const { return INVALID;}
258 258

	
259 259
      /// \brief Gives back the other ending of an edge.
260 260
      ///
261 261
      /// Gives back the other ending of an edge.
262 262
      Node v(const Edge&) const { return INVALID;}
263 263

	
264 264
      template <typename _Graph>
265 265
      struct Constraints {
266 266
        typedef typename _Graph::Node Node;
267 267
        typedef typename _Graph::Arc Arc;
268 268
        typedef typename _Graph::Edge Edge;
269 269

	
270 270
        void constraints() {
271 271
          checkConcept<BaseDigraphComponent, _Graph>();
272 272
          checkConcept<GraphItem<'u'>, Edge>();
273 273
          {
274 274
            Node n;
275 275
            Edge ue(INVALID);
276 276
            Arc e;
277 277
            n = graph.u(ue);
278 278
            n = graph.v(ue);
279 279
            e = graph.direct(ue, true);
280 280
            e = graph.direct(ue, n);
281 281
            e = graph.oppositeArc(e);
282 282
            ue = e;
283 283
            bool d = graph.direction(e);
284 284
            ignore_unused_variable_warning(d);
285 285
          }
286 286
        }
287 287

	
288 288
        const _Graph& graph;
289 289
      };
290 290

	
291 291
    };
292 292

	
293 293
    /// \brief An empty idable base digraph class.
294 294
    ///
295 295
    /// This class provides beside the core digraph features
296 296
    /// core id functions for the digraph structure.
297 297
    /// The most of the base digraphs should be conform to this concept.
298 298
    /// The id's are unique and immutable.
299 299
    template <typename _Base = BaseDigraphComponent>
300 300
    class IDableDigraphComponent : public _Base {
301 301
    public:
302 302

	
303 303
      typedef _Base Base;
304 304
      typedef typename Base::Node Node;
305 305
      typedef typename Base::Arc Arc;
306 306

	
307 307
      /// \brief Gives back an unique integer id for the Node.
308 308
      ///
309 309
      /// Gives back an unique integer id for the Node.
310 310
      ///
311 311
      int id(const Node&) const { return -1;}
312 312

	
313 313
      /// \brief Gives back the node by the unique id.
314 314
      ///
315 315
      /// Gives back the node by the unique id.
316 316
      /// If the digraph does not contain node with the given id
317 317
      /// then the result of the function is undetermined.
318 318
      Node nodeFromId(int) const { return INVALID;}
319 319

	
320 320
      /// \brief Gives back an unique integer id for the Arc.
321 321
      ///
322 322
      /// Gives back an unique integer id for the Arc.
323 323
      ///
324 324
      int id(const Arc&) const { return -1;}
325 325

	
326 326
      /// \brief Gives back the arc by the unique id.
327 327
      ///
328 328
      /// Gives back the arc by the unique id.
329 329
      /// If the digraph does not contain arc with the given id
330 330
      /// then the result of the function is undetermined.
331 331
      Arc arcFromId(int) const { return INVALID;}
332 332

	
333 333
      /// \brief Gives back an integer greater or equal to the maximum
334 334
      /// Node id.
335 335
      ///
336 336
      /// Gives back an integer greater or equal to the maximum Node
337 337
      /// id.
338 338
      int maxNodeId() const { return -1;}
339 339

	
340 340
      /// \brief Gives back an integer greater or equal to the maximum
341 341
      /// Arc id.
342 342
      ///
343 343
      /// Gives back an integer greater or equal to the maximum Arc
344 344
      /// id.
345 345
      int maxArcId() const { return -1;}
346 346

	
347 347
      template <typename _Digraph>
348 348
      struct Constraints {
349 349

	
350 350
        void constraints() {
351 351
          checkConcept<Base, _Digraph >();
352 352
          typename _Digraph::Node node;
353 353
          int nid = digraph.id(node);
354 354
          nid = digraph.id(node);
355 355
          node = digraph.nodeFromId(nid);
356 356
          typename _Digraph::Arc arc;
357 357
          int eid = digraph.id(arc);
358 358
          eid = digraph.id(arc);
359 359
          arc = digraph.arcFromId(eid);
360 360

	
361 361
          nid = digraph.maxNodeId();
362 362
          ignore_unused_variable_warning(nid);
363 363
          eid = digraph.maxArcId();
364 364
          ignore_unused_variable_warning(eid);
365 365
        }
366 366

	
367 367
        const _Digraph& digraph;
368 368
      };
369 369
    };
370 370

	
371 371
    /// \brief An empty idable base undirected graph class.
372 372
    ///
373 373
    /// This class provides beside the core undirected graph features
374 374
    /// core id functions for the undirected graph structure.  The
375 375
    /// most of the base undirected graphs should be conform to this
376 376
    /// concept.  The id's are unique and immutable.
377 377
    template <typename _Base = BaseGraphComponent>
378 378
    class IDableGraphComponent : public IDableDigraphComponent<_Base> {
379 379
    public:
380 380

	
381 381
      typedef _Base Base;
382 382
      typedef typename Base::Edge Edge;
383 383

	
384 384
      using IDableDigraphComponent<_Base>::id;
385 385

	
386 386
      /// \brief Gives back an unique integer id for the Edge.
387 387
      ///
388 388
      /// Gives back an unique integer id for the Edge.
389 389
      ///
390 390
      int id(const Edge&) const { return -1;}
391 391

	
392 392
      /// \brief Gives back the edge by the unique id.
393 393
      ///
394 394
      /// Gives back the edge by the unique id.  If the
395 395
      /// graph does not contain arc with the given id then the
396 396
      /// result of the function is undetermined.
397 397
      Edge edgeFromId(int) const { return INVALID;}
398 398

	
399 399
      /// \brief Gives back an integer greater or equal to the maximum
400 400
      /// Edge id.
401 401
      ///
402 402
      /// Gives back an integer greater or equal to the maximum Edge
403 403
      /// id.
404 404
      int maxEdgeId() const { return -1;}
405 405

	
406 406
      template <typename _Graph>
407 407
      struct Constraints {
408 408

	
409 409
        void constraints() {
410 410
          checkConcept<Base, _Graph >();
411 411
          checkConcept<IDableDigraphComponent<Base>, _Graph >();
412 412
          typename _Graph::Edge edge;
413 413
          int ueid = graph.id(edge);
414 414
          ueid = graph.id(edge);
415 415
          edge = graph.edgeFromId(ueid);
416 416
          ueid = graph.maxEdgeId();
417 417
          ignore_unused_variable_warning(ueid);
418 418
        }
419 419

	
420 420
        const _Graph& graph;
421 421
      };
422 422
    };
423 423

	
424 424
    /// \brief Skeleton class for graph NodeIt and ArcIt
425 425
    ///
426 426
    /// Skeleton class for graph NodeIt and ArcIt.
427 427
    ///
428 428
    template <typename _Graph, typename _Item>
429 429
    class GraphItemIt : public _Item {
430 430
    public:
431 431
      /// \brief Default constructor.
432 432
      ///
433 433
      /// @warning The default constructor sets the iterator
434 434
      /// to an undefined value.
435 435
      GraphItemIt() {}
436 436
      /// \brief Copy constructor.
437 437
      ///
438 438
      /// Copy constructor.
439 439
      ///
440 440
      GraphItemIt(const GraphItemIt& ) {}
441 441
      /// \brief Sets the iterator to the first item.
442 442
      ///
443 443
      /// Sets the iterator to the first item of \c the graph.
444 444
      ///
445 445
      explicit GraphItemIt(const _Graph&) {}
446 446
      /// \brief Invalid constructor \& conversion.
447 447
      ///
448 448
      /// This constructor initializes the item to be invalid.
449 449
      /// \sa Invalid for more details.
450 450
      GraphItemIt(Invalid) {}
451 451
      /// \brief Assign operator for items.
452 452
      ///
453 453
      /// The items are assignable.
454 454
      ///
455 455
      GraphItemIt& operator=(const GraphItemIt&) { return *this; }
456 456
      /// \brief Next item.
457 457
      ///
458 458
      /// Assign the iterator to the next item.
459 459
      ///
460 460
      GraphItemIt& operator++() { return *this; }
461 461
      /// \brief Equality operator
462 462
      ///
463 463
      /// Two iterators are equal if and only if they point to the
464 464
      /// same object or both are invalid.
465 465
      bool operator==(const GraphItemIt&) const { return true;}
466 466
      /// \brief Inequality operator
467 467
      ///
468 468
      /// \sa operator==(Node n)
469 469
      ///
470 470
      bool operator!=(const GraphItemIt&) const { return true;}
471 471

	
472 472
      template<typename _GraphItemIt>
473 473
      struct Constraints {
474 474
        void constraints() {
475 475
          _GraphItemIt it1(g);
476 476
          _GraphItemIt it2;
477 477

	
478 478
          it2 = ++it1;
479 479
          ++it2 = it1;
480 480
          ++(++it1);
481 481

	
482 482
          _Item bi = it1;
483 483
          bi = it2;
484 484
        }
485 485
        _Graph& g;
486 486
      };
487 487
    };
488 488

	
489 489
    /// \brief Skeleton class for graph InArcIt and OutArcIt
490 490
    ///
491 491
    /// \note Because InArcIt and OutArcIt may not inherit from the same
492 492
    /// base class, the _selector is a additional template parameter. For
493 493
    /// InArcIt you should instantiate it with character 'i' and for
494 494
    /// OutArcIt with 'o'.
495 495
    template <typename _Graph,
496 496
              typename _Item = typename _Graph::Arc,
497 497
              typename _Base = typename _Graph::Node,
498 498
              char _selector = '0'>
499 499
    class GraphIncIt : public _Item {
500 500
    public:
501 501
      /// \brief Default constructor.
502 502
      ///
503 503
      /// @warning The default constructor sets the iterator
504 504
      /// to an undefined value.
505 505
      GraphIncIt() {}
506 506
      /// \brief Copy constructor.
507 507
      ///
508 508
      /// Copy constructor.
509 509
      ///
510 510
      GraphIncIt(GraphIncIt const& gi) : _Item(gi) {}
511 511
      /// \brief Sets the iterator to the first arc incoming into or outgoing
512 512
      /// from the node.
513 513
      ///
514 514
      /// Sets the iterator to the first arc incoming into or outgoing
515 515
      /// from the node.
516 516
      ///
517 517
      explicit GraphIncIt(const _Graph&, const _Base&) {}
518 518
      /// \brief Invalid constructor \& conversion.
519 519
      ///
520 520
      /// This constructor initializes the item to be invalid.
521 521
      /// \sa Invalid for more details.
522 522
      GraphIncIt(Invalid) {}
523 523
      /// \brief Assign operator for iterators.
524 524
      ///
525 525
      /// The iterators are assignable.
526 526
      ///
527 527
      GraphIncIt& operator=(GraphIncIt const&) { return *this; }
528 528
      /// \brief Next item.
529 529
      ///
530 530
      /// Assign the iterator to the next item.
531 531
      ///
532 532
      GraphIncIt& operator++() { return *this; }
533 533

	
534 534
      /// \brief Equality operator
535 535
      ///
536 536
      /// Two iterators are equal if and only if they point to the
537 537
      /// same object or both are invalid.
538 538
      bool operator==(const GraphIncIt&) const { return true;}
539 539

	
540 540
      /// \brief Inequality operator
541 541
      ///
542 542
      /// \sa operator==(Node n)
543 543
      ///
544 544
      bool operator!=(const GraphIncIt&) const { return true;}
545 545

	
546 546
      template <typename _GraphIncIt>
547 547
      struct Constraints {
548 548
        void constraints() {
549 549
          checkConcept<GraphItem<_selector>, _GraphIncIt>();
550 550
          _GraphIncIt it1(graph, node);
551 551
          _GraphIncIt it2;
552 552

	
553 553
          it2 = ++it1;
554 554
          ++it2 = it1;
555 555
          ++(++it1);
556 556
          _Item e = it1;
557 557
          e = it2;
558 558

	
559 559
        }
560 560

	
561 561
        _Item arc;
562 562
        _Base node;
563 563
        _Graph graph;
564 564
        _GraphIncIt it;
565 565
      };
566 566
    };
567 567

	
568 568

	
569 569
    /// \brief An empty iterable digraph class.
570 570
    ///
571 571
    /// This class provides beside the core digraph features
572 572
    /// iterator based iterable interface for the digraph structure.
573 573
    /// This concept is part of the Digraph concept.
574 574
    template <typename _Base = BaseDigraphComponent>
575 575
    class IterableDigraphComponent : public _Base {
576 576

	
577 577
    public:
578 578

	
579 579
      typedef _Base Base;
580 580
      typedef typename Base::Node Node;
581 581
      typedef typename Base::Arc Arc;
582 582

	
583 583
      typedef IterableDigraphComponent Digraph;
584 584

	
585 585
      /// \name Base iteration
586 586
      ///
587 587
      /// This interface provides functions for iteration on digraph items
588 588
      ///
589 589
      /// @{
590 590

	
591 591
      /// \brief Gives back the first node in the iterating order.
592 592
      ///
593 593
      /// Gives back the first node in the iterating order.
594 594
      ///
595 595
      void first(Node&) const {}
596 596

	
597 597
      /// \brief Gives back the next node in the iterating order.
598 598
      ///
599 599
      /// Gives back the next node in the iterating order.
600 600
      ///
601 601
      void next(Node&) const {}
602 602

	
603 603
      /// \brief Gives back the first arc in the iterating order.
604 604
      ///
605 605
      /// Gives back the first arc in the iterating order.
606 606
      ///
607 607
      void first(Arc&) const {}
608 608

	
609 609
      /// \brief Gives back the next arc in the iterating order.
610 610
      ///
611 611
      /// Gives back the next arc in the iterating order.
612 612
      ///
613 613
      void next(Arc&) const {}
614 614

	
615 615

	
616 616
      /// \brief Gives back the first of the arcs point to the given
617 617
      /// node.
618 618
      ///
619 619
      /// Gives back the first of the arcs point to the given node.
620 620
      ///
621 621
      void firstIn(Arc&, const Node&) const {}
622 622

	
623 623
      /// \brief Gives back the next of the arcs points to the given
624 624
      /// node.
625 625
      ///
626 626
      /// Gives back the next of the arcs points to the given node.
627 627
      ///
628 628
      void nextIn(Arc&) const {}
629 629

	
630 630
      /// \brief Gives back the first of the arcs start from the
631 631
      /// given node.
632 632
      ///
633 633
      /// Gives back the first of the arcs start from the given node.
634 634
      ///
635 635
      void firstOut(Arc&, const Node&) const {}
636 636

	
637 637
      /// \brief Gives back the next of the arcs start from the given
638 638
      /// node.
639 639
      ///
640 640
      /// Gives back the next of the arcs start from the given node.
641 641
      ///
642 642
      void nextOut(Arc&) const {}
643 643

	
644 644
      /// @}
645 645

	
646 646
      /// \name Class based iteration
647 647
      ///
648 648
      /// This interface provides functions for iteration on digraph items
649 649
      ///
650 650
      /// @{
651 651

	
652 652
      /// \brief This iterator goes through each node.
653 653
      ///
654 654
      /// This iterator goes through each node.
655 655
      ///
656 656
      typedef GraphItemIt<Digraph, Node> NodeIt;
657 657

	
658 658
      /// \brief This iterator goes through each node.
659 659
      ///
660 660
      /// This iterator goes through each node.
661 661
      ///
662 662
      typedef GraphItemIt<Digraph, Arc> ArcIt;
663 663

	
664 664
      /// \brief This iterator goes trough the incoming arcs of a node.
665 665
      ///
666 666
      /// This iterator goes trough the \e inccoming arcs of a certain node
667 667
      /// of a digraph.
668 668
      typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt;
669 669

	
670 670
      /// \brief This iterator goes trough the outgoing arcs of a node.
671 671
      ///
672 672
      /// This iterator goes trough the \e outgoing arcs of a certain node
673 673
      /// of a digraph.
674 674
      typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt;
675 675

	
676 676
      /// \brief The base node of the iterator.
677 677
      ///
678 678
      /// Gives back the base node of the iterator.
679 679
      /// It is always the target of the pointed arc.
680 680
      Node baseNode(const InArcIt&) const { return INVALID; }
681 681

	
682 682
      /// \brief The running node of the iterator.
683 683
      ///
684 684
      /// Gives back the running node of the iterator.
685 685
      /// It is always the source of the pointed arc.
686 686
      Node runningNode(const InArcIt&) const { return INVALID; }
687 687

	
688 688
      /// \brief The base node of the iterator.
689 689
      ///
690 690
      /// Gives back the base node of the iterator.
691 691
      /// It is always the source of the pointed arc.
692 692
      Node baseNode(const OutArcIt&) const { return INVALID; }
693 693

	
694 694
      /// \brief The running node of the iterator.
695 695
      ///
696 696
      /// Gives back the running node of the iterator.
697 697
      /// It is always the target of the pointed arc.
698 698
      Node runningNode(const OutArcIt&) const { return INVALID; }
699 699

	
700 700
      /// @}
701 701

	
702 702
      template <typename _Digraph>
703 703
      struct Constraints {
704 704
        void constraints() {
705 705
          checkConcept<Base, _Digraph>();
706 706

	
707 707
          {
708 708
            typename _Digraph::Node node(INVALID);
709 709
            typename _Digraph::Arc arc(INVALID);
710 710
            {
711 711
              digraph.first(node);
712 712
              digraph.next(node);
713 713
            }
714 714
            {
715 715
              digraph.first(arc);
716 716
              digraph.next(arc);
717 717
            }
718 718
            {
719 719
              digraph.firstIn(arc, node);
720 720
              digraph.nextIn(arc);
721 721
            }
722 722
            {
723 723
              digraph.firstOut(arc, node);
724 724
              digraph.nextOut(arc);
725 725
            }
726 726
          }
727 727

	
728 728
          {
729 729
            checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
730 730
              typename _Digraph::ArcIt >();
731 731
            checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
732 732
              typename _Digraph::NodeIt >();
733 733
            checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
734 734
              typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
735 735
            checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
736 736
              typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
737 737

	
738 738
            typename _Digraph::Node n;
739 739
            typename _Digraph::InArcIt ieit(INVALID);
740 740
            typename _Digraph::OutArcIt oeit(INVALID);
741 741
            n = digraph.baseNode(ieit);
742 742
            n = digraph.runningNode(ieit);
743 743
            n = digraph.baseNode(oeit);
744 744
            n = digraph.runningNode(oeit);
745 745
            ignore_unused_variable_warning(n);
746 746
          }
747 747
        }
748 748

	
749 749
        const _Digraph& digraph;
750 750

	
751 751
      };
752 752
    };
753 753

	
754 754
    /// \brief An empty iterable undirected graph class.
755 755
    ///
756 756
    /// This class provides beside the core graph features iterator
757 757
    /// based iterable interface for the undirected graph structure.
758 758
    /// This concept is part of the Graph concept.
759 759
    template <typename _Base = BaseGraphComponent>
760 760
    class IterableGraphComponent : public IterableDigraphComponent<_Base> {
761 761
    public:
762 762

	
763 763
      typedef _Base Base;
764 764
      typedef typename Base::Node Node;
765 765
      typedef typename Base::Arc Arc;
766 766
      typedef typename Base::Edge Edge;
767 767

	
768 768

	
769 769
      typedef IterableGraphComponent Graph;
770 770

	
771 771
      /// \name Base iteration
772 772
      ///
773 773
      /// This interface provides functions for iteration on graph items
774 774
      /// @{
775 775

	
776 776
      using IterableDigraphComponent<_Base>::first;
777 777
      using IterableDigraphComponent<_Base>::next;
778 778

	
779 779
      /// \brief Gives back the first edge in the iterating
780 780
      /// order.
781 781
      ///
782 782
      /// Gives back the first edge in the iterating order.
783 783
      ///
784 784
      void first(Edge&) const {}
785 785

	
786 786
      /// \brief Gives back the next edge in the iterating
787 787
      /// order.
788 788
      ///
789 789
      /// Gives back the next edge in the iterating order.
790 790
      ///
791 791
      void next(Edge&) const {}
792 792

	
793 793

	
794 794
      /// \brief Gives back the first of the edges from the
795 795
      /// given node.
796 796
      ///
797 797
      /// Gives back the first of the edges from the given
798 798
      /// node. The bool parameter gives back that direction which
799 799
      /// gives a good direction of the edge so the source of the
800 800
      /// directed arc is the given node.
801 801
      void firstInc(Edge&, bool&, const Node&) const {}
802 802

	
803 803
      /// \brief Gives back the next of the edges from the
804 804
      /// given node.
805 805
      ///
806 806
      /// Gives back the next of the edges from the given
807 807
      /// node. The bool parameter should be used as the \c firstInc()
808 808
      /// use it.
809 809
      void nextInc(Edge&, bool&) const {}
810 810

	
811 811
      using IterableDigraphComponent<_Base>::baseNode;
812 812
      using IterableDigraphComponent<_Base>::runningNode;
813 813

	
814 814
      /// @}
815 815

	
816 816
      /// \name Class based iteration
817 817
      ///
818 818
      /// This interface provides functions for iteration on graph items
819 819
      ///
820 820
      /// @{
821 821

	
822 822
      /// \brief This iterator goes through each node.
823 823
      ///
824 824
      /// This iterator goes through each node.
825 825
      typedef GraphItemIt<Graph, Edge> EdgeIt;
826 826
      /// \brief This iterator goes trough the incident arcs of a
827 827
      /// node.
828 828
      ///
829 829
      /// This iterator goes trough the incident arcs of a certain
830 830
      /// node of a graph.
831 831
      typedef GraphIncIt<Graph, Edge, Node, 'u'> IncEdgeIt;
832 832
      /// \brief The base node of the iterator.
833 833
      ///
834 834
      /// Gives back the base node of the iterator.
835 835
      Node baseNode(const IncEdgeIt&) const { return INVALID; }
836 836

	
837 837
      /// \brief The running node of the iterator.
838 838
      ///
839 839
      /// Gives back the running node of the iterator.
840 840
      Node runningNode(const IncEdgeIt&) const { return INVALID; }
841 841

	
842 842
      /// @}
843 843

	
844 844
      template <typename _Graph>
845 845
      struct Constraints {
846 846
        void constraints() {
847 847
          checkConcept<IterableDigraphComponent<Base>, _Graph>();
848 848

	
849 849
          {
850 850
            typename _Graph::Node node(INVALID);
851 851
            typename _Graph::Edge edge(INVALID);
852 852
            bool dir;
853 853
            {
854 854
              graph.first(edge);
855 855
              graph.next(edge);
856 856
            }
857 857
            {
858 858
              graph.firstInc(edge, dir, node);
859 859
              graph.nextInc(edge, dir);
860 860
            }
861 861

	
862 862
          }
863 863

	
864 864
          {
865 865
            checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
866 866
              typename _Graph::EdgeIt >();
867 867
            checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
868 868
              typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
869 869

	
870 870
            typename _Graph::Node n;
871 871
            typename _Graph::IncEdgeIt ueit(INVALID);
872 872
            n = graph.baseNode(ueit);
873 873
            n = graph.runningNode(ueit);
874 874
          }
875 875
        }
876 876

	
877 877
        const _Graph& graph;
878 878

	
879 879
      };
880 880
    };
881 881

	
882 882
    /// \brief An empty alteration notifier digraph class.
883 883
    ///
884 884
    /// This class provides beside the core digraph features alteration
885 885
    /// notifier interface for the digraph structure.  This implements
886 886
    /// an observer-notifier pattern for each digraph item. More
887 887
    /// obsevers can be registered into the notifier and whenever an
888 888
    /// alteration occured in the digraph all the observers will
889 889
    /// notified about it.
890 890
    template <typename _Base = BaseDigraphComponent>
891 891
    class AlterableDigraphComponent : public _Base {
892 892
    public:
893 893

	
894 894
      typedef _Base Base;
895 895
      typedef typename Base::Node Node;
896 896
      typedef typename Base::Arc Arc;
897 897

	
898 898

	
899 899
      /// The node observer registry.
900 900
      typedef AlterationNotifier<AlterableDigraphComponent, Node>
901 901
      NodeNotifier;
902 902
      /// The arc observer registry.
903 903
      typedef AlterationNotifier<AlterableDigraphComponent, Arc>
904 904
      ArcNotifier;
905 905

	
906 906
      /// \brief Gives back the node alteration notifier.
907 907
      ///
908 908
      /// Gives back the node alteration notifier.
909 909
      NodeNotifier& notifier(Node) const {
910 910
        return NodeNotifier();
911 911
      }
912 912

	
913 913
      /// \brief Gives back the arc alteration notifier.
914 914
      ///
915 915
      /// Gives back the arc alteration notifier.
916 916
      ArcNotifier& notifier(Arc) const {
917 917
        return ArcNotifier();
918 918
      }
919 919

	
920 920
      template <typename _Digraph>
921 921
      struct Constraints {
922 922
        void constraints() {
923 923
          checkConcept<Base, _Digraph>();
924 924
          typename _Digraph::NodeNotifier& nn
925 925
            = digraph.notifier(typename _Digraph::Node());
926 926

	
927 927
          typename _Digraph::ArcNotifier& en
928 928
            = digraph.notifier(typename _Digraph::Arc());
929 929

	
930 930
          ignore_unused_variable_warning(nn);
931 931
          ignore_unused_variable_warning(en);
932 932
        }
933 933

	
934 934
        const _Digraph& digraph;
935 935

	
936 936
      };
937 937

	
938 938
    };
939 939

	
940 940
    /// \brief An empty alteration notifier undirected graph class.
941 941
    ///
942 942
    /// This class provides beside the core graph features alteration
943 943
    /// notifier interface for the graph structure.  This implements
944 944
    /// an observer-notifier pattern for each graph item. More
945 945
    /// obsevers can be registered into the notifier and whenever an
946 946
    /// alteration occured in the graph all the observers will
947 947
    /// notified about it.
948 948
    template <typename _Base = BaseGraphComponent>
949 949
    class AlterableGraphComponent : public AlterableDigraphComponent<_Base> {
950 950
    public:
951 951

	
952 952
      typedef _Base Base;
953 953
      typedef typename Base::Edge Edge;
954 954

	
955 955

	
956 956
      /// The arc observer registry.
957 957
      typedef AlterationNotifier<AlterableGraphComponent, Edge>
958 958
      EdgeNotifier;
959 959

	
960 960
      /// \brief Gives back the arc alteration notifier.
961 961
      ///
962 962
      /// Gives back the arc alteration notifier.
963 963
      EdgeNotifier& notifier(Edge) const {
964 964
        return EdgeNotifier();
965 965
      }
966 966

	
967 967
      template <typename _Graph>
968 968
      struct Constraints {
969 969
        void constraints() {
970 970
          checkConcept<AlterableGraphComponent<Base>, _Graph>();
971 971
          typename _Graph::EdgeNotifier& uen
972 972
            = graph.notifier(typename _Graph::Edge());
973 973
          ignore_unused_variable_warning(uen);
974 974
        }
975 975

	
976 976
        const _Graph& graph;
977 977

	
978 978
      };
979 979

	
980 980
    };
981 981

	
982 982
    /// \brief Class describing the concept of graph maps
983 983
    ///
984 984
    /// This class describes the common interface of the graph maps
985 985
    /// (NodeMap, ArcMap), that is \ref maps-page "maps" which can be used to
986 986
    /// associate data to graph descriptors (nodes or arcs).
987 987
    template <typename _Graph, typename _Item, typename _Value>
988 988
    class GraphMap : public ReadWriteMap<_Item, _Value> {
989 989
    public:
990 990

	
991 991
      typedef ReadWriteMap<_Item, _Value> Parent;
992 992

	
993 993
      /// The graph type of the map.
994 994
      typedef _Graph Graph;
995 995
      /// The key type of the map.
996 996
      typedef _Item Key;
997 997
      /// The value type of the map.
998 998
      typedef _Value Value;
999 999

	
1000 1000
      /// \brief Construct a new map.
1001 1001
      ///
1002 1002
      /// Construct a new map for the graph.
1003 1003
      explicit GraphMap(const Graph&) {}
1004 1004
      /// \brief Construct a new map with default value.
1005 1005
      ///
1006 1006
      /// Construct a new map for the graph and initalise the values.
1007 1007
      GraphMap(const Graph&, const Value&) {}
1008

	
1009
    private:
1008 1010
      /// \brief Copy constructor.
1009 1011
      ///
1010 1012
      /// Copy Constructor.
1011 1013
      GraphMap(const GraphMap&) : Parent() {}
1012 1014

	
1013 1015
      /// \brief Assign operator.
1014 1016
      ///
1015 1017
      /// Assign operator. It does not mofify the underlying graph,
1016 1018
      /// it just iterates on the current item set and set the  map
1017 1019
      /// with the value returned by the assigned map.
1018 1020
      template <typename CMap>
1019 1021
      GraphMap& operator=(const CMap&) {
1020 1022
        checkConcept<ReadMap<Key, Value>, CMap>();
1021 1023
        return *this;
1022 1024
      }
1023 1025

	
1026
    public:
1024 1027
      template<typename _Map>
1025 1028
      struct Constraints {
1026 1029
        void constraints() {
1027 1030
          checkConcept<ReadWriteMap<Key, Value>, _Map >();
1028 1031
          // Construction with a graph parameter
1029 1032
          _Map a(g);
1030 1033
          // Constructor with a graph and a default value parameter
1031 1034
          _Map a2(g,t);
1032 1035
          // Copy constructor.
1033
          _Map b(c);
1036
          // _Map b(c);
1034 1037

	
1035
          ReadMap<Key, Value> cmap;
1036
          b = cmap;
1038
          // ReadMap<Key, Value> cmap;
1039
          // b = cmap;
1037 1040

	
1041
          ignore_unused_variable_warning(a);
1038 1042
          ignore_unused_variable_warning(a2);
1039
          ignore_unused_variable_warning(b);
1043
          // ignore_unused_variable_warning(b);
1040 1044
        }
1041 1045

	
1042 1046
        const _Map &c;
1043 1047
        const Graph &g;
1044 1048
        const typename GraphMap::Value &t;
1045 1049
      };
1046 1050

	
1047 1051
    };
1048 1052

	
1049 1053
    /// \brief An empty mappable digraph class.
1050 1054
    ///
1051 1055
    /// This class provides beside the core digraph features
1052 1056
    /// map interface for the digraph structure.
1053 1057
    /// This concept is part of the Digraph concept.
1054 1058
    template <typename _Base = BaseDigraphComponent>
1055 1059
    class MappableDigraphComponent : public _Base  {
1056 1060
    public:
1057 1061

	
1058 1062
      typedef _Base Base;
1059 1063
      typedef typename Base::Node Node;
1060 1064
      typedef typename Base::Arc Arc;
1061 1065

	
1062 1066
      typedef MappableDigraphComponent Digraph;
1063 1067

	
1064 1068
      /// \brief ReadWrite map of the nodes.
1065 1069
      ///
1066 1070
      /// ReadWrite map of the nodes.
1067 1071
      ///
1068 1072
      template <typename _Value>
1069 1073
      class NodeMap : public GraphMap<Digraph, Node, _Value> {
1070 1074
      public:
1071 1075
        typedef GraphMap<MappableDigraphComponent, Node, _Value> Parent;
1072 1076

	
1073 1077
        /// \brief Construct a new map.
1074 1078
        ///
1075 1079
        /// Construct a new map for the digraph.
1076 1080
        explicit NodeMap(const MappableDigraphComponent& digraph)
1077 1081
          : Parent(digraph) {}
1078 1082

	
1079 1083
        /// \brief Construct a new map with default value.
1080 1084
        ///
1081 1085
        /// Construct a new map for the digraph and initalise the values.
1082 1086
        NodeMap(const MappableDigraphComponent& digraph, const _Value& value)
1083 1087
          : Parent(digraph, value) {}
1084 1088

	
1089
      private:
1085 1090
        /// \brief Copy constructor.
1086 1091
        ///
1087 1092
        /// Copy Constructor.
1088 1093
        NodeMap(const NodeMap& nm) : Parent(nm) {}
1089 1094

	
1090 1095
        /// \brief Assign operator.
1091 1096
        ///
1092 1097
        /// Assign operator.
1093 1098
        template <typename CMap>
1094 1099
        NodeMap& operator=(const CMap&) {
1095 1100
          checkConcept<ReadMap<Node, _Value>, CMap>();
1096 1101
          return *this;
1097 1102
        }
1098 1103

	
1099 1104
      };
1100 1105

	
1101 1106
      /// \brief ReadWrite map of the arcs.
1102 1107
      ///
1103 1108
      /// ReadWrite map of the arcs.
1104 1109
      ///
1105 1110
      template <typename _Value>
1106 1111
      class ArcMap : public GraphMap<Digraph, Arc, _Value> {
1107 1112
      public:
1108 1113
        typedef GraphMap<MappableDigraphComponent, Arc, _Value> Parent;
1109 1114

	
1110 1115
        /// \brief Construct a new map.
1111 1116
        ///
1112 1117
        /// Construct a new map for the digraph.
1113 1118
        explicit ArcMap(const MappableDigraphComponent& digraph)
1114 1119
          : Parent(digraph) {}
1115 1120

	
1116 1121
        /// \brief Construct a new map with default value.
1117 1122
        ///
1118 1123
        /// Construct a new map for the digraph and initalise the values.
1119 1124
        ArcMap(const MappableDigraphComponent& digraph, const _Value& value)
1120 1125
          : Parent(digraph, value) {}
1121 1126

	
1127
      private:
1122 1128
        /// \brief Copy constructor.
1123 1129
        ///
1124 1130
        /// Copy Constructor.
1125 1131
        ArcMap(const ArcMap& nm) : Parent(nm) {}
1126 1132

	
1127 1133
        /// \brief Assign operator.
1128 1134
        ///
1129 1135
        /// Assign operator.
1130 1136
        template <typename CMap>
1131 1137
        ArcMap& operator=(const CMap&) {
1132 1138
          checkConcept<ReadMap<Arc, _Value>, CMap>();
1133 1139
          return *this;
1134 1140
        }
1135 1141

	
1136 1142
      };
1137 1143

	
1138 1144

	
1139 1145
      template <typename _Digraph>
1140 1146
      struct Constraints {
1141 1147

	
1142 1148
        struct Dummy {
1143 1149
          int value;
1144 1150
          Dummy() : value(0) {}
1145 1151
          Dummy(int _v) : value(_v) {}
1146 1152
        };
1147 1153

	
1148 1154
        void constraints() {
1149 1155
          checkConcept<Base, _Digraph>();
1150 1156
          { // int map test
1151 1157
            typedef typename _Digraph::template NodeMap<int> IntNodeMap;
1152 1158
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>,
1153 1159
              IntNodeMap >();
1154 1160
          } { // bool map test
1155 1161
            typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
1156 1162
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
1157 1163
              BoolNodeMap >();
1158 1164
          } { // Dummy map test
1159 1165
            typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
1160 1166
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
1161 1167
              DummyNodeMap >();
1162 1168
          }
1163 1169

	
1164 1170
          { // int map test
1165 1171
            typedef typename _Digraph::template ArcMap<int> IntArcMap;
1166 1172
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
1167 1173
              IntArcMap >();
1168 1174
          } { // bool map test
1169 1175
            typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
1170 1176
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
1171 1177
              BoolArcMap >();
1172 1178
          } { // Dummy map test
1173 1179
            typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
1174 1180
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
1175 1181
              DummyArcMap >();
1176 1182
          }
1177 1183
        }
1178 1184

	
1179 1185
        _Digraph& digraph;
1180 1186
      };
1181 1187
    };
1182 1188

	
1183 1189
    /// \brief An empty mappable base bipartite graph class.
1184 1190
    ///
1185 1191
    /// This class provides beside the core graph features
1186 1192
    /// map interface for the graph structure.
1187 1193
    /// This concept is part of the Graph concept.
1188 1194
    template <typename _Base = BaseGraphComponent>
1189 1195
    class MappableGraphComponent : public MappableDigraphComponent<_Base>  {
1190 1196
    public:
1191 1197

	
1192 1198
      typedef _Base Base;
1193 1199
      typedef typename Base::Edge Edge;
1194 1200

	
1195 1201
      typedef MappableGraphComponent Graph;
1196 1202

	
1197 1203
      /// \brief ReadWrite map of the edges.
1198 1204
      ///
1199 1205
      /// ReadWrite map of the edges.
1200 1206
      ///
1201 1207
      template <typename _Value>
1202 1208
      class EdgeMap : public GraphMap<Graph, Edge, _Value> {
1203 1209
      public:
1204 1210
        typedef GraphMap<MappableGraphComponent, Edge, _Value> Parent;
1205 1211

	
1206 1212
        /// \brief Construct a new map.
1207 1213
        ///
1208 1214
        /// Construct a new map for the graph.
1209 1215
        explicit EdgeMap(const MappableGraphComponent& graph)
1210 1216
          : Parent(graph) {}
1211 1217

	
1212 1218
        /// \brief Construct a new map with default value.
1213 1219
        ///
1214 1220
        /// Construct a new map for the graph and initalise the values.
1215 1221
        EdgeMap(const MappableGraphComponent& graph, const _Value& value)
1216 1222
          : Parent(graph, value) {}
1217 1223

	
1224
      private:
1218 1225
        /// \brief Copy constructor.
1219 1226
        ///
1220 1227
        /// Copy Constructor.
1221 1228
        EdgeMap(const EdgeMap& nm) : Parent(nm) {}
1222 1229

	
1223 1230
        /// \brief Assign operator.
1224 1231
        ///
1225 1232
        /// Assign operator.
1226 1233
        template <typename CMap>
1227 1234
        EdgeMap& operator=(const CMap&) {
1228 1235
          checkConcept<ReadMap<Edge, _Value>, CMap>();
1229 1236
          return *this;
1230 1237
        }
1231 1238

	
1232 1239
      };
1233 1240

	
1234 1241

	
1235 1242
      template <typename _Graph>
1236 1243
      struct Constraints {
1237 1244

	
1238 1245
        struct Dummy {
1239 1246
          int value;
1240 1247
          Dummy() : value(0) {}
1241 1248
          Dummy(int _v) : value(_v) {}
1242 1249
        };
1243 1250

	
1244 1251
        void constraints() {
1245 1252
          checkConcept<MappableGraphComponent<Base>, _Graph>();
1246 1253

	
1247 1254
          { // int map test
1248 1255
            typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
1249 1256
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
1250 1257
              IntEdgeMap >();
1251 1258
          } { // bool map test
1252 1259
            typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
1253 1260
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
1254 1261
              BoolEdgeMap >();
1255 1262
          } { // Dummy map test
1256 1263
            typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
1257 1264
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
1258 1265
              DummyEdgeMap >();
1259 1266
          }
1260 1267
        }
1261 1268

	
1262 1269
        _Graph& graph;
1263 1270
      };
1264 1271
    };
1265 1272

	
1266 1273
    /// \brief An empty extendable digraph class.
1267 1274
    ///
1268 1275
    /// This class provides beside the core digraph features digraph
1269 1276
    /// extendable interface for the digraph structure.  The main
1270 1277
    /// difference between the base and this interface is that the
1271 1278
    /// digraph alterations should handled already on this level.
1272 1279
    template <typename _Base = BaseDigraphComponent>
1273 1280
    class ExtendableDigraphComponent : public _Base {
1274 1281
    public:
1275 1282
      typedef _Base Base;
1276 1283

	
1277 1284
      typedef typename _Base::Node Node;
1278 1285
      typedef typename _Base::Arc Arc;
1279 1286

	
1280 1287
      /// \brief Adds a new node to the digraph.
1281 1288
      ///
1282 1289
      /// Adds a new node to the digraph.
1283 1290
      ///
1284 1291
      Node addNode() {
1285 1292
        return INVALID;
1286 1293
      }
1287 1294

	
1288 1295
      /// \brief Adds a new arc connects the given two nodes.
1289 1296
      ///
1290 1297
      /// Adds a new arc connects the the given two nodes.
1291 1298
      Arc addArc(const Node&, const Node&) {
1292 1299
        return INVALID;
1293 1300
      }
1294 1301

	
1295 1302
      template <typename _Digraph>
1296 1303
      struct Constraints {
1297 1304
        void constraints() {
1298 1305
          checkConcept<Base, _Digraph>();
1299 1306
          typename _Digraph::Node node_a, node_b;
1300 1307
          node_a = digraph.addNode();
1301 1308
          node_b = digraph.addNode();
1302 1309
          typename _Digraph::Arc arc;
1303 1310
          arc = digraph.addArc(node_a, node_b);
1304 1311
        }
1305 1312

	
1306 1313
        _Digraph& digraph;
1307 1314
      };
1308 1315
    };
1309 1316

	
1310 1317
    /// \brief An empty extendable base undirected graph class.
1311 1318
    ///
1312 1319
    /// This class provides beside the core undirected graph features
1313 1320
    /// core undircted graph extend interface for the graph structure.
1314 1321
    /// The main difference between the base and this interface is
1315 1322
    /// that the graph alterations should handled already on this
1316 1323
    /// level.
1317 1324
    template <typename _Base = BaseGraphComponent>
1318 1325
    class ExtendableGraphComponent : public _Base {
1319 1326
    public:
1320 1327

	
1321 1328
      typedef _Base Base;
1322 1329
      typedef typename _Base::Node Node;
1323 1330
      typedef typename _Base::Edge Edge;
1324 1331

	
1325 1332
      /// \brief Adds a new node to the graph.
1326 1333
      ///
1327 1334
      /// Adds a new node to the graph.
1328 1335
      ///
1329 1336
      Node addNode() {
1330 1337
        return INVALID;
1331 1338
      }
1332 1339

	
1333 1340
      /// \brief Adds a new arc connects the given two nodes.
1334 1341
      ///
1335 1342
      /// Adds a new arc connects the the given two nodes.
1336 1343
      Edge addArc(const Node&, const Node&) {
1337 1344
        return INVALID;
1338 1345
      }
1339 1346

	
1340 1347
      template <typename _Graph>
1341 1348
      struct Constraints {
1342 1349
        void constraints() {
1343 1350
          checkConcept<Base, _Graph>();
1344 1351
          typename _Graph::Node node_a, node_b;
1345 1352
          node_a = graph.addNode();
1346 1353
          node_b = graph.addNode();
1347 1354
          typename _Graph::Edge edge;
1348 1355
          edge = graph.addEdge(node_a, node_b);
1349 1356
        }
1350 1357

	
1351 1358
        _Graph& graph;
1352 1359
      };
1353 1360
    };
1354 1361

	
1355 1362
    /// \brief An empty erasable digraph class.
1356 1363
    ///
1357 1364
    /// This class provides beside the core digraph features core erase
1358 1365
    /// functions for the digraph structure. The main difference between
1359 1366
    /// the base and this interface is that the digraph alterations
1360 1367
    /// should handled already on this level.
1361 1368
    template <typename _Base = BaseDigraphComponent>
1362 1369
    class ErasableDigraphComponent : public _Base {
1363 1370
    public:
1364 1371

	
1365 1372
      typedef _Base Base;
1366 1373
      typedef typename Base::Node Node;
1367 1374
      typedef typename Base::Arc Arc;
1368 1375

	
1369 1376
      /// \brief Erase a node from the digraph.
1370 1377
      ///
1371 1378
      /// Erase a node from the digraph. This function should
1372 1379
      /// erase all arcs connecting to the node.
1373 1380
      void erase(const Node&) {}
1374 1381

	
1375 1382
      /// \brief Erase an arc from the digraph.
1376 1383
      ///
1377 1384
      /// Erase an arc from the digraph.
1378 1385
      ///
1379 1386
      void erase(const Arc&) {}
1380 1387

	
1381 1388
      template <typename _Digraph>
1382 1389
      struct Constraints {
1383 1390
        void constraints() {
1384 1391
          checkConcept<Base, _Digraph>();
1385 1392
          typename _Digraph::Node node;
1386 1393
          digraph.erase(node);
1387 1394
          typename _Digraph::Arc arc;
1388 1395
          digraph.erase(arc);
1389 1396
        }
1390 1397

	
1391 1398
        _Digraph& digraph;
1392 1399
      };
1393 1400
    };
1394 1401

	
1395 1402
    /// \brief An empty erasable base undirected graph class.
1396 1403
    ///
1397 1404
    /// This class provides beside the core undirected graph features
1398 1405
    /// core erase functions for the undirceted graph structure. The
1399 1406
    /// main difference between the base and this interface is that
1400 1407
    /// the graph alterations should handled already on this level.
1401 1408
    template <typename _Base = BaseGraphComponent>
1402 1409
    class ErasableGraphComponent : public _Base {
1403 1410
    public:
1404 1411

	
1405 1412
      typedef _Base Base;
1406 1413
      typedef typename Base::Node Node;
1407 1414
      typedef typename Base::Edge Edge;
1408 1415

	
1409 1416
      /// \brief Erase a node from the graph.
1410 1417
      ///
1411 1418
      /// Erase a node from the graph. This function should erase
1412 1419
      /// arcs connecting to the node.
1413 1420
      void erase(const Node&) {}
1414 1421

	
1415 1422
      /// \brief Erase an arc from the graph.
1416 1423
      ///
1417 1424
      /// Erase an arc from the graph.
1418 1425
      ///
1419 1426
      void erase(const Edge&) {}
1420 1427

	
1421 1428
      template <typename _Graph>
1422 1429
      struct Constraints {
1423 1430
        void constraints() {
1424 1431
          checkConcept<Base, _Graph>();
1425 1432
          typename _Graph::Node node;
1426 1433
          graph.erase(node);
1427 1434
          typename _Graph::Edge edge;
1428 1435
          graph.erase(edge);
1429 1436
        }
1430 1437

	
1431 1438
        _Graph& graph;
1432 1439
      };
1433 1440
    };
1434 1441

	
1435 1442
    /// \brief An empty clearable base digraph class.
1436 1443
    ///
1437 1444
    /// This class provides beside the core digraph features core clear
1438 1445
    /// functions for the digraph structure. The main difference between
1439 1446
    /// the base and this interface is that the digraph alterations
1440 1447
    /// should handled already on this level.
1441 1448
    template <typename _Base = BaseDigraphComponent>
1442 1449
    class ClearableDigraphComponent : public _Base {
1443 1450
    public:
1444 1451

	
1445 1452
      typedef _Base Base;
1446 1453

	
1447 1454
      /// \brief Erase all nodes and arcs from the digraph.
1448 1455
      ///
1449 1456
      /// Erase all nodes and arcs from the digraph.
1450 1457
      ///
1451 1458
      void clear() {}
1452 1459

	
1453 1460
      template <typename _Digraph>
1454 1461
      struct Constraints {
1455 1462
        void constraints() {
1456 1463
          checkConcept<Base, _Digraph>();
1457 1464
          digraph.clear();
1458 1465
        }
1459 1466

	
1460 1467
        _Digraph digraph;
1461 1468
      };
1462 1469
    };
1463 1470

	
1464 1471
    /// \brief An empty clearable base undirected graph class.
1465 1472
    ///
1466 1473
    /// This class provides beside the core undirected graph features
1467 1474
    /// core clear functions for the undirected graph structure. The
1468 1475
    /// main difference between the base and this interface is that
1469 1476
    /// the graph alterations should handled already on this level.
1470 1477
    template <typename _Base = BaseGraphComponent>
1471 1478
    class ClearableGraphComponent : public ClearableDigraphComponent<_Base> {
1472 1479
    public:
1473 1480

	
1474 1481
      typedef _Base Base;
1475 1482

	
1476 1483
      template <typename _Graph>
1477 1484
      struct Constraints {
1478 1485
        void constraints() {
1479 1486
          checkConcept<ClearableGraphComponent<Base>, _Graph>();
1480 1487
        }
1481 1488

	
1482 1489
        _Graph graph;
1483 1490
      };
1484 1491
    };
1485 1492

	
1486 1493
  }
1487 1494

	
1488 1495
}
1489 1496

	
1490 1497
#endif
Show white space 3072 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-2008
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
#ifndef LEMON_TEST_GRAPH_TEST_H
20 20
#define LEMON_TEST_GRAPH_TEST_H
21 21

	
22 22
#include <set>
23 23

	
24 24
#include <lemon/core.h>
25 25
#include <lemon/maps.h>
26 26

	
27 27
#include "test_tools.h"
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  template<class Graph>
32 32
  void checkGraphNodeList(const Graph &G, int cnt)
33 33
  {
34 34
    typename Graph::NodeIt n(G);
35 35
    for(int i=0;i<cnt;i++) {
36 36
      check(n!=INVALID,"Wrong Node list linking.");
37 37
      ++n;
38 38
    }
39 39
    check(n==INVALID,"Wrong Node list linking.");
40 40
    check(countNodes(G)==cnt,"Wrong Node number.");
41 41
  }
42 42

	
43 43
  template<class Graph>
44 44
  void checkGraphArcList(const Graph &G, int cnt)
45 45
  {
46 46
    typename Graph::ArcIt e(G);
47 47
    for(int i=0;i<cnt;i++) {
48 48
      check(e!=INVALID,"Wrong Arc list linking.");
49 49
      check(G.oppositeNode(G.source(e), e) == G.target(e),
50 50
            "Wrong opposite node");
51 51
      check(G.oppositeNode(G.target(e), e) == G.source(e),
52 52
            "Wrong opposite node");
53 53
      ++e;
54 54
    }
55 55
    check(e==INVALID,"Wrong Arc list linking.");
56 56
    check(countArcs(G)==cnt,"Wrong Arc number.");
57 57
  }
58 58

	
59 59
  template<class Graph>
60 60
  void checkGraphOutArcList(const Graph &G, typename Graph::Node n, int cnt)
61 61
  {
62 62
    typename Graph::OutArcIt e(G,n);
63 63
    for(int i=0;i<cnt;i++) {
64 64
      check(e!=INVALID,"Wrong OutArc list linking.");
65 65
      check(n==G.source(e),"Wrong OutArc list linking.");
66 66
      check(n==G.baseNode(e),"Wrong OutArc list linking.");
67 67
      check(G.target(e)==G.runningNode(e),"Wrong OutArc list linking.");
68 68
      ++e;
69 69
    }
70 70
    check(e==INVALID,"Wrong OutArc list linking.");
71 71
    check(countOutArcs(G,n)==cnt,"Wrong OutArc number.");
72 72
  }
73 73

	
74 74
  template<class Graph>
75 75
  void checkGraphInArcList(const Graph &G, typename Graph::Node n, int cnt)
76 76
  {
77 77
    typename Graph::InArcIt e(G,n);
78 78
    for(int i=0;i<cnt;i++) {
79 79
      check(e!=INVALID,"Wrong InArc list linking.");
80 80
      check(n==G.target(e),"Wrong InArc list linking.");
81 81
      check(n==G.baseNode(e),"Wrong OutArc list linking.");
82 82
      check(G.source(e)==G.runningNode(e),"Wrong OutArc list linking.");
83 83
      ++e;
84 84
    }
85 85
    check(e==INVALID,"Wrong InArc list linking.");
86 86
    check(countInArcs(G,n)==cnt,"Wrong InArc number.");
87 87
  }
88 88

	
89 89
  template<class Graph>
90 90
  void checkGraphEdgeList(const Graph &G, int cnt)
91 91
  {
92 92
    typename Graph::EdgeIt e(G);
93 93
    for(int i=0;i<cnt;i++) {
94 94
      check(e!=INVALID,"Wrong Edge list linking.");
95 95
      check(G.oppositeNode(G.u(e), e) == G.v(e), "Wrong opposite node");
96 96
      check(G.oppositeNode(G.v(e), e) == G.u(e), "Wrong opposite node");
97 97
      ++e;
98 98
    }
99 99
    check(e==INVALID,"Wrong Edge list linking.");
100 100
    check(countEdges(G)==cnt,"Wrong Edge number.");
101 101
  }
102 102

	
103 103
  template<class Graph>
104 104
  void checkGraphIncEdgeList(const Graph &G, typename Graph::Node n, int cnt)
105 105
  {
106 106
    typename Graph::IncEdgeIt e(G,n);
107 107
    for(int i=0;i<cnt;i++) {
108 108
      check(e!=INVALID,"Wrong IncEdge list linking.");
109 109
      check(n==G.u(e) || n==G.v(e),"Wrong IncEdge list linking.");
110 110
      check(n==G.baseNode(e),"Wrong OutArc list linking.");
111 111
      check(G.u(e)==G.runningNode(e) || G.v(e)==G.runningNode(e),
112 112
            "Wrong OutArc list linking.");
113 113
      ++e;
114 114
    }
115 115
    check(e==INVALID,"Wrong IncEdge list linking.");
116 116
    check(countIncEdges(G,n)==cnt,"Wrong IncEdge number.");
117 117
  }
118 118

	
119 119
  template <class Graph>
120 120
  void checkGraphConArcList(const Graph &G, int cnt) {
121 121
    int i = 0;
122 122
    for (typename Graph::NodeIt u(G); u != INVALID; ++u) {
123 123
      for (typename Graph::NodeIt v(G); v != INVALID; ++v) {
124 124
        for (ConArcIt<Graph> a(G, u, v); a != INVALID; ++a) {
125 125
          check(G.source(a) == u, "Wrong iterator.");
126 126
          check(G.target(a) == v, "Wrong iterator.");
127 127
          ++i;
128 128
        }
129 129
      }
130 130
    }
131 131
    check(cnt == i, "Wrong iterator.");
132 132
  }
133 133

	
134 134
  template <class Graph>
135 135
  void checkGraphConEdgeList(const Graph &G, int cnt) {
136 136
    int i = 0;
137 137
    for (typename Graph::NodeIt u(G); u != INVALID; ++u) {
138 138
      for (typename Graph::NodeIt v(G); v != INVALID; ++v) {
139 139
        for (ConEdgeIt<Graph> e(G, u, v); e != INVALID; ++e) {
140 140
          check((G.u(e) == u && G.v(e) == v) ||
141 141
                (G.u(e) == v && G.v(e) == u), "Wrong iterator.");
142 142
          i += u == v ? 2 : 1;
143 143
        }
144 144
      }
145 145
    }
146 146
    check(2 * cnt == i, "Wrong iterator.");
147 147
  }
148 148

	
149 149
  template <typename Graph>
150 150
  void checkArcDirections(const Graph& G) {
151 151
    for (typename Graph::ArcIt a(G); a != INVALID; ++a) {
152 152
      check(G.source(a) == G.target(G.oppositeArc(a)), "Wrong direction");
153 153
      check(G.target(a) == G.source(G.oppositeArc(a)), "Wrong direction");
154 154
      check(G.direct(a, G.direction(a)) == a, "Wrong direction");
155 155
    }
156 156
  }
157 157

	
158 158
  template <typename Graph>
159 159
  void checkNodeIds(const Graph& G) {
160 160
    std::set<int> values;
161 161
    for (typename Graph::NodeIt n(G); n != INVALID; ++n) {
162 162
      check(G.nodeFromId(G.id(n)) == n, "Wrong id");
163 163
      check(values.find(G.id(n)) == values.end(), "Wrong id");
164 164
      check(G.id(n) <= G.maxNodeId(), "Wrong maximum id");
165 165
      values.insert(G.id(n));
166 166
    }
167 167
  }
168 168

	
169 169
  template <typename Graph>
170 170
  void checkArcIds(const Graph& G) {
171 171
    std::set<int> values;
172 172
    for (typename Graph::ArcIt a(G); a != INVALID; ++a) {
173 173
      check(G.arcFromId(G.id(a)) == a, "Wrong id");
174 174
      check(values.find(G.id(a)) == values.end(), "Wrong id");
175 175
      check(G.id(a) <= G.maxArcId(), "Wrong maximum id");
176 176
      values.insert(G.id(a));
177 177
    }
178 178
  }
179 179

	
180 180
  template <typename Graph>
181 181
  void checkEdgeIds(const Graph& G) {
182 182
    std::set<int> values;
183 183
    for (typename Graph::EdgeIt e(G); e != INVALID; ++e) {
184 184
      check(G.edgeFromId(G.id(e)) == e, "Wrong id");
185 185
      check(values.find(G.id(e)) == values.end(), "Wrong id");
186 186
      check(G.id(e) <= G.maxEdgeId(), "Wrong maximum id");
187 187
      values.insert(G.id(e));
188 188
    }
189 189
  }
190 190

	
191 191
  template <typename Graph>
192 192
  void checkGraphNodeMap(const Graph& G) {
193 193
    typedef typename Graph::Node Node;
194 194
    typedef typename Graph::NodeIt NodeIt;
195 195

	
196 196
    typedef typename Graph::template NodeMap<int> IntNodeMap;
197 197
    IntNodeMap map(G, 42);
198 198
    for (NodeIt it(G); it != INVALID; ++it) {
199 199
      check(map[it] == 42, "Wrong map constructor.");
200 200
    }
201 201
    int s = 0;
202 202
    for (NodeIt it(G); it != INVALID; ++it) {
203 203
      map[it] = 0;
204 204
      check(map[it] == 0, "Wrong operator[].");
205 205
      map.set(it, s);
206 206
      check(map[it] == s, "Wrong set.");
207 207
      ++s;
208 208
    }
209 209
    s = s * (s - 1) / 2;
210 210
    for (NodeIt it(G); it != INVALID; ++it) {
211 211
      s -= map[it];
212 212
    }
213 213
    check(s == 0, "Wrong sum.");
214 214

	
215
    map = constMap<Node>(12);
216
    for (NodeIt it(G); it != INVALID; ++it) {
217
      check(map[it] == 12, "Wrong operator[].");
218
    }
215
    // map = constMap<Node>(12);
216
    // for (NodeIt it(G); it != INVALID; ++it) {
217
    //   check(map[it] == 12, "Wrong operator[].");
218
    // }
219 219
  }
220 220

	
221 221
  template <typename Graph>
222 222
  void checkGraphArcMap(const Graph& G) {
223 223
    typedef typename Graph::Arc Arc;
224 224
    typedef typename Graph::ArcIt ArcIt;
225 225

	
226 226
    typedef typename Graph::template ArcMap<int> IntArcMap;
227 227
    IntArcMap map(G, 42);
228 228
    for (ArcIt it(G); it != INVALID; ++it) {
229 229
      check(map[it] == 42, "Wrong map constructor.");
230 230
    }
231 231
    int s = 0;
232 232
    for (ArcIt it(G); it != INVALID; ++it) {
233 233
      map[it] = 0;
234 234
      check(map[it] == 0, "Wrong operator[].");
235 235
      map.set(it, s);
236 236
      check(map[it] == s, "Wrong set.");
237 237
      ++s;
238 238
    }
239 239
    s = s * (s - 1) / 2;
240 240
    for (ArcIt it(G); it != INVALID; ++it) {
241 241
      s -= map[it];
242 242
    }
243 243
    check(s == 0, "Wrong sum.");
244 244

	
245
    map = constMap<Arc>(12);
246
    for (ArcIt it(G); it != INVALID; ++it) {
247
      check(map[it] == 12, "Wrong operator[].");
248
    }
245
    // map = constMap<Arc>(12);
246
    // for (ArcIt it(G); it != INVALID; ++it) {
247
    //   check(map[it] == 12, "Wrong operator[].");
248
    // }
249 249
  }
250 250

	
251 251
  template <typename Graph>
252 252
  void checkGraphEdgeMap(const Graph& G) {
253 253
    typedef typename Graph::Edge Edge;
254 254
    typedef typename Graph::EdgeIt EdgeIt;
255 255

	
256 256
    typedef typename Graph::template EdgeMap<int> IntEdgeMap;
257 257
    IntEdgeMap map(G, 42);
258 258
    for (EdgeIt it(G); it != INVALID; ++it) {
259 259
      check(map[it] == 42, "Wrong map constructor.");
260 260
    }
261 261
    int s = 0;
262 262
    for (EdgeIt it(G); it != INVALID; ++it) {
263 263
      map[it] = 0;
264 264
      check(map[it] == 0, "Wrong operator[].");
265 265
      map.set(it, s);
266 266
      check(map[it] == s, "Wrong set.");
267 267
      ++s;
268 268
    }
269 269
    s = s * (s - 1) / 2;
270 270
    for (EdgeIt it(G); it != INVALID; ++it) {
271 271
      s -= map[it];
272 272
    }
273 273
    check(s == 0, "Wrong sum.");
274 274

	
275
    map = constMap<Edge>(12);
276
    for (EdgeIt it(G); it != INVALID; ++it) {
277
      check(map[it] == 12, "Wrong operator[].");
278
    }
275
    // map = constMap<Edge>(12);
276
    // for (EdgeIt it(G); it != INVALID; ++it) {
277
    //   check(map[it] == 12, "Wrong operator[].");
278
    // }
279 279
  }
280 280

	
281 281

	
282 282
} //namespace lemon
283 283

	
284 284
#endif
0 comments (0 inline)