gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Standard graph maps are required to be reference maps (#190)
0 5 0
default
5 files changed with 44 insertions and 28 deletions:
↑ Collapse diff ↑
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
20 20
#define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
21 21

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

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

	
27 25
namespace lemon {
28 26

	
29 27
  template <typename _Digraph>
30 28
  class DigraphAdaptorExtender : public _Digraph {
31 29
  public:
32 30

	
33 31
    typedef _Digraph Parent;
34 32
    typedef _Digraph Digraph;
35 33
    typedef DigraphAdaptorExtender Adaptor;
36 34

	
37 35
    // Base extensions
38 36

	
39 37
    typedef typename Parent::Node Node;
40 38
    typedef typename Parent::Arc Arc;
41 39

	
42 40
    int maxId(Node) const {
43 41
      return Parent::maxNodeId();
44 42
    }
45 43

	
46 44
    int maxId(Arc) const {
47 45
      return Parent::maxArcId();
48 46
    }
49 47

	
50 48
    Node fromId(int id, Node) const {
51 49
      return Parent::nodeFromId(id);
52 50
    }
53 51

	
54 52
    Arc fromId(int id, Arc) const {
55 53
      return Parent::arcFromId(id);
56 54
    }
57 55

	
58 56
    Node oppositeNode(const Node &n, const Arc &e) const {
59 57
      if (n == Parent::source(e))
60 58
        return Parent::target(e);
61 59
      else if(n==Parent::target(e))
62 60
        return Parent::source(e);
63 61
      else
64 62
        return INVALID;
65 63
    }
66 64

	
67 65
    class NodeIt : public Node {
68 66
      const Adaptor* _adaptor;
69 67
    public:
70 68

	
71 69
      NodeIt() {}
72 70

	
73 71
      NodeIt(Invalid i) : Node(i) { }
74 72

	
75 73
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
76 74
        _adaptor->first(static_cast<Node&>(*this));
77 75
      }
78 76

	
79 77
      NodeIt(const Adaptor& adaptor, const Node& node)
80 78
        : Node(node), _adaptor(&adaptor) {}
81 79

	
82 80
      NodeIt& operator++() {
83 81
        _adaptor->next(*this);
84 82
        return *this;
85 83
      }
86 84

	
87 85
    };
88 86

	
89 87

	
90 88
    class ArcIt : public Arc {
91 89
      const Adaptor* _adaptor;
92 90
    public:
93 91

	
94 92
      ArcIt() { }
95 93

	
96 94
      ArcIt(Invalid i) : Arc(i) { }
97 95

	
98 96
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
99 97
        _adaptor->first(static_cast<Arc&>(*this));
100 98
      }
101 99

	
102 100
      ArcIt(const Adaptor& adaptor, const Arc& e) :
103 101
        Arc(e), _adaptor(&adaptor) { }
104 102

	
105 103
      ArcIt& operator++() {
106 104
        _adaptor->next(*this);
107 105
        return *this;
108 106
      }
109 107

	
110 108
    };
111 109

	
112 110

	
113 111
    class OutArcIt : public Arc {
114 112
      const Adaptor* _adaptor;
115 113
    public:
116 114

	
117 115
      OutArcIt() { }
118 116

	
119 117
      OutArcIt(Invalid i) : Arc(i) { }
120 118

	
121 119
      OutArcIt(const Adaptor& adaptor, const Node& node)
122 120
        : _adaptor(&adaptor) {
123 121
        _adaptor->firstOut(*this, node);
124 122
      }
125 123

	
126 124
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
127 125
        : Arc(arc), _adaptor(&adaptor) {}
128 126

	
129 127
      OutArcIt& operator++() {
130 128
        _adaptor->nextOut(*this);
131 129
        return *this;
132 130
      }
133 131

	
134 132
    };
135 133

	
136 134

	
137 135
    class InArcIt : public Arc {
138 136
      const Adaptor* _adaptor;
139 137
    public:
140 138

	
141 139
      InArcIt() { }
142 140

	
143 141
      InArcIt(Invalid i) : Arc(i) { }
144 142

	
145 143
      InArcIt(const Adaptor& adaptor, const Node& node)
146 144
        : _adaptor(&adaptor) {
147 145
        _adaptor->firstIn(*this, node);
148 146
      }
149 147

	
150 148
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
151 149
        Arc(arc), _adaptor(&adaptor) {}
152 150

	
153 151
      InArcIt& operator++() {
154 152
        _adaptor->nextIn(*this);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#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
    typedef typename Parent::Reference Reference;
51
    typedef typename Parent::ConstReference ConstReference;
50 52

	
51 53
    class MapIt;
52 54
    class ConstMapIt;
53 55

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

	
57 59
  public:
58 60

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

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

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

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

	
76 78
  public:
77 79
    class MapIt : public Item {
78 80
    public:
79 81

	
80 82
      typedef Item Parent;
81 83
      typedef typename Map::Value Value;
82 84

	
83 85
      MapIt() {}
84 86

	
85 87
      MapIt(Invalid i) : Parent(i) { }
86 88

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

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

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

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

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

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

	
111 113
    protected:
112 114
      Map& map;
113 115

	
114 116
    };
115 117

	
116 118
    class ConstMapIt : public Item {
117 119
    public:
118 120

	
119 121
      typedef Item Parent;
120 122

	
121 123
      typedef typename Map::Value Value;
122 124

	
123 125
      ConstMapIt() {}
124 126

	
125 127
      ConstMapIt(Invalid i) : Parent(i) { }
126 128

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

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

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

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

	
143 145
    protected:
144 146
      const Map& map;
145 147
    };
146 148

	
147 149
    class ItemIt : public Item {
148 150
    public:
149 151

	
150 152
      typedef Item Parent;
151 153

	
152 154
      ItemIt() {}
153 155

	
154 156
      ItemIt(Invalid i) : Parent(i) { }
155 157

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

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

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

	
168 170
    protected:
169 171
      const Map& map;
170 172

	
171 173
    };
172 174
  };
173 175

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

	
181 183
    typedef _Map Parent;
182 184
    typedef SubMapExtender Map;
183 185

	
184 186
    typedef _Graph Graph;
185 187

	
186 188
    typedef typename Parent::Key Item;
187 189

	
188 190
    typedef typename Parent::Key Key;
189 191
    typedef typename Parent::Value Value;
192
    typedef typename Parent::Reference Reference;
193
    typedef typename Parent::ConstReference ConstReference;
190 194

	
191 195
    class MapIt;
192 196
    class ConstMapIt;
193 197

	
194 198
    friend class MapIt;
195 199
    friend class ConstMapIt;
196 200

	
197 201
  public:
198 202

	
199 203
    SubMapExtender(const Graph& _graph)
200 204
      : Parent(_graph), graph(_graph) {}
201 205

	
202 206
    SubMapExtender(const Graph& _graph, const Value& _value)
203 207
      : Parent(_graph, _value), graph(_graph) {}
204 208

	
205 209
  private:
206 210
    SubMapExtender& operator=(const SubMapExtender& cmap) {
207 211
      return operator=<MapExtender>(cmap);
208 212
    }
209 213

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

	
220 224
  public:
221 225
    class MapIt : public Item {
222 226
    public:
223 227

	
224 228
      typedef Item Parent;
225 229
      typedef typename Map::Value Value;
226 230

	
227 231
      MapIt() {}
228 232

	
229 233
      MapIt(Invalid i) : Parent(i) { }
230 234

	
231 235
      explicit MapIt(Map& _map) : map(_map) {
232 236
        map.graph.first(*this);
233 237
      }
234 238

	
235 239
      MapIt(const Map& _map, const Item& item)
236 240
        : Parent(item), map(_map) {}
237 241

	
238 242
      MapIt& operator++() {
239 243
        map.graph.next(*this);
240 244
        return *this;
241 245
      }
242 246

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

	
247 251
      typename MapTraits<Map>::ReturnValue operator*() {
248 252
        return map[*this];
249 253
      }
250 254

	
251 255
      void set(const Value& value) {
252 256
        map.set(*this, value);
253 257
      }
254 258

	
255 259
    protected:
256 260
      Map& map;
257 261

	
258 262
    };
259 263

	
260 264
    class ConstMapIt : public Item {
261 265
    public:
262 266

	
263 267
      typedef Item Parent;
264 268

	
265 269
      typedef typename Map::Value Value;
266 270

	
267 271
      ConstMapIt() {}
268 272

	
269 273
      ConstMapIt(Invalid i) : Parent(i) { }
270 274

	
271 275
      explicit ConstMapIt(Map& _map) : map(_map) {
272 276
        map.graph.first(*this);
273 277
      }
274 278

	
275 279
      ConstMapIt(const Map& _map, const Item& item)
276 280
        : Parent(item), map(_map) {}
277 281

	
278 282
      ConstMapIt& operator++() {
279 283
        map.graph.next(*this);
280 284
        return *this;
281 285
      }
282 286

	
283 287
      typename MapTraits<Map>::ConstReturnValue operator*() const {
284 288
        return map[*this];
285 289
      }
286 290

	
287 291
    protected:
288 292
      const Map& map;
289 293
    };
290 294

	
291 295
    class ItemIt : public Item {
292 296
    public:
293 297

	
294 298
      typedef Item Parent;
295 299

	
296 300
      ItemIt() {}
297 301

	
298 302
      ItemIt(Invalid i) : Parent(i) { }
299 303

	
300 304
      explicit ItemIt(Map& _map) : map(_map) {
301 305
        map.graph.first(*this);
302 306
      }
303 307

	
304 308
      ItemIt(const Map& _map, const Item& item)
305 309
        : Parent(item), map(_map) {}
306 310

	
307 311
      ItemIt& operator++() {
308 312
        map.graph.next(*this);
309 313
        return *this;
310 314
      }
311 315

	
312 316
    protected:
313 317
      const Map& map;
314 318

	
315 319
    };
316 320

	
317 321
  private:
Ignore white space 256 line context
... ...
@@ -296,192 +296,193 @@
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
      /// \brief Read write map of the nodes to type \c T.
424
      /// \brief Reference map of the nodes to type \c T.
425 425
      ///
426
      /// ReadWrite map of the nodes to type \c T.
427
      /// \sa Reference
426
      /// Reference map of the nodes to type \c T.
428 427
      template<class T>
429
      class NodeMap : public ReadWriteMap< Node, T > {
428
      class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
430 429
      public:
431 430

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

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

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

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

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

	
480 481
    };
481 482

	
482 483
  } //namespace concepts
483 484
} //namespace lemon
484 485

	
485 486

	
486 487

	
487 488
#endif
Ignore white space 6 line context
... ...
@@ -372,392 +372,393 @@
372 372
        ///
373 373
        ArcIt(const ArcIt& e) : Arc(e) { }
374 374
        /// Initialize the iterator to be invalid.
375 375

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
621 621
      /// \brief Second node of the edge.
622 622
      ///
623 623
      /// \return The second node of the given edge.
624 624
      ///
625 625
      /// Naturally edges don't have direction and thus
626 626
      /// don't have source and target node. However we use \c u() and \c v()
627 627
      /// methods to query the two nodes of the arc. The direction of the
628 628
      /// arc which arises this way is called the inherent direction of the
629 629
      /// edge, and is used to define the "default" direction
630 630
      /// of the directed versions of the arcs.
631 631
      /// \sa u()
632 632
      /// \sa direction()
633 633
      Node v(Edge) const { return INVALID; }
634 634

	
635 635
      /// \brief Source node of the directed arc.
636 636
      Node source(Arc) const { return INVALID; }
637 637

	
638 638
      /// \brief Target node of the directed arc.
639 639
      Node target(Arc) const { return INVALID; }
640 640

	
641 641
      /// \brief Returns the id of the node.
642 642
      int id(Node) const { return -1; }
643 643

	
644 644
      /// \brief Returns the id of the edge.
645 645
      int id(Edge) const { return -1; }
646 646

	
647 647
      /// \brief Returns the id of the arc.
648 648
      int id(Arc) const { return -1; }
649 649

	
650 650
      /// \brief Returns the node with the given id.
651 651
      ///
652 652
      /// \pre The argument should be a valid node id in the graph.
653 653
      Node nodeFromId(int) const { return INVALID; }
654 654

	
655 655
      /// \brief Returns the edge with the given id.
656 656
      ///
657 657
      /// \pre The argument should be a valid edge id in the graph.
658 658
      Edge edgeFromId(int) const { return INVALID; }
659 659

	
660 660
      /// \brief Returns the arc with the given id.
661 661
      ///
662 662
      /// \pre The argument should be a valid arc id in the graph.
663 663
      Arc arcFromId(int) const { return INVALID; }
664 664

	
665 665
      /// \brief Returns an upper bound on the node IDs.
666 666
      int maxNodeId() const { return -1; }
667 667

	
668 668
      /// \brief Returns an upper bound on the edge IDs.
669 669
      int maxEdgeId() const { return -1; }
670 670

	
671 671
      /// \brief Returns an upper bound on the arc IDs.
672 672
      int maxArcId() const { return -1; }
673 673

	
674 674
      void first(Node&) const {}
675 675
      void next(Node&) const {}
676 676

	
677 677
      void first(Edge&) const {}
678 678
      void next(Edge&) const {}
679 679

	
680 680
      void first(Arc&) const {}
681 681
      void next(Arc&) const {}
682 682

	
683 683
      void firstOut(Arc&, Node) const {}
684 684
      void nextOut(Arc&) const {}
685 685

	
686 686
      void firstIn(Arc&, Node) const {}
687 687
      void nextIn(Arc&) const {}
688 688

	
689 689
      void firstInc(Edge &, bool &, const Node &) const {}
690 690
      void nextInc(Edge &, bool &) const {}
691 691

	
692 692
      // The second parameter is dummy.
693 693
      Node fromId(int, Node) const { return INVALID; }
694 694
      // The second parameter is dummy.
695 695
      Edge fromId(int, Edge) const { return INVALID; }
696 696
      // The second parameter is dummy.
697 697
      Arc fromId(int, Arc) const { return INVALID; }
698 698

	
699 699
      // Dummy parameter.
700 700
      int maxId(Node) const { return -1; }
701 701
      // Dummy parameter.
702 702
      int maxId(Edge) const { return -1; }
703 703
      // Dummy parameter.
704 704
      int maxId(Arc) const { return -1; }
705 705

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

	
720 720
      /// \brief Base node of the iterator
721 721
      ///
722 722
      /// Returns the base node (the target in this case) of the iterator
723 723
      Node baseNode(InArcIt e) const {
724 724
        return target(e);
725 725
      }
726 726
      /// \brief Running node of the iterator
727 727
      ///
728 728
      /// Returns the running node (the source in this case) of the
729 729
      /// iterator
730 730
      Node runningNode(InArcIt e) const {
731 731
        return source(e);
732 732
      }
733 733

	
734 734
      /// \brief Base node of the iterator
735 735
      ///
736 736
      /// Returns the base node of the iterator
737 737
      Node baseNode(IncEdgeIt) const {
738 738
        return INVALID;
739 739
      }
740 740

	
741 741
      /// \brief Running node of the iterator
742 742
      ///
743 743
      /// Returns the running node of the iterator
744 744
      Node runningNode(IncEdgeIt) const {
745 745
        return INVALID;
746 746
      }
747 747

	
748 748
      template <typename _Graph>
749 749
      struct Constraints {
750 750
        void constraints() {
751
          checkConcept<BaseGraphComponent, _Graph>();
751 752
          checkConcept<IterableGraphComponent<>, _Graph>();
752 753
          checkConcept<IDableGraphComponent<>, _Graph>();
753 754
          checkConcept<MappableGraphComponent<>, _Graph>();
754 755
        }
755 756
      };
756 757

	
757 758
    };
758 759

	
759 760
  }
760 761

	
761 762
}
762 763

	
763 764
#endif
Ignore white space 6 line context
... ...
@@ -863,475 +863,487 @@
863 863
            }
864 864
            {
865 865
              graph.firstInc(edge, dir, node);
866 866
              graph.nextInc(edge, dir);
867 867
            }
868 868

	
869 869
          }
870 870

	
871 871
          {
872 872
            checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
873 873
              typename _Graph::EdgeIt >();
874 874
            checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
875 875
              typename _Graph::Node, 'e'>, typename _Graph::IncEdgeIt>();
876 876

	
877 877
            typename _Graph::Node n;
878 878
            const typename _Graph::IncEdgeIt ieit(INVALID);
879 879
            n = graph.baseNode(ieit);
880 880
            n = graph.runningNode(ieit);
881 881
          }
882 882
        }
883 883

	
884 884
        const _Graph& graph;
885 885
      };
886 886
    };
887 887

	
888 888
    /// \brief Skeleton class for alterable directed graphs.
889 889
    ///
890 890
    /// This class describes the interface of alterable directed
891 891
    /// graphs. It extends \ref BaseDigraphComponent with the alteration
892 892
    /// notifier interface. It implements
893 893
    /// an observer-notifier pattern for each digraph item. More
894 894
    /// obsevers can be registered into the notifier and whenever an
895 895
    /// alteration occured in the digraph all the observers will be
896 896
    /// notified about it.
897 897
    template <typename BAS = BaseDigraphComponent>
898 898
    class AlterableDigraphComponent : public BAS {
899 899
    public:
900 900

	
901 901
      typedef BAS Base;
902 902
      typedef typename Base::Node Node;
903 903
      typedef typename Base::Arc Arc;
904 904

	
905 905

	
906 906
      /// Node alteration notifier class.
907 907
      typedef AlterationNotifier<AlterableDigraphComponent, Node>
908 908
      NodeNotifier;
909 909
      /// Arc alteration notifier class.
910 910
      typedef AlterationNotifier<AlterableDigraphComponent, Arc>
911 911
      ArcNotifier;
912 912

	
913 913
      /// \brief Return the node alteration notifier.
914 914
      ///
915 915
      /// This function gives back the node alteration notifier.
916 916
      NodeNotifier& notifier(Node) const {
917 917
         return NodeNotifier();
918 918
      }
919 919

	
920 920
      /// \brief Return the arc alteration notifier.
921 921
      ///
922 922
      /// This function gives back the arc alteration notifier.
923 923
      ArcNotifier& notifier(Arc) const {
924 924
        return ArcNotifier();
925 925
      }
926 926

	
927 927
      template <typename _Digraph>
928 928
      struct Constraints {
929 929
        void constraints() {
930 930
          checkConcept<Base, _Digraph>();
931 931
          typename _Digraph::NodeNotifier& nn
932 932
            = digraph.notifier(typename _Digraph::Node());
933 933

	
934 934
          typename _Digraph::ArcNotifier& en
935 935
            = digraph.notifier(typename _Digraph::Arc());
936 936

	
937 937
          ignore_unused_variable_warning(nn);
938 938
          ignore_unused_variable_warning(en);
939 939
        }
940 940

	
941 941
        const _Digraph& digraph;
942 942
      };
943 943
    };
944 944

	
945 945
    /// \brief Skeleton class for alterable undirected graphs.
946 946
    ///
947 947
    /// This class describes the interface of alterable undirected
948 948
    /// graphs. It extends \ref AlterableDigraphComponent with the alteration
949 949
    /// notifier interface of undirected graphs. It implements
950 950
    /// an observer-notifier pattern for the edges. More
951 951
    /// obsevers can be registered into the notifier and whenever an
952 952
    /// alteration occured in the graph all the observers will be
953 953
    /// notified about it.
954 954
    template <typename BAS = BaseGraphComponent>
955 955
    class AlterableGraphComponent : public AlterableDigraphComponent<BAS> {
956 956
    public:
957 957

	
958 958
      typedef BAS Base;
959 959
      typedef typename Base::Edge Edge;
960 960

	
961 961

	
962 962
      /// Edge alteration notifier class.
963 963
      typedef AlterationNotifier<AlterableGraphComponent, Edge>
964 964
      EdgeNotifier;
965 965

	
966 966
      /// \brief Return the edge alteration notifier.
967 967
      ///
968 968
      /// This function gives back the edge alteration notifier.
969 969
      EdgeNotifier& notifier(Edge) const {
970 970
        return EdgeNotifier();
971 971
      }
972 972

	
973 973
      template <typename _Graph>
974 974
      struct Constraints {
975 975
        void constraints() {
976 976
          checkConcept<AlterableDigraphComponent<Base>, _Graph>();
977 977
          typename _Graph::EdgeNotifier& uen
978 978
            = graph.notifier(typename _Graph::Edge());
979 979
          ignore_unused_variable_warning(uen);
980 980
        }
981 981

	
982 982
        const _Graph& graph;
983 983
      };
984 984
    };
985 985

	
986 986
    /// \brief Concept class for standard graph maps.
987 987
    ///
988 988
    /// This class describes the concept of standard graph maps, i.e.
989 989
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 
990 990
    /// graph types, which can be used for associating data to graph items.
991
    /// The standard graph maps must conform to the ReferenceMap concept.
991 992
    template <typename GR, typename K, typename V>
992
    class GraphMap : public ReadWriteMap<K, V> {
993
    class GraphMap : public ReferenceMap<K, V, V&, const V&> {
993 994
    public:
994 995

	
995 996
      typedef ReadWriteMap<K, V> Parent;
996 997

	
997 998
      /// The graph type of the map.
998 999
      typedef GR Graph;
999 1000
      /// The key type of the map.
1000 1001
      typedef K Key;
1001 1002
      /// The value type of the map.
1002 1003
      typedef V Value;
1004
      /// The reference type of the map.
1005
      typedef Value& Reference;
1006
      /// The const reference type of the map.
1007
      typedef const Value& ConstReference;
1008

	
1009
      // The reference map tag.
1010
      typedef True ReferenceMapTag;
1003 1011

	
1004 1012
      /// \brief Construct a new map.
1005 1013
      ///
1006 1014
      /// Construct a new map for the graph.
1007 1015
      explicit GraphMap(const Graph&) {}
1008 1016
      /// \brief Construct a new map with default value.
1009 1017
      ///
1010 1018
      /// Construct a new map for the graph and initalize the values.
1011 1019
      GraphMap(const Graph&, const Value&) {}
1012 1020

	
1013 1021
    private:
1014 1022
      /// \brief Copy constructor.
1015 1023
      ///
1016 1024
      /// Copy Constructor.
1017 1025
      GraphMap(const GraphMap&) : Parent() {}
1018 1026

	
1019 1027
      /// \brief Assignment operator.
1020 1028
      ///
1021 1029
      /// Assignment operator. It does not mofify the underlying graph,
1022 1030
      /// it just iterates on the current item set and set the  map
1023 1031
      /// with the value returned by the assigned map.
1024 1032
      template <typename CMap>
1025 1033
      GraphMap& operator=(const CMap&) {
1026 1034
        checkConcept<ReadMap<Key, Value>, CMap>();
1027 1035
        return *this;
1028 1036
      }
1029 1037

	
1030 1038
    public:
1031 1039
      template<typename _Map>
1032 1040
      struct Constraints {
1033 1041
        void constraints() {
1034
          checkConcept<ReadWriteMap<Key, Value>, _Map >();
1042
          checkConcept
1043
            <ReferenceMap<Key, Value, Value&, const Value&>, _Map>();
1035 1044
          _Map m1(g);
1036 1045
          _Map m2(g,t);
1037 1046
          
1038 1047
          // Copy constructor
1039 1048
          // _Map m3(m);
1040 1049

	
1041 1050
          // Assignment operator
1042 1051
          // ReadMap<Key, Value> cmap;
1043 1052
          // m3 = cmap;
1044 1053

	
1045 1054
          ignore_unused_variable_warning(m1);
1046 1055
          ignore_unused_variable_warning(m2);
1047 1056
          // ignore_unused_variable_warning(m3);
1048 1057
        }
1049 1058

	
1050 1059
        const _Map &m;
1051 1060
        const Graph &g;
1052 1061
        const typename GraphMap::Value &t;
1053 1062
      };
1054 1063

	
1055 1064
    };
1056 1065

	
1057 1066
    /// \brief Skeleton class for mappable directed graphs.
1058 1067
    ///
1059 1068
    /// This class describes the interface of mappable directed graphs.
1060 1069
    /// It extends \ref BaseDigraphComponent with the standard digraph 
1061 1070
    /// map classes, namely \c NodeMap and \c ArcMap.
1062 1071
    /// This concept is part of the Digraph concept.
1063 1072
    template <typename BAS = BaseDigraphComponent>
1064 1073
    class MappableDigraphComponent : public BAS  {
1065 1074
    public:
1066 1075

	
1067 1076
      typedef BAS Base;
1068 1077
      typedef typename Base::Node Node;
1069 1078
      typedef typename Base::Arc Arc;
1070 1079

	
1071 1080
      typedef MappableDigraphComponent Digraph;
1072 1081

	
1073 1082
      /// \brief Standard graph map for the nodes.
1074 1083
      ///
1075 1084
      /// Standard graph map for the nodes.
1085
      /// It conforms to the ReferenceMap concept.
1076 1086
      template <typename V>
1077 1087
      class NodeMap : public GraphMap<MappableDigraphComponent, Node, V> {
1078 1088
      public:
1079 1089
        typedef GraphMap<MappableDigraphComponent, Node, V> Parent;
1080 1090

	
1081 1091
        /// \brief Construct a new map.
1082 1092
        ///
1083 1093
        /// Construct a new map for the digraph.
1084 1094
        explicit NodeMap(const MappableDigraphComponent& digraph)
1085 1095
          : Parent(digraph) {}
1086 1096

	
1087 1097
        /// \brief Construct a new map with default value.
1088 1098
        ///
1089 1099
        /// Construct a new map for the digraph and initalize the values.
1090 1100
        NodeMap(const MappableDigraphComponent& digraph, const V& value)
1091 1101
          : Parent(digraph, value) {}
1092 1102

	
1093 1103
      private:
1094 1104
        /// \brief Copy constructor.
1095 1105
        ///
1096 1106
        /// Copy Constructor.
1097 1107
        NodeMap(const NodeMap& nm) : Parent(nm) {}
1098 1108

	
1099 1109
        /// \brief Assignment operator.
1100 1110
        ///
1101 1111
        /// Assignment operator.
1102 1112
        template <typename CMap>
1103 1113
        NodeMap& operator=(const CMap&) {
1104 1114
          checkConcept<ReadMap<Node, V>, CMap>();
1105 1115
          return *this;
1106 1116
        }
1107 1117

	
1108 1118
      };
1109 1119

	
1110 1120
      /// \brief Standard graph map for the arcs.
1111 1121
      ///
1112 1122
      /// Standard graph map for the arcs.
1123
      /// It conforms to the ReferenceMap concept.
1113 1124
      template <typename V>
1114 1125
      class ArcMap : public GraphMap<MappableDigraphComponent, Arc, V> {
1115 1126
      public:
1116 1127
        typedef GraphMap<MappableDigraphComponent, Arc, V> Parent;
1117 1128

	
1118 1129
        /// \brief Construct a new map.
1119 1130
        ///
1120 1131
        /// Construct a new map for the digraph.
1121 1132
        explicit ArcMap(const MappableDigraphComponent& digraph)
1122 1133
          : Parent(digraph) {}
1123 1134

	
1124 1135
        /// \brief Construct a new map with default value.
1125 1136
        ///
1126 1137
        /// Construct a new map for the digraph and initalize the values.
1127 1138
        ArcMap(const MappableDigraphComponent& digraph, const V& value)
1128 1139
          : Parent(digraph, value) {}
1129 1140

	
1130 1141
      private:
1131 1142
        /// \brief Copy constructor.
1132 1143
        ///
1133 1144
        /// Copy Constructor.
1134 1145
        ArcMap(const ArcMap& nm) : Parent(nm) {}
1135 1146

	
1136 1147
        /// \brief Assignment operator.
1137 1148
        ///
1138 1149
        /// Assignment operator.
1139 1150
        template <typename CMap>
1140 1151
        ArcMap& operator=(const CMap&) {
1141 1152
          checkConcept<ReadMap<Arc, V>, CMap>();
1142 1153
          return *this;
1143 1154
        }
1144 1155

	
1145 1156
      };
1146 1157

	
1147 1158

	
1148 1159
      template <typename _Digraph>
1149 1160
      struct Constraints {
1150 1161

	
1151 1162
        struct Dummy {
1152 1163
          int value;
1153 1164
          Dummy() : value(0) {}
1154 1165
          Dummy(int _v) : value(_v) {}
1155 1166
        };
1156 1167

	
1157 1168
        void constraints() {
1158 1169
          checkConcept<Base, _Digraph>();
1159 1170
          { // int map test
1160 1171
            typedef typename _Digraph::template NodeMap<int> IntNodeMap;
1161 1172
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>,
1162 1173
              IntNodeMap >();
1163 1174
          } { // bool map test
1164 1175
            typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
1165 1176
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
1166 1177
              BoolNodeMap >();
1167 1178
          } { // Dummy map test
1168 1179
            typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
1169 1180
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
1170 1181
              DummyNodeMap >();
1171 1182
          }
1172 1183

	
1173 1184
          { // int map test
1174 1185
            typedef typename _Digraph::template ArcMap<int> IntArcMap;
1175 1186
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
1176 1187
              IntArcMap >();
1177 1188
          } { // bool map test
1178 1189
            typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
1179 1190
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
1180 1191
              BoolArcMap >();
1181 1192
          } { // Dummy map test
1182 1193
            typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
1183 1194
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
1184 1195
              DummyArcMap >();
1185 1196
          }
1186 1197
        }
1187 1198

	
1188 1199
        const _Digraph& digraph;
1189 1200
      };
1190 1201
    };
1191 1202

	
1192 1203
    /// \brief Skeleton class for mappable undirected graphs.
1193 1204
    ///
1194 1205
    /// This class describes the interface of mappable undirected graphs.
1195 1206
    /// It extends \ref MappableDigraphComponent with the standard graph 
1196 1207
    /// map class for edges (\c EdgeMap).
1197 1208
    /// This concept is part of the Graph concept.
1198 1209
    template <typename BAS = BaseGraphComponent>
1199 1210
    class MappableGraphComponent : public MappableDigraphComponent<BAS>  {
1200 1211
    public:
1201 1212

	
1202 1213
      typedef BAS Base;
1203 1214
      typedef typename Base::Edge Edge;
1204 1215

	
1205 1216
      typedef MappableGraphComponent Graph;
1206 1217

	
1207 1218
      /// \brief Standard graph map for the edges.
1208 1219
      ///
1209 1220
      /// Standard graph map for the edges.
1221
      /// It conforms to the ReferenceMap concept.
1210 1222
      template <typename V>
1211 1223
      class EdgeMap : public GraphMap<MappableGraphComponent, Edge, V> {
1212 1224
      public:
1213 1225
        typedef GraphMap<MappableGraphComponent, Edge, V> Parent;
1214 1226

	
1215 1227
        /// \brief Construct a new map.
1216 1228
        ///
1217 1229
        /// Construct a new map for the graph.
1218 1230
        explicit EdgeMap(const MappableGraphComponent& graph)
1219 1231
          : Parent(graph) {}
1220 1232

	
1221 1233
        /// \brief Construct a new map with default value.
1222 1234
        ///
1223 1235
        /// Construct a new map for the graph and initalize the values.
1224 1236
        EdgeMap(const MappableGraphComponent& graph, const V& value)
1225 1237
          : Parent(graph, value) {}
1226 1238

	
1227 1239
      private:
1228 1240
        /// \brief Copy constructor.
1229 1241
        ///
1230 1242
        /// Copy Constructor.
1231 1243
        EdgeMap(const EdgeMap& nm) : Parent(nm) {}
1232 1244

	
1233 1245
        /// \brief Assignment operator.
1234 1246
        ///
1235 1247
        /// Assignment operator.
1236 1248
        template <typename CMap>
1237 1249
        EdgeMap& operator=(const CMap&) {
1238 1250
          checkConcept<ReadMap<Edge, V>, CMap>();
1239 1251
          return *this;
1240 1252
        }
1241 1253

	
1242 1254
      };
1243 1255

	
1244 1256

	
1245 1257
      template <typename _Graph>
1246 1258
      struct Constraints {
1247 1259

	
1248 1260
        struct Dummy {
1249 1261
          int value;
1250 1262
          Dummy() : value(0) {}
1251 1263
          Dummy(int _v) : value(_v) {}
1252 1264
        };
1253 1265

	
1254 1266
        void constraints() {
1255 1267
          checkConcept<MappableDigraphComponent<Base>, _Graph>();
1256 1268

	
1257 1269
          { // int map test
1258 1270
            typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
1259 1271
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
1260 1272
              IntEdgeMap >();
1261 1273
          } { // bool map test
1262 1274
            typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
1263 1275
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
1264 1276
              BoolEdgeMap >();
1265 1277
          } { // Dummy map test
1266 1278
            typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
1267 1279
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
1268 1280
              DummyEdgeMap >();
1269 1281
          }
1270 1282
        }
1271 1283

	
1272 1284
        const _Graph& graph;
1273 1285
      };
1274 1286
    };
1275 1287

	
1276 1288
    /// \brief Skeleton class for extendable directed graphs.
1277 1289
    ///
1278 1290
    /// This class describes the interface of extendable directed graphs.
1279 1291
    /// It extends \ref BaseDigraphComponent with functions for adding 
1280 1292
    /// nodes and arcs to the digraph.
1281 1293
    /// This concept requires \ref AlterableDigraphComponent.
1282 1294
    template <typename BAS = BaseDigraphComponent>
1283 1295
    class ExtendableDigraphComponent : public BAS {
1284 1296
    public:
1285 1297
      typedef BAS Base;
1286 1298

	
1287 1299
      typedef typename Base::Node Node;
1288 1300
      typedef typename Base::Arc Arc;
1289 1301

	
1290 1302
      /// \brief Add a new node to the digraph.
1291 1303
      ///
1292 1304
      /// This function adds a new node to the digraph.
1293 1305
      Node addNode() {
1294 1306
        return INVALID;
1295 1307
      }
1296 1308

	
1297 1309
      /// \brief Add a new arc connecting the given two nodes.
1298 1310
      ///
1299 1311
      /// This function adds a new arc connecting the given two nodes
1300 1312
      /// of the digraph.
1301 1313
      Arc addArc(const Node&, const Node&) {
1302 1314
        return INVALID;
1303 1315
      }
1304 1316

	
1305 1317
      template <typename _Digraph>
1306 1318
      struct Constraints {
1307 1319
        void constraints() {
1308 1320
          checkConcept<Base, _Digraph>();
1309 1321
          typename _Digraph::Node node_a, node_b;
1310 1322
          node_a = digraph.addNode();
1311 1323
          node_b = digraph.addNode();
1312 1324
          typename _Digraph::Arc arc;
1313 1325
          arc = digraph.addArc(node_a, node_b);
1314 1326
        }
1315 1327

	
1316 1328
        _Digraph& digraph;
1317 1329
      };
1318 1330
    };
1319 1331

	
1320 1332
    /// \brief Skeleton class for extendable undirected graphs.
1321 1333
    ///
1322 1334
    /// This class describes the interface of extendable undirected graphs.
1323 1335
    /// It extends \ref BaseGraphComponent with functions for adding 
1324 1336
    /// nodes and edges to the graph.
1325 1337
    /// This concept requires \ref AlterableGraphComponent.
1326 1338
    template <typename BAS = BaseGraphComponent>
1327 1339
    class ExtendableGraphComponent : public BAS {
1328 1340
    public:
1329 1341

	
1330 1342
      typedef BAS Base;
1331 1343
      typedef typename Base::Node Node;
1332 1344
      typedef typename Base::Edge Edge;
1333 1345

	
1334 1346
      /// \brief Add a new node to the digraph.
1335 1347
      ///
1336 1348
      /// This function adds a new node to the digraph.
1337 1349
      Node addNode() {
0 comments (0 inline)