gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Remove InverseMap and DescriptorMap
0 2 0
1.0
2 files changed with 8 insertions and 413 deletions:
↑ Collapse diff ↑
Ignore white space 6144 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_MAPS_H
20 20
#define LEMON_MAPS_H
21 21

	
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25 25

	
26 26
#include <lemon/core.h>
27 27

	
28 28
///\file
29 29
///\ingroup maps
30 30
///\brief Miscellaneous property maps
31 31

	
32 32
#include <map>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \addtogroup maps
37 37
  /// @{
38 38

	
39 39
  /// Base class of maps.
40 40

	
41 41
  /// Base class of maps. It provides the necessary type definitions
42 42
  /// required by the map %concepts.
43 43
  template<typename K, typename V>
44 44
  class MapBase {
45 45
  public:
46 46
    /// \biref The key type of the map.
47 47
    typedef K Key;
48 48
    /// \brief The value type of the map.
49 49
    /// (The type of objects associated with the keys).
50 50
    typedef V Value;
51 51
  };
52 52

	
53 53

	
54 54
  /// Null map. (a.k.a. DoNothingMap)
55 55

	
56 56
  /// This map can be used if you have to provide a map only for
57 57
  /// its type definitions, or if you have to provide a writable map,
58 58
  /// but data written to it is not required (i.e. it will be sent to
59 59
  /// <tt>/dev/null</tt>).
60 60
  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
61 61
  ///
62 62
  /// \sa ConstMap
63 63
  template<typename K, typename V>
64 64
  class NullMap : public MapBase<K, V> {
65 65
  public:
66 66
    typedef MapBase<K, V> Parent;
67 67
    typedef typename Parent::Key Key;
68 68
    typedef typename Parent::Value Value;
69 69

	
70 70
    /// Gives back a default constructed element.
71 71
    Value operator[](const Key&) const { return Value(); }
72 72
    /// Absorbs the value.
73 73
    void set(const Key&, const Value&) {}
74 74
  };
75 75

	
76 76
  /// Returns a \ref NullMap class
77 77

	
78 78
  /// This function just returns a \ref NullMap class.
79 79
  /// \relates NullMap
80 80
  template <typename K, typename V>
81 81
  NullMap<K, V> nullMap() {
82 82
    return NullMap<K, V>();
83 83
  }
84 84

	
85 85

	
86 86
  /// Constant map.
87 87

	
88 88
  /// This \ref concepts::ReadMap "readable map" assigns a specified
89 89
  /// value to each key.
90 90
  ///
91 91
  /// In other aspects it is equivalent to \ref NullMap.
92 92
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
93 93
  /// concept, but it absorbs the data written to it.
94 94
  ///
95 95
  /// The simplest way of using this map is through the constMap()
96 96
  /// function.
97 97
  ///
98 98
  /// \sa NullMap
99 99
  /// \sa IdentityMap
100 100
  template<typename K, typename V>
101 101
  class ConstMap : public MapBase<K, V> {
102 102
  private:
103 103
    V _value;
104 104
  public:
105 105
    typedef MapBase<K, V> Parent;
106 106
    typedef typename Parent::Key Key;
107 107
    typedef typename Parent::Value Value;
108 108

	
109 109
    /// Default constructor
110 110

	
111 111
    /// Default constructor.
112 112
    /// The value of the map will be default constructed.
113 113
    ConstMap() {}
114 114

	
115 115
    /// Constructor with specified initial value
116 116

	
117 117
    /// Constructor with specified initial value.
118 118
    /// \param v The initial value of the map.
119 119
    ConstMap(const Value &v) : _value(v) {}
120 120

	
121 121
    /// Gives back the specified value.
122 122
    Value operator[](const Key&) const { return _value; }
123 123

	
124 124
    /// Absorbs the value.
125 125
    void set(const Key&, const Value&) {}
126 126

	
127 127
    /// Sets the value that is assigned to each key.
128 128
    void setAll(const Value &v) {
129 129
      _value = v;
130 130
    }
131 131

	
132 132
    template<typename V1>
133 133
    ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
134 134
  };
135 135

	
136 136
  /// Returns a \ref ConstMap class
137 137

	
138 138
  /// This function just returns a \ref ConstMap class.
139 139
  /// \relates ConstMap
140 140
  template<typename K, typename V>
141 141
  inline ConstMap<K, V> constMap(const V &v) {
142 142
    return ConstMap<K, V>(v);
143 143
  }
144 144

	
145 145
  template<typename K, typename V>
146 146
  inline ConstMap<K, V> constMap() {
147 147
    return ConstMap<K, V>();
148 148
  }
149 149

	
150 150

	
151 151
  template<typename T, T v>
152 152
  struct Const {};
153 153

	
154 154
  /// Constant map with inlined constant value.
155 155

	
156 156
  /// This \ref concepts::ReadMap "readable map" assigns a specified
157 157
  /// value to each key.
158 158
  ///
159 159
  /// In other aspects it is equivalent to \ref NullMap.
160 160
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
161 161
  /// concept, but it absorbs the data written to it.
162 162
  ///
163 163
  /// The simplest way of using this map is through the constMap()
164 164
  /// function.
165 165
  ///
166 166
  /// \sa NullMap
167 167
  /// \sa IdentityMap
168 168
  template<typename K, typename V, V v>
169 169
  class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
170 170
  public:
171 171
    typedef MapBase<K, V> Parent;
172 172
    typedef typename Parent::Key Key;
173 173
    typedef typename Parent::Value Value;
174 174

	
175 175
    /// Constructor.
176 176
    ConstMap() {}
177 177

	
178 178
    /// Gives back the specified value.
179 179
    Value operator[](const Key&) const { return v; }
180 180

	
181 181
    /// Absorbs the value.
182 182
    void set(const Key&, const Value&) {}
183 183
  };
184 184

	
185 185
  /// Returns a \ref ConstMap class with inlined constant value
186 186

	
187 187
  /// This function just returns a \ref ConstMap class with inlined
188 188
  /// constant value.
189 189
  /// \relates ConstMap
190 190
  template<typename K, typename V, V v>
191 191
  inline ConstMap<K, Const<V, v> > constMap() {
192 192
    return ConstMap<K, Const<V, v> >();
193 193
  }
194 194

	
195 195

	
196 196
  /// Identity map.
197 197

	
198 198
  /// This \ref concepts::ReadMap "read-only map" gives back the given
199 199
  /// key as value without any modification.
200 200
  ///
201 201
  /// \sa ConstMap
202 202
  template <typename T>
203 203
  class IdentityMap : public MapBase<T, T> {
204 204
  public:
205 205
    typedef MapBase<T, T> Parent;
206 206
    typedef typename Parent::Key Key;
207 207
    typedef typename Parent::Value Value;
208 208

	
209 209
    /// Gives back the given value without any modification.
210 210
    Value operator[](const Key &k) const {
211 211
      return k;
212 212
    }
213 213
  };
214 214

	
215 215
  /// Returns an \ref IdentityMap class
216 216

	
217 217
  /// This function just returns an \ref IdentityMap class.
218 218
  /// \relates IdentityMap
219 219
  template<typename T>
220 220
  inline IdentityMap<T> identityMap() {
221 221
    return IdentityMap<T>();
222 222
  }
223 223

	
224 224

	
225 225
  /// \brief Map for storing values for integer keys from the range
226 226
  /// <tt>[0..size-1]</tt>.
227 227
  ///
228 228
  /// This map is essentially a wrapper for \c std::vector. It assigns
229 229
  /// values to integer keys from the range <tt>[0..size-1]</tt>.
230 230
  /// It can be used with some data structures, for example
231 231
  /// \ref UnionFind, \ref BinHeap, when the used items are small
232 232
  /// integers. This map conforms the \ref concepts::ReferenceMap
233 233
  /// "ReferenceMap" concept.
234 234
  ///
235 235
  /// The simplest way of using this map is through the rangeMap()
236 236
  /// function.
237 237
  template <typename V>
238 238
  class RangeMap : public MapBase<int, V> {
239 239
    template <typename V1>
240 240
    friend class RangeMap;
241 241
  private:
242 242

	
243 243
    typedef std::vector<V> Vector;
244 244
    Vector _vector;
245 245

	
246 246
  public:
247 247

	
248 248
    typedef MapBase<int, V> Parent;
249 249
    /// Key type
250 250
    typedef typename Parent::Key Key;
251 251
    /// Value type
252 252
    typedef typename Parent::Value Value;
253 253
    /// Reference type
254 254
    typedef typename Vector::reference Reference;
255 255
    /// Const reference type
256 256
    typedef typename Vector::const_reference ConstReference;
257 257

	
258 258
    typedef True ReferenceMapTag;
259 259

	
260 260
  public:
261 261

	
262 262
    /// Constructor with specified default value.
263 263
    RangeMap(int size = 0, const Value &value = Value())
264 264
      : _vector(size, value) {}
265 265

	
266 266
    /// Constructs the map from an appropriate \c std::vector.
267 267
    template <typename V1>
268 268
    RangeMap(const std::vector<V1>& vector)
269 269
      : _vector(vector.begin(), vector.end()) {}
270 270

	
271 271
    /// Constructs the map from another \ref RangeMap.
272 272
    template <typename V1>
273 273
    RangeMap(const RangeMap<V1> &c)
274 274
      : _vector(c._vector.begin(), c._vector.end()) {}
275 275

	
276 276
    /// Returns the size of the map.
277 277
    int size() {
278 278
      return _vector.size();
279 279
    }
280 280

	
281 281
    /// Resizes the map.
282 282

	
283 283
    /// Resizes the underlying \c std::vector container, so changes the
284 284
    /// keyset of the map.
285 285
    /// \param size The new size of the map. The new keyset will be the
286 286
    /// range <tt>[0..size-1]</tt>.
287 287
    /// \param value The default value to assign to the new keys.
288 288
    void resize(int size, const Value &value = Value()) {
289 289
      _vector.resize(size, value);
290 290
    }
291 291

	
292 292
  private:
293 293

	
294 294
    RangeMap& operator=(const RangeMap&);
295 295

	
296 296
  public:
297 297

	
298 298
    ///\e
299 299
    Reference operator[](const Key &k) {
300 300
      return _vector[k];
301 301
    }
302 302

	
303 303
    ///\e
304 304
    ConstReference operator[](const Key &k) const {
305 305
      return _vector[k];
306 306
    }
307 307

	
308 308
    ///\e
309 309
    void set(const Key &k, const Value &v) {
310 310
      _vector[k] = v;
311 311
    }
312 312
  };
313 313

	
314 314
  /// Returns a \ref RangeMap class
315 315

	
316 316
  /// This function just returns a \ref RangeMap class.
317 317
  /// \relates RangeMap
318 318
  template<typename V>
319 319
  inline RangeMap<V> rangeMap(int size = 0, const V &value = V()) {
320 320
    return RangeMap<V>(size, value);
321 321
  }
322 322

	
323 323
  /// \brief Returns a \ref RangeMap class created from an appropriate
324 324
  /// \c std::vector
325 325

	
326 326
  /// This function just returns a \ref RangeMap class created from an
327 327
  /// appropriate \c std::vector.
328 328
  /// \relates RangeMap
329 329
  template<typename V>
330 330
  inline RangeMap<V> rangeMap(const std::vector<V> &vector) {
331 331
    return RangeMap<V>(vector);
332 332
  }
333 333

	
334 334

	
335 335
  /// Map type based on \c std::map
336 336

	
337 337
  /// This map is essentially a wrapper for \c std::map with addition
338 338
  /// that you can specify a default value for the keys that are not
339 339
  /// stored actually. This value can be different from the default
340 340
  /// contructed value (i.e. \c %Value()).
341 341
  /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
342 342
  /// concept.
343 343
  ///
344 344
  /// This map is useful if a default value should be assigned to most of
345 345
  /// the keys and different values should be assigned only to a few
346 346
  /// keys (i.e. the map is "sparse").
347 347
  /// The name of this type also refers to this important usage.
348 348
  ///
349 349
  /// Apart form that this map can be used in many other cases since it
350 350
  /// is based on \c std::map, which is a general associative container.
351 351
  /// However keep in mind that it is usually not as efficient as other
352 352
  /// maps.
353 353
  ///
354 354
  /// The simplest way of using this map is through the sparseMap()
355 355
  /// function.
356 356
  template <typename K, typename V, typename Compare = std::less<K> >
357 357
  class SparseMap : public MapBase<K, V> {
358 358
    template <typename K1, typename V1, typename C1>
359 359
    friend class SparseMap;
360 360
  public:
361 361

	
362 362
    typedef MapBase<K, V> Parent;
363 363
    /// Key type
364 364
    typedef typename Parent::Key Key;
365 365
    /// Value type
366 366
    typedef typename Parent::Value Value;
367 367
    /// Reference type
368 368
    typedef Value& Reference;
369 369
    /// Const reference type
370 370
    typedef const Value& ConstReference;
371 371

	
372 372
    typedef True ReferenceMapTag;
373 373

	
374 374
  private:
375 375

	
376 376
    typedef std::map<K, V, Compare> Map;
377 377
    Map _map;
378 378
    Value _value;
379 379

	
380 380
  public:
381 381

	
382 382
    /// \brief Constructor with specified default value.
383 383
    SparseMap(const Value &value = Value()) : _value(value) {}
384 384
    /// \brief Constructs the map from an appropriate \c std::map, and
385 385
    /// explicitly specifies a default value.
386 386
    template <typename V1, typename Comp1>
387 387
    SparseMap(const std::map<Key, V1, Comp1> &map,
388 388
              const Value &value = Value())
389 389
      : _map(map.begin(), map.end()), _value(value) {}
390 390

	
391 391
    /// \brief Constructs the map from another \ref SparseMap.
392 392
    template<typename V1, typename Comp1>
393 393
    SparseMap(const SparseMap<Key, V1, Comp1> &c)
394 394
      : _map(c._map.begin(), c._map.end()), _value(c._value) {}
395 395

	
396 396
  private:
397 397

	
398 398
    SparseMap& operator=(const SparseMap&);
399 399

	
400 400
  public:
401 401

	
402 402
    ///\e
403 403
    Reference operator[](const Key &k) {
404 404
      typename Map::iterator it = _map.lower_bound(k);
405 405
      if (it != _map.end() && !_map.key_comp()(k, it->first))
406 406
        return it->second;
407 407
      else
408 408
        return _map.insert(it, std::make_pair(k, _value))->second;
409 409
    }
410 410

	
411 411
    ///\e
412 412
    ConstReference operator[](const Key &k) const {
413 413
      typename Map::const_iterator it = _map.find(k);
414 414
      if (it != _map.end())
415 415
        return it->second;
416 416
      else
417 417
        return _value;
418 418
    }
419 419

	
420 420
    ///\e
421 421
    void set(const Key &k, const Value &v) {
422 422
      typename Map::iterator it = _map.lower_bound(k);
423 423
      if (it != _map.end() && !_map.key_comp()(k, it->first))
424 424
        it->second = v;
425 425
      else
426 426
        _map.insert(it, std::make_pair(k, v));
427 427
    }
428 428

	
429 429
    ///\e
430 430
    void setAll(const Value &v) {
431 431
      _value = v;
432 432
      _map.clear();
433 433
    }
434 434
  };
435 435

	
436 436
  /// Returns a \ref SparseMap class
437 437

	
438 438
  /// This function just returns a \ref SparseMap class with specified
439 439
  /// default value.
440 440
  /// \relates SparseMap
441 441
  template<typename K, typename V, typename Compare>
442 442
  inline SparseMap<K, V, Compare> sparseMap(const V& value = V()) {
443 443
    return SparseMap<K, V, Compare>(value);
444 444
  }
445 445

	
446 446
  template<typename K, typename V>
447 447
  inline SparseMap<K, V, std::less<K> > sparseMap(const V& value = V()) {
448 448
    return SparseMap<K, V, std::less<K> >(value);
449 449
  }
450 450

	
451 451
  /// \brief Returns a \ref SparseMap class created from an appropriate
452 452
  /// \c std::map
453 453

	
454 454
  /// This function just returns a \ref SparseMap class created from an
455 455
  /// appropriate \c std::map.
456 456
  /// \relates SparseMap
457 457
  template<typename K, typename V, typename Compare>
458 458
  inline SparseMap<K, V, Compare>
459 459
    sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
460 460
  {
461 461
    return SparseMap<K, V, Compare>(map, value);
462 462
  }
463 463

	
464 464
  /// @}
465 465

	
466 466
  /// \addtogroup map_adaptors
467 467
  /// @{
468 468

	
469 469
  /// Composition of two maps
470 470

	
471 471
  /// This \ref concepts::ReadMap "read-only map" returns the
472 472
  /// composition of two given maps. That is to say, if \c m1 is of
473 473
  /// type \c M1 and \c m2 is of \c M2, then for
474 474
  /// \code
475 475
  ///   ComposeMap<M1, M2> cm(m1,m2);
476 476
  /// \endcode
477 477
  /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
478 478
  ///
479 479
  /// The \c Key type of the map is inherited from \c M2 and the
480 480
  /// \c Value type is from \c M1.
481 481
  /// \c M2::Value must be convertible to \c M1::Key.
482 482
  ///
483 483
  /// The simplest way of using this map is through the composeMap()
484 484
  /// function.
485 485
  ///
486 486
  /// \sa CombineMap
487 487
  template <typename M1, typename M2>
488 488
  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
489 489
    const M1 &_m1;
490 490
    const M2 &_m2;
491 491
  public:
492 492
    typedef MapBase<typename M2::Key, typename M1::Value> Parent;
493 493
    typedef typename Parent::Key Key;
494 494
    typedef typename Parent::Value Value;
495 495

	
496 496
    /// Constructor
497 497
    ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
498 498

	
499 499
    /// \e
500 500
    typename MapTraits<M1>::ConstReturnValue
501 501
    operator[](const Key &k) const { return _m1[_m2[k]]; }
502 502
  };
503 503

	
504 504
  /// Returns a \ref ComposeMap class
505 505

	
506 506
  /// This function just returns a \ref ComposeMap class.
507 507
  ///
508 508
  /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
509 509
  /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
510 510
  /// will be equal to <tt>m1[m2[x]]</tt>.
511 511
  ///
512 512
  /// \relates ComposeMap
513 513
  template <typename M1, typename M2>
514 514
  inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
515 515
    return ComposeMap<M1, M2>(m1, m2);
516 516
  }
517 517

	
518 518

	
519 519
  /// Combination of two maps using an STL (binary) functor.
520 520

	
521 521
  /// This \ref concepts::ReadMap "read-only map" takes two maps and a
522 522
  /// binary functor and returns the combination of the two given maps
523 523
  /// using the functor.
524 524
  /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
525 525
  /// and \c f is of \c F, then for
526 526
  /// \code
527 527
  ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
528 528
  /// \endcode
529 529
  /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
530 530
  ///
531 531
  /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
532 532
  /// must be convertible to \c M2::Key) and the \c Value type is \c V.
533 533
  /// \c M2::Value and \c M1::Value must be convertible to the
534 534
  /// corresponding input parameter of \c F and the return type of \c F
535 535
  /// must be convertible to \c V.
536 536
  ///
537 537
  /// The simplest way of using this map is through the combineMap()
538 538
  /// function.
539 539
  ///
540 540
  /// \sa ComposeMap
541 541
  template<typename M1, typename M2, typename F,
542 542
           typename V = typename F::result_type>
543 543
  class CombineMap : public MapBase<typename M1::Key, V> {
544 544
    const M1 &_m1;
545 545
    const M2 &_m2;
546 546
    F _f;
547 547
  public:
548 548
    typedef MapBase<typename M1::Key, V> Parent;
549 549
    typedef typename Parent::Key Key;
550 550
    typedef typename Parent::Value Value;
551 551

	
552 552
    /// Constructor
553 553
    CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
554 554
      : _m1(m1), _m2(m2), _f(f) {}
555 555
    /// \e
556 556
    Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
557 557
  };
558 558

	
559 559
  /// Returns a \ref CombineMap class
560 560

	
561 561
  /// This function just returns a \ref CombineMap class.
562 562
  ///
563 563
  /// For example, if \c m1 and \c m2 are both maps with \c double
564 564
  /// values, then
565 565
  /// \code
566 566
  ///   combineMap(m1,m2,std::plus<double>())
567 567
  /// \endcode
568 568
  /// is equivalent to
569 569
  /// \code
570 570
  ///   addMap(m1,m2)
571 571
  /// \endcode
572 572
  ///
573 573
  /// This function is specialized for adaptable binary function
574 574
  /// classes and C++ functions.
575 575
  ///
576 576
  /// \relates CombineMap
577 577
  template<typename M1, typename M2, typename F, typename V>
578 578
  inline CombineMap<M1, M2, F, V>
579 579
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
580 580
    return CombineMap<M1, M2, F, V>(m1,m2,f);
581 581
  }
582 582

	
583 583
  template<typename M1, typename M2, typename F>
584 584
  inline CombineMap<M1, M2, F, typename F::result_type>
585 585
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
586 586
    return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
587 587
  }
588 588

	
589 589
  template<typename M1, typename M2, typename K1, typename K2, typename V>
590 590
  inline CombineMap<M1, M2, V (*)(K1, K2), V>
591 591
  combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
592 592
    return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
593 593
  }
594 594

	
595 595

	
596 596
  /// Converts an STL style (unary) functor to a map
597 597

	
598 598
  /// This \ref concepts::ReadMap "read-only map" returns the value
599 599
  /// of a given functor. Actually, it just wraps the functor and
600 600
  /// provides the \c Key and \c Value typedefs.
601 601
  ///
602 602
  /// Template parameters \c K and \c V will become its \c Key and
603 603
  /// \c Value. In most cases they have to be given explicitly because
604 604
  /// a functor typically does not provide \c argument_type and
605 605
  /// \c result_type typedefs.
606 606
  /// Parameter \c F is the type of the used functor.
607 607
  ///
608 608
  /// The simplest way of using this map is through the functorToMap()
609 609
  /// function.
610 610
  ///
611 611
  /// \sa MapToFunctor
612 612
  template<typename F,
613 613
           typename K = typename F::argument_type,
614 614
           typename V = typename F::result_type>
615 615
  class FunctorToMap : public MapBase<K, V> {
616 616
    F _f;
617 617
  public:
618 618
    typedef MapBase<K, V> Parent;
619 619
    typedef typename Parent::Key Key;
620 620
    typedef typename Parent::Value Value;
621 621

	
622 622
    /// Constructor
623 623
    FunctorToMap(const F &f = F()) : _f(f) {}
624 624
    /// \e
625 625
    Value operator[](const Key &k) const { return _f(k); }
626 626
  };
627 627

	
628 628
  /// Returns a \ref FunctorToMap class
629 629

	
630 630
  /// This function just returns a \ref FunctorToMap class.
631 631
  ///
632 632
  /// This function is specialized for adaptable binary function
633 633
  /// classes and C++ functions.
634 634
  ///
635 635
  /// \relates FunctorToMap
636 636
  template<typename K, typename V, typename F>
637 637
  inline FunctorToMap<F, K, V> functorToMap(const F &f) {
638 638
    return FunctorToMap<F, K, V>(f);
639 639
  }
640 640

	
641 641
  template <typename F>
642 642
  inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
643 643
    functorToMap(const F &f)
644 644
  {
645 645
    return FunctorToMap<F, typename F::argument_type,
646 646
      typename F::result_type>(f);
647 647
  }
648 648

	
649 649
  template <typename K, typename V>
650 650
  inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
651 651
    return FunctorToMap<V (*)(K), K, V>(f);
652 652
  }
653 653

	
654 654

	
655 655
  /// Converts a map to an STL style (unary) functor
656 656

	
657 657
  /// This class converts a map to an STL style (unary) functor.
658 658
  /// That is it provides an <tt>operator()</tt> to read its values.
659 659
  ///
660 660
  /// For the sake of convenience it also works as a usual
661 661
  /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
662 662
  /// and the \c Key and \c Value typedefs also exist.
663 663
  ///
664 664
  /// The simplest way of using this map is through the mapToFunctor()
665 665
  /// function.
666 666
  ///
667 667
  ///\sa FunctorToMap
668 668
  template <typename M>
669 669
  class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
670 670
    const M &_m;
671 671
  public:
672 672
    typedef MapBase<typename M::Key, typename M::Value> Parent;
673 673
    typedef typename Parent::Key Key;
674 674
    typedef typename Parent::Value Value;
675 675

	
676 676
    typedef typename Parent::Key argument_type;
677 677
    typedef typename Parent::Value result_type;
678 678

	
679 679
    /// Constructor
680 680
    MapToFunctor(const M &m) : _m(m) {}
681 681
    /// \e
682 682
    Value operator()(const Key &k) const { return _m[k]; }
683 683
    /// \e
684 684
    Value operator[](const Key &k) const { return _m[k]; }
685 685
  };
686 686

	
687 687
  /// Returns a \ref MapToFunctor class
688 688

	
689 689
  /// This function just returns a \ref MapToFunctor class.
690 690
  /// \relates MapToFunctor
691 691
  template<typename M>
692 692
  inline MapToFunctor<M> mapToFunctor(const M &m) {
693 693
    return MapToFunctor<M>(m);
694 694
  }
695 695

	
696 696

	
697 697
  /// \brief Map adaptor to convert the \c Value type of a map to
698 698
  /// another type using the default conversion.
699 699

	
700 700
  /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
701 701
  /// "readable map" to another type using the default conversion.
702 702
  /// The \c Key type of it is inherited from \c M and the \c Value
703 703
  /// type is \c V.
704 704
  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
705 705
  ///
706 706
  /// The simplest way of using this map is through the convertMap()
707 707
  /// function.
708 708
  template <typename M, typename V>
709 709
  class ConvertMap : public MapBase<typename M::Key, V> {
710 710
    const M &_m;
711 711
  public:
712 712
    typedef MapBase<typename M::Key, V> Parent;
713 713
    typedef typename Parent::Key Key;
714 714
    typedef typename Parent::Value Value;
715 715

	
716 716
    /// Constructor
717 717

	
718 718
    /// Constructor.
719 719
    /// \param m The underlying map.
720 720
    ConvertMap(const M &m) : _m(m) {}
721 721

	
722 722
    /// \e
723 723
    Value operator[](const Key &k) const { return _m[k]; }
724 724
  };
725 725

	
726 726
  /// Returns a \ref ConvertMap class
727 727

	
728 728
  /// This function just returns a \ref ConvertMap class.
729 729
  /// \relates ConvertMap
730 730
  template<typename V, typename M>
731 731
  inline ConvertMap<M, V> convertMap(const M &map) {
732 732
    return ConvertMap<M, V>(map);
733 733
  }
734 734

	
735 735

	
736 736
  /// Applies all map setting operations to two maps
737 737

	
738 738
  /// This map has two \ref concepts::WriteMap "writable map" parameters
739 739
  /// and each write request will be passed to both of them.
740 740
  /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
741 741
  /// operations will return the corresponding values of \c M1.
742 742
  ///
743 743
  /// The \c Key and \c Value types are inherited from \c M1.
744 744
  /// The \c Key and \c Value of \c M2 must be convertible from those
745 745
  /// of \c M1.
746 746
  ///
747 747
  /// The simplest way of using this map is through the forkMap()
748 748
  /// function.
749 749
  template<typename  M1, typename M2>
750 750
  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
751 751
    M1 &_m1;
752 752
    M2 &_m2;
753 753
  public:
754 754
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
755 755
    typedef typename Parent::Key Key;
756 756
    typedef typename Parent::Value Value;
757 757

	
758 758
    /// Constructor
759 759
    ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
760 760
    /// Returns the value associated with the given key in the first map.
761 761
    Value operator[](const Key &k) const { return _m1[k]; }
762 762
    /// Sets the value associated with the given key in both maps.
763 763
    void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
764 764
  };
765 765

	
766 766
  /// Returns a \ref ForkMap class
767 767

	
768 768
  /// This function just returns a \ref ForkMap class.
769 769
  /// \relates ForkMap
770 770
  template <typename M1, typename M2>
771 771
  inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
772 772
    return ForkMap<M1,M2>(m1,m2);
773 773
  }
774 774

	
775 775

	
776 776
  /// Sum of two maps
777 777

	
778 778
  /// This \ref concepts::ReadMap "read-only map" returns the sum
779 779
  /// of the values of the two given maps.
780 780
  /// Its \c Key and \c Value types are inherited from \c M1.
781 781
  /// The \c Key and \c Value of \c M2 must be convertible to those of
782 782
  /// \c M1.
783 783
  ///
784 784
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
785 785
  /// \code
786 786
  ///   AddMap<M1,M2> am(m1,m2);
787 787
  /// \endcode
788 788
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
789 789
  ///
790 790
  /// The simplest way of using this map is through the addMap()
791 791
  /// function.
792 792
  ///
793 793
  /// \sa SubMap, MulMap, DivMap
794 794
  /// \sa ShiftMap, ShiftWriteMap
795 795
  template<typename M1, typename M2>
796 796
  class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
797 797
    const M1 &_m1;
798 798
    const M2 &_m2;
799 799
  public:
800 800
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
801 801
    typedef typename Parent::Key Key;
802 802
    typedef typename Parent::Value Value;
803 803

	
804 804
    /// Constructor
805 805
    AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
806 806
    /// \e
807 807
    Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
808 808
  };
809 809

	
810 810
  /// Returns an \ref AddMap class
811 811

	
812 812
  /// This function just returns an \ref AddMap class.
813 813
  ///
814 814
  /// For example, if \c m1 and \c m2 are both maps with \c double
815 815
  /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
816 816
  /// <tt>m1[x]+m2[x]</tt>.
817 817
  ///
818 818
  /// \relates AddMap
819 819
  template<typename M1, typename M2>
820 820
  inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
821 821
    return AddMap<M1, M2>(m1,m2);
822 822
  }
823 823

	
824 824

	
825 825
  /// Difference of two maps
826 826

	
827 827
  /// This \ref concepts::ReadMap "read-only map" returns the difference
828 828
  /// of the values of the two given maps.
829 829
  /// Its \c Key and \c Value types are inherited from \c M1.
830 830
  /// The \c Key and \c Value of \c M2 must be convertible to those of
831 831
  /// \c M1.
832 832
  ///
833 833
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
834 834
  /// \code
835 835
  ///   SubMap<M1,M2> sm(m1,m2);
836 836
  /// \endcode
837 837
  /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
838 838
  ///
839 839
  /// The simplest way of using this map is through the subMap()
840 840
  /// function.
841 841
  ///
842 842
  /// \sa AddMap, MulMap, DivMap
843 843
  template<typename M1, typename M2>
844 844
  class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
845 845
    const M1 &_m1;
846 846
    const M2 &_m2;
847 847
  public:
848 848
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
849 849
    typedef typename Parent::Key Key;
850 850
    typedef typename Parent::Value Value;
851 851

	
852 852
    /// Constructor
853 853
    SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
854 854
    /// \e
855 855
    Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
856 856
  };
857 857

	
858 858
  /// Returns a \ref SubMap class
859 859

	
860 860
  /// This function just returns a \ref SubMap class.
861 861
  ///
862 862
  /// For example, if \c m1 and \c m2 are both maps with \c double
863 863
  /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
864 864
  /// <tt>m1[x]-m2[x]</tt>.
865 865
  ///
866 866
  /// \relates SubMap
867 867
  template<typename M1, typename M2>
868 868
  inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
869 869
    return SubMap<M1, M2>(m1,m2);
870 870
  }
871 871

	
872 872

	
873 873
  /// Product of two maps
874 874

	
875 875
  /// This \ref concepts::ReadMap "read-only map" returns the product
876 876
  /// of the values of the two given maps.
877 877
  /// Its \c Key and \c Value types are inherited from \c M1.
878 878
  /// The \c Key and \c Value of \c M2 must be convertible to those of
879 879
  /// \c M1.
880 880
  ///
881 881
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
882 882
  /// \code
883 883
  ///   MulMap<M1,M2> mm(m1,m2);
884 884
  /// \endcode
885 885
  /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
886 886
  ///
887 887
  /// The simplest way of using this map is through the mulMap()
888 888
  /// function.
889 889
  ///
890 890
  /// \sa AddMap, SubMap, DivMap
891 891
  /// \sa ScaleMap, ScaleWriteMap
892 892
  template<typename M1, typename M2>
893 893
  class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
894 894
    const M1 &_m1;
895 895
    const M2 &_m2;
896 896
  public:
897 897
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
898 898
    typedef typename Parent::Key Key;
899 899
    typedef typename Parent::Value Value;
900 900

	
901 901
    /// Constructor
902 902
    MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
903 903
    /// \e
904 904
    Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
905 905
  };
906 906

	
907 907
  /// Returns a \ref MulMap class
908 908

	
909 909
  /// This function just returns a \ref MulMap class.
910 910
  ///
911 911
  /// For example, if \c m1 and \c m2 are both maps with \c double
912 912
  /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
913 913
  /// <tt>m1[x]*m2[x]</tt>.
914 914
  ///
915 915
  /// \relates MulMap
916 916
  template<typename M1, typename M2>
917 917
  inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
918 918
    return MulMap<M1, M2>(m1,m2);
919 919
  }
920 920

	
921 921

	
922 922
  /// Quotient of two maps
923 923

	
924 924
  /// This \ref concepts::ReadMap "read-only map" returns the quotient
925 925
  /// of the values of the two given maps.
926 926
  /// Its \c Key and \c Value types are inherited from \c M1.
927 927
  /// The \c Key and \c Value of \c M2 must be convertible to those of
928 928
  /// \c M1.
929 929
  ///
930 930
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
931 931
  /// \code
932 932
  ///   DivMap<M1,M2> dm(m1,m2);
933 933
  /// \endcode
934 934
  /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
935 935
  ///
936 936
  /// The simplest way of using this map is through the divMap()
937 937
  /// function.
938 938
  ///
939 939
  /// \sa AddMap, SubMap, MulMap
940 940
  template<typename M1, typename M2>
941 941
  class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
942 942
    const M1 &_m1;
943 943
    const M2 &_m2;
944 944
  public:
945 945
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
946 946
    typedef typename Parent::Key Key;
947 947
    typedef typename Parent::Value Value;
948 948

	
949 949
    /// Constructor
950 950
    DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
951 951
    /// \e
952 952
    Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
953 953
  };
954 954

	
955 955
  /// Returns a \ref DivMap class
956 956

	
957 957
  /// This function just returns a \ref DivMap class.
958 958
  ///
959 959
  /// For example, if \c m1 and \c m2 are both maps with \c double
960 960
  /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
961 961
  /// <tt>m1[x]/m2[x]</tt>.
962 962
  ///
963 963
  /// \relates DivMap
964 964
  template<typename M1, typename M2>
965 965
  inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
966 966
    return DivMap<M1, M2>(m1,m2);
967 967
  }
968 968

	
969 969

	
970 970
  /// Shifts a map with a constant.
971 971

	
972 972
  /// This \ref concepts::ReadMap "read-only map" returns the sum of
973 973
  /// the given map and a constant value (i.e. it shifts the map with
974 974
  /// the constant). Its \c Key and \c Value are inherited from \c M.
975 975
  ///
976 976
  /// Actually,
977 977
  /// \code
978 978
  ///   ShiftMap<M> sh(m,v);
979 979
  /// \endcode
980 980
  /// is equivalent to
981 981
  /// \code
982 982
  ///   ConstMap<M::Key, M::Value> cm(v);
983 983
  ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
984 984
  /// \endcode
985 985
  ///
986 986
  /// The simplest way of using this map is through the shiftMap()
987 987
  /// function.
988 988
  ///
989 989
  /// \sa ShiftWriteMap
990 990
  template<typename M, typename C = typename M::Value>
991 991
  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
992 992
    const M &_m;
993 993
    C _v;
994 994
  public:
995 995
    typedef MapBase<typename M::Key, typename M::Value> Parent;
996 996
    typedef typename Parent::Key Key;
997 997
    typedef typename Parent::Value Value;
998 998

	
999 999
    /// Constructor
1000 1000

	
1001 1001
    /// Constructor.
1002 1002
    /// \param m The undelying map.
1003 1003
    /// \param v The constant value.
1004 1004
    ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
1005 1005
    /// \e
1006 1006
    Value operator[](const Key &k) const { return _m[k]+_v; }
1007 1007
  };
1008 1008

	
1009 1009
  /// Shifts a map with a constant (read-write version).
1010 1010

	
1011 1011
  /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
1012 1012
  /// of the given map and a constant value (i.e. it shifts the map with
1013 1013
  /// the constant). Its \c Key and \c Value are inherited from \c M.
1014 1014
  /// It makes also possible to write the map.
1015 1015
  ///
1016 1016
  /// The simplest way of using this map is through the shiftWriteMap()
1017 1017
  /// function.
1018 1018
  ///
1019 1019
  /// \sa ShiftMap
1020 1020
  template<typename M, typename C = typename M::Value>
1021 1021
  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
1022 1022
    M &_m;
1023 1023
    C _v;
1024 1024
  public:
1025 1025
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1026 1026
    typedef typename Parent::Key Key;
1027 1027
    typedef typename Parent::Value Value;
1028 1028

	
1029 1029
    /// Constructor
1030 1030

	
1031 1031
    /// Constructor.
1032 1032
    /// \param m The undelying map.
1033 1033
    /// \param v The constant value.
1034 1034
    ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1035 1035
    /// \e
1036 1036
    Value operator[](const Key &k) const { return _m[k]+_v; }
1037 1037
    /// \e
1038 1038
    void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
1039 1039
  };
1040 1040

	
1041 1041
  /// Returns a \ref ShiftMap class
1042 1042

	
1043 1043
  /// This function just returns a \ref ShiftMap class.
1044 1044
  ///
1045 1045
  /// For example, if \c m is a map with \c double values and \c v is
1046 1046
  /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
1047 1047
  /// <tt>m[x]+v</tt>.
1048 1048
  ///
1049 1049
  /// \relates ShiftMap
1050 1050
  template<typename M, typename C>
1051 1051
  inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
1052 1052
    return ShiftMap<M, C>(m,v);
1053 1053
  }
1054 1054

	
1055 1055
  /// Returns a \ref ShiftWriteMap class
1056 1056

	
1057 1057
  /// This function just returns a \ref ShiftWriteMap class.
1058 1058
  ///
1059 1059
  /// For example, if \c m is a map with \c double values and \c v is
1060 1060
  /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
1061 1061
  /// <tt>m[x]+v</tt>.
1062 1062
  /// Moreover it makes also possible to write the map.
1063 1063
  ///
1064 1064
  /// \relates ShiftWriteMap
1065 1065
  template<typename M, typename C>
1066 1066
  inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
1067 1067
    return ShiftWriteMap<M, C>(m,v);
1068 1068
  }
1069 1069

	
1070 1070

	
1071 1071
  /// Scales a map with a constant.
1072 1072

	
1073 1073
  /// This \ref concepts::ReadMap "read-only map" returns the value of
1074 1074
  /// the given map multiplied from the left side with a constant value.
1075 1075
  /// Its \c Key and \c Value are inherited from \c M.
1076 1076
  ///
1077 1077
  /// Actually,
1078 1078
  /// \code
1079 1079
  ///   ScaleMap<M> sc(m,v);
1080 1080
  /// \endcode
1081 1081
  /// is equivalent to
1082 1082
  /// \code
1083 1083
  ///   ConstMap<M::Key, M::Value> cm(v);
1084 1084
  ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
1085 1085
  /// \endcode
1086 1086
  ///
1087 1087
  /// The simplest way of using this map is through the scaleMap()
1088 1088
  /// function.
1089 1089
  ///
1090 1090
  /// \sa ScaleWriteMap
1091 1091
  template<typename M, typename C = typename M::Value>
1092 1092
  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
1093 1093
    const M &_m;
1094 1094
    C _v;
1095 1095
  public:
1096 1096
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1097 1097
    typedef typename Parent::Key Key;
1098 1098
    typedef typename Parent::Value Value;
1099 1099

	
1100 1100
    /// Constructor
1101 1101

	
1102 1102
    /// Constructor.
1103 1103
    /// \param m The undelying map.
1104 1104
    /// \param v The constant value.
1105 1105
    ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
1106 1106
    /// \e
1107 1107
    Value operator[](const Key &k) const { return _v*_m[k]; }
1108 1108
  };
1109 1109

	
1110 1110
  /// Scales a map with a constant (read-write version).
1111 1111

	
1112 1112
  /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
1113 1113
  /// the given map multiplied from the left side with a constant value.
1114 1114
  /// Its \c Key and \c Value are inherited from \c M.
1115 1115
  /// It can also be used as write map if the \c / operator is defined
1116 1116
  /// between \c Value and \c C and the given multiplier is not zero.
1117 1117
  ///
1118 1118
  /// The simplest way of using this map is through the scaleWriteMap()
1119 1119
  /// function.
1120 1120
  ///
1121 1121
  /// \sa ScaleMap
1122 1122
  template<typename M, typename C = typename M::Value>
1123 1123
  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
1124 1124
    M &_m;
1125 1125
    C _v;
1126 1126
  public:
1127 1127
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1128 1128
    typedef typename Parent::Key Key;
1129 1129
    typedef typename Parent::Value Value;
1130 1130

	
1131 1131
    /// Constructor
1132 1132

	
1133 1133
    /// Constructor.
1134 1134
    /// \param m The undelying map.
1135 1135
    /// \param v The constant value.
1136 1136
    ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1137 1137
    /// \e
1138 1138
    Value operator[](const Key &k) const { return _v*_m[k]; }
1139 1139
    /// \e
1140 1140
    void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
1141 1141
  };
1142 1142

	
1143 1143
  /// Returns a \ref ScaleMap class
1144 1144

	
1145 1145
  /// This function just returns a \ref ScaleMap class.
1146 1146
  ///
1147 1147
  /// For example, if \c m is a map with \c double values and \c v is
1148 1148
  /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
1149 1149
  /// <tt>v*m[x]</tt>.
1150 1150
  ///
1151 1151
  /// \relates ScaleMap
1152 1152
  template<typename M, typename C>
1153 1153
  inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
1154 1154
    return ScaleMap<M, C>(m,v);
1155 1155
  }
1156 1156

	
1157 1157
  /// Returns a \ref ScaleWriteMap class
1158 1158

	
1159 1159
  /// This function just returns a \ref ScaleWriteMap class.
1160 1160
  ///
1161 1161
  /// For example, if \c m is a map with \c double values and \c v is
1162 1162
  /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
1163 1163
  /// <tt>v*m[x]</tt>.
1164 1164
  /// Moreover it makes also possible to write the map.
1165 1165
  ///
1166 1166
  /// \relates ScaleWriteMap
1167 1167
  template<typename M, typename C>
1168 1168
  inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
1169 1169
    return ScaleWriteMap<M, C>(m,v);
1170 1170
  }
1171 1171

	
1172 1172

	
1173 1173
  /// Negative of a map
1174 1174

	
1175 1175
  /// This \ref concepts::ReadMap "read-only map" returns the negative
1176 1176
  /// of the values of the given map (using the unary \c - operator).
1177 1177
  /// Its \c Key and \c Value are inherited from \c M.
1178 1178
  ///
1179 1179
  /// If M::Value is \c int, \c double etc., then
1180 1180
  /// \code
1181 1181
  ///   NegMap<M> neg(m);
1182 1182
  /// \endcode
1183 1183
  /// is equivalent to
1184 1184
  /// \code
1185 1185
  ///   ScaleMap<M> neg(m,-1);
1186 1186
  /// \endcode
1187 1187
  ///
1188 1188
  /// The simplest way of using this map is through the negMap()
1189 1189
  /// function.
1190 1190
  ///
1191 1191
  /// \sa NegWriteMap
1192 1192
  template<typename M>
1193 1193
  class NegMap : public MapBase<typename M::Key, typename M::Value> {
1194 1194
    const M& _m;
1195 1195
  public:
1196 1196
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1197 1197
    typedef typename Parent::Key Key;
1198 1198
    typedef typename Parent::Value Value;
1199 1199

	
1200 1200
    /// Constructor
1201 1201
    NegMap(const M &m) : _m(m) {}
1202 1202
    /// \e
1203 1203
    Value operator[](const Key &k) const { return -_m[k]; }
1204 1204
  };
1205 1205

	
1206 1206
  /// Negative of a map (read-write version)
1207 1207

	
1208 1208
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1209 1209
  /// negative of the values of the given map (using the unary \c -
1210 1210
  /// operator).
1211 1211
  /// Its \c Key and \c Value are inherited from \c M.
1212 1212
  /// It makes also possible to write the map.
1213 1213
  ///
1214 1214
  /// If M::Value is \c int, \c double etc., then
1215 1215
  /// \code
1216 1216
  ///   NegWriteMap<M> neg(m);
1217 1217
  /// \endcode
1218 1218
  /// is equivalent to
1219 1219
  /// \code
1220 1220
  ///   ScaleWriteMap<M> neg(m,-1);
1221 1221
  /// \endcode
1222 1222
  ///
1223 1223
  /// The simplest way of using this map is through the negWriteMap()
1224 1224
  /// function.
1225 1225
  ///
1226 1226
  /// \sa NegMap
1227 1227
  template<typename M>
1228 1228
  class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
1229 1229
    M &_m;
1230 1230
  public:
1231 1231
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1232 1232
    typedef typename Parent::Key Key;
1233 1233
    typedef typename Parent::Value Value;
1234 1234

	
1235 1235
    /// Constructor
1236 1236
    NegWriteMap(M &m) : _m(m) {}
1237 1237
    /// \e
1238 1238
    Value operator[](const Key &k) const { return -_m[k]; }
1239 1239
    /// \e
1240 1240
    void set(const Key &k, const Value &v) { _m.set(k, -v); }
1241 1241
  };
1242 1242

	
1243 1243
  /// Returns a \ref NegMap class
1244 1244

	
1245 1245
  /// This function just returns a \ref NegMap class.
1246 1246
  ///
1247 1247
  /// For example, if \c m is a map with \c double values, then
1248 1248
  /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1249 1249
  ///
1250 1250
  /// \relates NegMap
1251 1251
  template <typename M>
1252 1252
  inline NegMap<M> negMap(const M &m) {
1253 1253
    return NegMap<M>(m);
1254 1254
  }
1255 1255

	
1256 1256
  /// Returns a \ref NegWriteMap class
1257 1257

	
1258 1258
  /// This function just returns a \ref NegWriteMap class.
1259 1259
  ///
1260 1260
  /// For example, if \c m is a map with \c double values, then
1261 1261
  /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1262 1262
  /// Moreover it makes also possible to write the map.
1263 1263
  ///
1264 1264
  /// \relates NegWriteMap
1265 1265
  template <typename M>
1266 1266
  inline NegWriteMap<M> negWriteMap(M &m) {
1267 1267
    return NegWriteMap<M>(m);
1268 1268
  }
1269 1269

	
1270 1270

	
1271 1271
  /// Absolute value of a map
1272 1272

	
1273 1273
  /// This \ref concepts::ReadMap "read-only map" returns the absolute
1274 1274
  /// value of the values of the given map.
1275 1275
  /// Its \c Key and \c Value are inherited from \c M.
1276 1276
  /// \c Value must be comparable to \c 0 and the unary \c -
1277 1277
  /// operator must be defined for it, of course.
1278 1278
  ///
1279 1279
  /// The simplest way of using this map is through the absMap()
1280 1280
  /// function.
1281 1281
  template<typename M>
1282 1282
  class AbsMap : public MapBase<typename M::Key, typename M::Value> {
1283 1283
    const M &_m;
1284 1284
  public:
1285 1285
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1286 1286
    typedef typename Parent::Key Key;
1287 1287
    typedef typename Parent::Value Value;
1288 1288

	
1289 1289
    /// Constructor
1290 1290
    AbsMap(const M &m) : _m(m) {}
1291 1291
    /// \e
1292 1292
    Value operator[](const Key &k) const {
1293 1293
      Value tmp = _m[k];
1294 1294
      return tmp >= 0 ? tmp : -tmp;
1295 1295
    }
1296 1296

	
1297 1297
  };
1298 1298

	
1299 1299
  /// Returns an \ref AbsMap class
1300 1300

	
1301 1301
  /// This function just returns an \ref AbsMap class.
1302 1302
  ///
1303 1303
  /// For example, if \c m is a map with \c double values, then
1304 1304
  /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
1305 1305
  /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
1306 1306
  /// negative.
1307 1307
  ///
1308 1308
  /// \relates AbsMap
1309 1309
  template<typename M>
1310 1310
  inline AbsMap<M> absMap(const M &m) {
1311 1311
    return AbsMap<M>(m);
1312 1312
  }
1313 1313

	
1314 1314
  /// @}
1315 1315

	
1316 1316
  // Logical maps and map adaptors:
1317 1317

	
1318 1318
  /// \addtogroup maps
1319 1319
  /// @{
1320 1320

	
1321 1321
  /// Constant \c true map.
1322 1322

	
1323 1323
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1324 1324
  /// each key.
1325 1325
  ///
1326 1326
  /// Note that
1327 1327
  /// \code
1328 1328
  ///   TrueMap<K> tm;
1329 1329
  /// \endcode
1330 1330
  /// is equivalent to
1331 1331
  /// \code
1332 1332
  ///   ConstMap<K,bool> tm(true);
1333 1333
  /// \endcode
1334 1334
  ///
1335 1335
  /// \sa FalseMap
1336 1336
  /// \sa ConstMap
1337 1337
  template <typename K>
1338 1338
  class TrueMap : public MapBase<K, bool> {
1339 1339
  public:
1340 1340
    typedef MapBase<K, bool> Parent;
1341 1341
    typedef typename Parent::Key Key;
1342 1342
    typedef typename Parent::Value Value;
1343 1343

	
1344 1344
    /// Gives back \c true.
1345 1345
    Value operator[](const Key&) const { return true; }
1346 1346
  };
1347 1347

	
1348 1348
  /// Returns a \ref TrueMap class
1349 1349

	
1350 1350
  /// This function just returns a \ref TrueMap class.
1351 1351
  /// \relates TrueMap
1352 1352
  template<typename K>
1353 1353
  inline TrueMap<K> trueMap() {
1354 1354
    return TrueMap<K>();
1355 1355
  }
1356 1356

	
1357 1357

	
1358 1358
  /// Constant \c false map.
1359 1359

	
1360 1360
  /// This \ref concepts::ReadMap "read-only map" assigns \c false to
1361 1361
  /// each key.
1362 1362
  ///
1363 1363
  /// Note that
1364 1364
  /// \code
1365 1365
  ///   FalseMap<K> fm;
1366 1366
  /// \endcode
1367 1367
  /// is equivalent to
1368 1368
  /// \code
1369 1369
  ///   ConstMap<K,bool> fm(false);
1370 1370
  /// \endcode
1371 1371
  ///
1372 1372
  /// \sa TrueMap
1373 1373
  /// \sa ConstMap
1374 1374
  template <typename K>
1375 1375
  class FalseMap : public MapBase<K, bool> {
1376 1376
  public:
1377 1377
    typedef MapBase<K, bool> Parent;
1378 1378
    typedef typename Parent::Key Key;
1379 1379
    typedef typename Parent::Value Value;
1380 1380

	
1381 1381
    /// Gives back \c false.
1382 1382
    Value operator[](const Key&) const { return false; }
1383 1383
  };
1384 1384

	
1385 1385
  /// Returns a \ref FalseMap class
1386 1386

	
1387 1387
  /// This function just returns a \ref FalseMap class.
1388 1388
  /// \relates FalseMap
1389 1389
  template<typename K>
1390 1390
  inline FalseMap<K> falseMap() {
1391 1391
    return FalseMap<K>();
1392 1392
  }
1393 1393

	
1394 1394
  /// @}
1395 1395

	
1396 1396
  /// \addtogroup map_adaptors
1397 1397
  /// @{
1398 1398

	
1399 1399
  /// Logical 'and' of two maps
1400 1400

	
1401 1401
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1402 1402
  /// 'and' of the values of the two given maps.
1403 1403
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1404 1404
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1405 1405
  ///
1406 1406
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1407 1407
  /// \code
1408 1408
  ///   AndMap<M1,M2> am(m1,m2);
1409 1409
  /// \endcode
1410 1410
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
1411 1411
  ///
1412 1412
  /// The simplest way of using this map is through the andMap()
1413 1413
  /// function.
1414 1414
  ///
1415 1415
  /// \sa OrMap
1416 1416
  /// \sa NotMap, NotWriteMap
1417 1417
  template<typename M1, typename M2>
1418 1418
  class AndMap : public MapBase<typename M1::Key, bool> {
1419 1419
    const M1 &_m1;
1420 1420
    const M2 &_m2;
1421 1421
  public:
1422 1422
    typedef MapBase<typename M1::Key, bool> Parent;
1423 1423
    typedef typename Parent::Key Key;
1424 1424
    typedef typename Parent::Value Value;
1425 1425

	
1426 1426
    /// Constructor
1427 1427
    AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1428 1428
    /// \e
1429 1429
    Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
1430 1430
  };
1431 1431

	
1432 1432
  /// Returns an \ref AndMap class
1433 1433

	
1434 1434
  /// This function just returns an \ref AndMap class.
1435 1435
  ///
1436 1436
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1437 1437
  /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
1438 1438
  /// <tt>m1[x]&&m2[x]</tt>.
1439 1439
  ///
1440 1440
  /// \relates AndMap
1441 1441
  template<typename M1, typename M2>
1442 1442
  inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
1443 1443
    return AndMap<M1, M2>(m1,m2);
1444 1444
  }
1445 1445

	
1446 1446

	
1447 1447
  /// Logical 'or' of two maps
1448 1448

	
1449 1449
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1450 1450
  /// 'or' of the values of the two given maps.
1451 1451
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1452 1452
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1453 1453
  ///
1454 1454
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1455 1455
  /// \code
1456 1456
  ///   OrMap<M1,M2> om(m1,m2);
1457 1457
  /// \endcode
1458 1458
  /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
1459 1459
  ///
1460 1460
  /// The simplest way of using this map is through the orMap()
1461 1461
  /// function.
1462 1462
  ///
1463 1463
  /// \sa AndMap
1464 1464
  /// \sa NotMap, NotWriteMap
1465 1465
  template<typename M1, typename M2>
1466 1466
  class OrMap : public MapBase<typename M1::Key, bool> {
1467 1467
    const M1 &_m1;
1468 1468
    const M2 &_m2;
1469 1469
  public:
1470 1470
    typedef MapBase<typename M1::Key, bool> Parent;
1471 1471
    typedef typename Parent::Key Key;
1472 1472
    typedef typename Parent::Value Value;
1473 1473

	
1474 1474
    /// Constructor
1475 1475
    OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1476 1476
    /// \e
1477 1477
    Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
1478 1478
  };
1479 1479

	
1480 1480
  /// Returns an \ref OrMap class
1481 1481

	
1482 1482
  /// This function just returns an \ref OrMap class.
1483 1483
  ///
1484 1484
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1485 1485
  /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
1486 1486
  /// <tt>m1[x]||m2[x]</tt>.
1487 1487
  ///
1488 1488
  /// \relates OrMap
1489 1489
  template<typename M1, typename M2>
1490 1490
  inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
1491 1491
    return OrMap<M1, M2>(m1,m2);
1492 1492
  }
1493 1493

	
1494 1494

	
1495 1495
  /// Logical 'not' of a map
1496 1496

	
1497 1497
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1498 1498
  /// negation of the values of the given map.
1499 1499
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1500 1500
  ///
1501 1501
  /// The simplest way of using this map is through the notMap()
1502 1502
  /// function.
1503 1503
  ///
1504 1504
  /// \sa NotWriteMap
1505 1505
  template <typename M>
1506 1506
  class NotMap : public MapBase<typename M::Key, bool> {
1507 1507
    const M &_m;
1508 1508
  public:
1509 1509
    typedef MapBase<typename M::Key, bool> Parent;
1510 1510
    typedef typename Parent::Key Key;
1511 1511
    typedef typename Parent::Value Value;
1512 1512

	
1513 1513
    /// Constructor
1514 1514
    NotMap(const M &m) : _m(m) {}
1515 1515
    /// \e
1516 1516
    Value operator[](const Key &k) const { return !_m[k]; }
1517 1517
  };
1518 1518

	
1519 1519
  /// Logical 'not' of a map (read-write version)
1520 1520

	
1521 1521
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1522 1522
  /// logical negation of the values of the given map.
1523 1523
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1524 1524
  /// It makes also possible to write the map. When a value is set,
1525 1525
  /// the opposite value is set to the original map.
1526 1526
  ///
1527 1527
  /// The simplest way of using this map is through the notWriteMap()
1528 1528
  /// function.
1529 1529
  ///
1530 1530
  /// \sa NotMap
1531 1531
  template <typename M>
1532 1532
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1533 1533
    M &_m;
1534 1534
  public:
1535 1535
    typedef MapBase<typename M::Key, bool> Parent;
1536 1536
    typedef typename Parent::Key Key;
1537 1537
    typedef typename Parent::Value Value;
1538 1538

	
1539 1539
    /// Constructor
1540 1540
    NotWriteMap(M &m) : _m(m) {}
1541 1541
    /// \e
1542 1542
    Value operator[](const Key &k) const { return !_m[k]; }
1543 1543
    /// \e
1544 1544
    void set(const Key &k, bool v) { _m.set(k, !v); }
1545 1545
  };
1546 1546

	
1547 1547
  /// Returns a \ref NotMap class
1548 1548

	
1549 1549
  /// This function just returns a \ref NotMap class.
1550 1550
  ///
1551 1551
  /// For example, if \c m is a map with \c bool values, then
1552 1552
  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1553 1553
  ///
1554 1554
  /// \relates NotMap
1555 1555
  template <typename M>
1556 1556
  inline NotMap<M> notMap(const M &m) {
1557 1557
    return NotMap<M>(m);
1558 1558
  }
1559 1559

	
1560 1560
  /// Returns a \ref NotWriteMap class
1561 1561

	
1562 1562
  /// This function just returns a \ref NotWriteMap class.
1563 1563
  ///
1564 1564
  /// For example, if \c m is a map with \c bool values, then
1565 1565
  /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1566 1566
  /// Moreover it makes also possible to write the map.
1567 1567
  ///
1568 1568
  /// \relates NotWriteMap
1569 1569
  template <typename M>
1570 1570
  inline NotWriteMap<M> notWriteMap(M &m) {
1571 1571
    return NotWriteMap<M>(m);
1572 1572
  }
1573 1573

	
1574 1574

	
1575 1575
  /// Combination of two maps using the \c == operator
1576 1576

	
1577 1577
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1578 1578
  /// the keys for which the corresponding values of the two maps are
1579 1579
  /// equal.
1580 1580
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1581 1581
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1582 1582
  ///
1583 1583
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1584 1584
  /// \code
1585 1585
  ///   EqualMap<M1,M2> em(m1,m2);
1586 1586
  /// \endcode
1587 1587
  /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1588 1588
  ///
1589 1589
  /// The simplest way of using this map is through the equalMap()
1590 1590
  /// function.
1591 1591
  ///
1592 1592
  /// \sa LessMap
1593 1593
  template<typename M1, typename M2>
1594 1594
  class EqualMap : public MapBase<typename M1::Key, bool> {
1595 1595
    const M1 &_m1;
1596 1596
    const M2 &_m2;
1597 1597
  public:
1598 1598
    typedef MapBase<typename M1::Key, bool> Parent;
1599 1599
    typedef typename Parent::Key Key;
1600 1600
    typedef typename Parent::Value Value;
1601 1601

	
1602 1602
    /// Constructor
1603 1603
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1604 1604
    /// \e
1605 1605
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1606 1606
  };
1607 1607

	
1608 1608
  /// Returns an \ref EqualMap class
1609 1609

	
1610 1610
  /// This function just returns an \ref EqualMap class.
1611 1611
  ///
1612 1612
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1613 1613
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1614 1614
  /// <tt>m1[x]==m2[x]</tt>.
1615 1615
  ///
1616 1616
  /// \relates EqualMap
1617 1617
  template<typename M1, typename M2>
1618 1618
  inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1619 1619
    return EqualMap<M1, M2>(m1,m2);
1620 1620
  }
1621 1621

	
1622 1622

	
1623 1623
  /// Combination of two maps using the \c < operator
1624 1624

	
1625 1625
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1626 1626
  /// the keys for which the corresponding value of the first map is
1627 1627
  /// less then the value of the second map.
1628 1628
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1629 1629
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1630 1630
  ///
1631 1631
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1632 1632
  /// \code
1633 1633
  ///   LessMap<M1,M2> lm(m1,m2);
1634 1634
  /// \endcode
1635 1635
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1636 1636
  ///
1637 1637
  /// The simplest way of using this map is through the lessMap()
1638 1638
  /// function.
1639 1639
  ///
1640 1640
  /// \sa EqualMap
1641 1641
  template<typename M1, typename M2>
1642 1642
  class LessMap : public MapBase<typename M1::Key, bool> {
1643 1643
    const M1 &_m1;
1644 1644
    const M2 &_m2;
1645 1645
  public:
1646 1646
    typedef MapBase<typename M1::Key, bool> Parent;
1647 1647
    typedef typename Parent::Key Key;
1648 1648
    typedef typename Parent::Value Value;
1649 1649

	
1650 1650
    /// Constructor
1651 1651
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1652 1652
    /// \e
1653 1653
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1654 1654
  };
1655 1655

	
1656 1656
  /// Returns an \ref LessMap class
1657 1657

	
1658 1658
  /// This function just returns an \ref LessMap class.
1659 1659
  ///
1660 1660
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1661 1661
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1662 1662
  /// <tt>m1[x]<m2[x]</tt>.
1663 1663
  ///
1664 1664
  /// \relates LessMap
1665 1665
  template<typename M1, typename M2>
1666 1666
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1667 1667
    return LessMap<M1, M2>(m1,m2);
1668 1668
  }
1669 1669

	
1670 1670
  namespace _maps_bits {
1671 1671

	
1672 1672
    template <typename _Iterator, typename Enable = void>
1673 1673
    struct IteratorTraits {
1674 1674
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1675 1675
    };
1676 1676

	
1677 1677
    template <typename _Iterator>
1678 1678
    struct IteratorTraits<_Iterator,
1679 1679
      typename exists<typename _Iterator::container_type>::type>
1680 1680
    {
1681 1681
      typedef typename _Iterator::container_type::value_type Value;
1682 1682
    };
1683 1683

	
1684 1684
  }
1685 1685

	
1686 1686
  /// \brief Writable bool map for logging each \c true assigned element
1687 1687
  ///
1688 1688
  /// A \ref concepts::WriteMap "writable" bool map for logging
1689 1689
  /// each \c true assigned element, i.e it copies subsequently each
1690 1690
  /// keys set to \c true to the given iterator.
1691 1691
  /// The most important usage of it is storing certain nodes or arcs
1692 1692
  /// that were marked \c true by an algorithm.
1693 1693
  ///
1694 1694
  /// There are several algorithms that provide solutions through bool
1695 1695
  /// maps and most of them assign \c true at most once for each key.
1696 1696
  /// In these cases it is a natural request to store each \c true
1697 1697
  /// assigned elements (in order of the assignment), which can be
1698 1698
  /// easily done with LoggerBoolMap.
1699 1699
  ///
1700 1700
  /// The simplest way of using this map is through the loggerBoolMap()
1701 1701
  /// function.
1702 1702
  ///
1703 1703
  /// \tparam It The type of the iterator.
1704 1704
  /// \tparam Ke The key type of the map. The default value set
1705 1705
  /// according to the iterator type should work in most cases.
1706 1706
  ///
1707 1707
  /// \note The container of the iterator must contain enough space
1708 1708
  /// for the elements or the iterator should be an inserter iterator.
1709 1709
#ifdef DOXYGEN
1710 1710
  template <typename It, typename Ke>
1711 1711
#else
1712 1712
  template <typename It,
1713 1713
            typename Ke=typename _maps_bits::IteratorTraits<It>::Value>
1714 1714
#endif
1715 1715
  class LoggerBoolMap {
1716 1716
  public:
1717 1717
    typedef It Iterator;
1718 1718

	
1719 1719
    typedef Ke Key;
1720 1720
    typedef bool Value;
1721 1721

	
1722 1722
    /// Constructor
1723 1723
    LoggerBoolMap(Iterator it)
1724 1724
      : _begin(it), _end(it) {}
1725 1725

	
1726 1726
    /// Gives back the given iterator set for the first key
1727 1727
    Iterator begin() const {
1728 1728
      return _begin;
1729 1729
    }
1730 1730

	
1731 1731
    /// Gives back the the 'after the last' iterator
1732 1732
    Iterator end() const {
1733 1733
      return _end;
1734 1734
    }
1735 1735

	
1736 1736
    /// The set function of the map
1737 1737
    void set(const Key& key, Value value) {
1738 1738
      if (value) {
1739 1739
        *_end++ = key;
1740 1740
      }
1741 1741
    }
1742 1742

	
1743 1743
  private:
1744 1744
    Iterator _begin;
1745 1745
    Iterator _end;
1746 1746
  };
1747 1747

	
1748 1748
  /// Returns a \ref LoggerBoolMap class
1749 1749

	
1750 1750
  /// This function just returns a \ref LoggerBoolMap class.
1751 1751
  ///
1752 1752
  /// The most important usage of it is storing certain nodes or arcs
1753 1753
  /// that were marked \c true by an algorithm.
1754 1754
  /// For example it makes easier to store the nodes in the processing
1755 1755
  /// order of Dfs algorithm, as the following examples show.
1756 1756
  /// \code
1757 1757
  ///   std::vector<Node> v;
1758 1758
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1759 1759
  /// \endcode
1760 1760
  /// \code
1761 1761
  ///   std::vector<Node> v(countNodes(g));
1762 1762
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1763 1763
  /// \endcode
1764 1764
  ///
1765 1765
  /// \note The container of the iterator must contain enough space
1766 1766
  /// for the elements or the iterator should be an inserter iterator.
1767 1767
  ///
1768 1768
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1769 1769
  /// it cannot be used when a readable map is needed, for example as
1770 1770
  /// \c ReachedMap for \ref Bfs, \ref Dfs and \ref Dijkstra algorithms.
1771 1771
  ///
1772 1772
  /// \relates LoggerBoolMap
1773 1773
  template<typename Iterator>
1774 1774
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1775 1775
    return LoggerBoolMap<Iterator>(it);
1776 1776
  }
1777 1777

	
1778 1778
  /// Provides an immutable and unique id for each item in the graph.
1779 1779

	
1780 1780
  /// The IdMap class provides a unique and immutable id for each item of the
1781 1781
  /// same type (e.g. node) in the graph. This id is <ul><li>\b unique:
1782 1782
  /// different items (nodes) get different ids <li>\b immutable: the id of an
1783 1783
  /// item (node) does not change (even if you delete other nodes).  </ul>
1784 1784
  /// Through this map you get access (i.e. can read) the inner id values of
1785 1785
  /// the items stored in the graph. This map can be inverted with its member
1786 1786
  /// class \c InverseMap or with the \c operator() member.
1787 1787
  ///
1788 1788
  template <typename _Graph, typename _Item>
1789 1789
  class IdMap {
1790 1790
  public:
1791 1791
    typedef _Graph Graph;
1792 1792
    typedef int Value;
1793 1793
    typedef _Item Item;
1794 1794
    typedef _Item Key;
1795 1795

	
1796 1796
    /// \brief Constructor.
1797 1797
    ///
1798 1798
    /// Constructor of the map.
1799 1799
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1800 1800

	
1801 1801
    /// \brief Gives back the \e id of the item.
1802 1802
    ///
1803 1803
    /// Gives back the immutable and unique \e id of the item.
1804 1804
    int operator[](const Item& item) const { return _graph->id(item);}
1805 1805

	
1806 1806
    /// \brief Gives back the item by its id.
1807 1807
    ///
1808 1808
    /// Gives back the item by its id.
1809 1809
    Item operator()(int id) { return _graph->fromId(id, Item()); }
1810 1810

	
1811 1811
  private:
1812 1812
    const Graph* _graph;
1813 1813

	
1814 1814
  public:
1815 1815

	
1816 1816
    /// \brief The class represents the inverse of its owner (IdMap).
1817 1817
    ///
1818 1818
    /// The class represents the inverse of its owner (IdMap).
1819 1819
    /// \see inverse()
1820 1820
    class InverseMap {
1821 1821
    public:
1822 1822

	
1823 1823
      /// \brief Constructor.
1824 1824
      ///
1825 1825
      /// Constructor for creating an id-to-item map.
1826 1826
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1827 1827

	
1828 1828
      /// \brief Constructor.
1829 1829
      ///
1830 1830
      /// Constructor for creating an id-to-item map.
1831 1831
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1832 1832

	
1833 1833
      /// \brief Gives back the given item from its id.
1834 1834
      ///
1835 1835
      /// Gives back the given item from its id.
1836 1836
      ///
1837 1837
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1838 1838

	
1839 1839
    private:
1840 1840
      const Graph* _graph;
1841 1841
    };
1842 1842

	
1843 1843
    /// \brief Gives back the inverse of the map.
1844 1844
    ///
1845 1845
    /// Gives back the inverse of the IdMap.
1846 1846
    InverseMap inverse() const { return InverseMap(*_graph);}
1847 1847

	
1848 1848
  };
1849 1849

	
1850

	
1851
  /// \brief General invertable graph-map type.
1852

	
1853
  /// This type provides simple invertable graph-maps.
1854
  /// The InvertableMap wraps an arbitrary ReadWriteMap
1855
  /// and if a key is set to a new value then store it
1856
  /// in the inverse map.
1857
  ///
1858
  /// The values of the map can be accessed
1859
  /// with stl compatible forward iterator.
1860
  ///
1861
  /// \tparam _Graph The graph type.
1862
  /// \tparam _Item The item type of the graph.
1863
  /// \tparam _Value The value type of the map.
1864
  ///
1865
  /// \see IterableValueMap
1866
  template <typename _Graph, typename _Item, typename _Value>
1867
  class InvertableMap
1868
    : protected ItemSetTraits<_Graph, _Item>::template Map<_Value>::Type {
1869
  private:
1870

	
1871
    typedef typename ItemSetTraits<_Graph, _Item>::
1872
    template Map<_Value>::Type Map;
1873
    typedef _Graph Graph;
1874

	
1875
    typedef std::map<_Value, _Item> Container;
1876
    Container _inv_map;
1877

	
1878
  public:
1879

	
1880
    /// The key type of InvertableMap (Node, Arc, Edge).
1881
    typedef typename Map::Key Key;
1882
    /// The value type of the InvertableMap.
1883
    typedef typename Map::Value Value;
1884

	
1885

	
1886

	
1887
    /// \brief Constructor.
1888
    ///
1889
    /// Construct a new InvertableMap for the graph.
1890
    ///
1891
    explicit InvertableMap(const Graph& graph) : Map(graph) {}
1892

	
1893
    /// \brief Forward iterator for values.
1894
    ///
1895
    /// This iterator is an stl compatible forward
1896
    /// iterator on the values of the map. The values can
1897
    /// be accessed in the [beginValue, endValue) range.
1898
    ///
1899
    class ValueIterator
1900
      : public std::iterator<std::forward_iterator_tag, Value> {
1901
      friend class InvertableMap;
1902
    private:
1903
      ValueIterator(typename Container::const_iterator _it)
1904
        : it(_it) {}
1905
    public:
1906

	
1907
      ValueIterator() {}
1908

	
1909
      ValueIterator& operator++() { ++it; return *this; }
1910
      ValueIterator operator++(int) {
1911
        ValueIterator tmp(*this);
1912
        operator++();
1913
        return tmp;
1914
      }
1915

	
1916
      const Value& operator*() const { return it->first; }
1917
      const Value* operator->() const { return &(it->first); }
1918

	
1919
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1920
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1921

	
1922
    private:
1923
      typename Container::const_iterator it;
1924
    };
1925

	
1926
    /// \brief Returns an iterator to the first value.
1927
    ///
1928
    /// Returns an stl compatible iterator to the
1929
    /// first value of the map. The values of the
1930
    /// map can be accessed in the [beginValue, endValue)
1931
    /// range.
1932
    ValueIterator beginValue() const {
1933
      return ValueIterator(_inv_map.begin());
1934
    }
1935

	
1936
    /// \brief Returns an iterator after the last value.
1937
    ///
1938
    /// Returns an stl compatible iterator after the
1939
    /// last value of the map. The values of the
1940
    /// map can be accessed in the [beginValue, endValue)
1941
    /// range.
1942
    ValueIterator endValue() const {
1943
      return ValueIterator(_inv_map.end());
1944
    }
1945

	
1946
    /// \brief The setter function of the map.
1947
    ///
1948
    /// Sets the mapped value.
1949
    void set(const Key& key, const Value& val) {
1950
      Value oldval = Map::operator[](key);
1951
      typename Container::iterator it = _inv_map.find(oldval);
1952
      if (it != _inv_map.end() && it->second == key) {
1953
        _inv_map.erase(it);
1954
      }
1955
      _inv_map.insert(make_pair(val, key));
1956
      Map::set(key, val);
1957
    }
1958

	
1959
    /// \brief The getter function of the map.
1960
    ///
1961
    /// It gives back the value associated with the key.
1962
    typename MapTraits<Map>::ConstReturnValue
1963
    operator[](const Key& key) const {
1964
      return Map::operator[](key);
1965
    }
1966

	
1967
    /// \brief Gives back the item by its value.
1968
    ///
1969
    /// Gives back the item by its value.
1970
    Key operator()(const Value& key) const {
1971
      typename Container::const_iterator it = _inv_map.find(key);
1972
      return it != _inv_map.end() ? it->second : INVALID;
1973
    }
1974

	
1975
  protected:
1976

	
1977
    /// \brief Erase the key from the map.
1978
    ///
1979
    /// Erase the key to the map. It is called by the
1980
    /// \c AlterationNotifier.
1981
    virtual void erase(const Key& key) {
1982
      Value val = Map::operator[](key);
1983
      typename Container::iterator it = _inv_map.find(val);
1984
      if (it != _inv_map.end() && it->second == key) {
1985
        _inv_map.erase(it);
1986
      }
1987
      Map::erase(key);
1988
    }
1989

	
1990
    /// \brief Erase more keys from the map.
1991
    ///
1992
    /// Erase more keys from the map. It is called by the
1993
    /// \c AlterationNotifier.
1994
    virtual void erase(const std::vector<Key>& keys) {
1995
      for (int i = 0; i < int(keys.size()); ++i) {
1996
        Value val = Map::operator[](keys[i]);
1997
        typename Container::iterator it = _inv_map.find(val);
1998
        if (it != _inv_map.end() && it->second == keys[i]) {
1999
          _inv_map.erase(it);
2000
        }
2001
      }
2002
      Map::erase(keys);
2003
    }
2004

	
2005
    /// \brief Clear the keys from the map and inverse map.
2006
    ///
2007
    /// Clear the keys from the map and inverse map. It is called by the
2008
    /// \c AlterationNotifier.
2009
    virtual void clear() {
2010
      _inv_map.clear();
2011
      Map::clear();
2012
    }
2013

	
2014
  public:
2015

	
2016
    /// \brief The inverse map type.
2017
    ///
2018
    /// The inverse of this map. The subscript operator of the map
2019
    /// gives back always the item what was last assigned to the value.
2020
    class InverseMap {
2021
    public:
2022
      /// \brief Constructor of the InverseMap.
2023
      ///
2024
      /// Constructor of the InverseMap.
2025
      explicit InverseMap(const InvertableMap& inverted)
2026
        : _inverted(inverted) {}
2027

	
2028
      /// The value type of the InverseMap.
2029
      typedef typename InvertableMap::Key Value;
2030
      /// The key type of the InverseMap.
2031
      typedef typename InvertableMap::Value Key;
2032

	
2033
      /// \brief Subscript operator.
2034
      ///
2035
      /// Subscript operator. It gives back always the item
2036
      /// what was last assigned to the value.
2037
      Value operator[](const Key& key) const {
2038
        return _inverted(key);
2039
      }
2040

	
2041
    private:
2042
      const InvertableMap& _inverted;
2043
    };
2044

	
2045
    /// \brief It gives back the just readable inverse map.
2046
    ///
2047
    /// It gives back the just readable inverse map.
2048
    InverseMap inverse() const {
2049
      return InverseMap(*this);
2050
    }
2051

	
2052

	
2053

	
2054
  };
2055

	
2056
  /// \brief Provides a mutable, continuous and unique descriptor for each
2057
  /// item in the graph.
2058
  ///
2059
  /// The DescriptorMap class provides a unique and continuous (but mutable)
2060
  /// descriptor (id) for each item of the same type (e.g. node) in the
2061
  /// graph. This id is <ul><li>\b unique: different items (nodes) get
2062
  /// different ids <li>\b continuous: the range of the ids is the set of
2063
  /// integers between 0 and \c n-1, where \c n is the number of the items of
2064
  /// this type (e.g. nodes) (so the id of a node can change if you delete an
2065
  /// other node, i.e. this id is mutable).  </ul> This map can be inverted
2066
  /// with its member class \c InverseMap, or with the \c operator() member.
2067
  ///
2068
  /// \tparam _Graph The graph class the \c DescriptorMap belongs to.
2069
  /// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or
2070
  /// Edge.
2071
  template <typename _Graph, typename _Item>
2072
  class DescriptorMap
2073
    : protected ItemSetTraits<_Graph, _Item>::template Map<int>::Type {
2074

	
2075
    typedef _Item Item;
2076
    typedef typename ItemSetTraits<_Graph, _Item>::template Map<int>::Type Map;
2077

	
2078
  public:
2079
    /// The graph class of DescriptorMap.
2080
    typedef _Graph Graph;
2081

	
2082
    /// The key type of DescriptorMap (Node, Arc, Edge).
2083
    typedef typename Map::Key Key;
2084
    /// The value type of DescriptorMap.
2085
    typedef typename Map::Value Value;
2086

	
2087
    /// \brief Constructor.
2088
    ///
2089
    /// Constructor for descriptor map.
2090
    explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
2091
      Item it;
2092
      const typename Map::Notifier* nf = Map::notifier();
2093
      for (nf->first(it); it != INVALID; nf->next(it)) {
2094
        Map::set(it, _inv_map.size());
2095
        _inv_map.push_back(it);
2096
      }
2097
    }
2098

	
2099
  protected:
2100

	
2101
    /// \brief Add a new key to the map.
2102
    ///
2103
    /// Add a new key to the map. It is called by the
2104
    /// \c AlterationNotifier.
2105
    virtual void add(const Item& item) {
2106
      Map::add(item);
2107
      Map::set(item, _inv_map.size());
2108
      _inv_map.push_back(item);
2109
    }
2110

	
2111
    /// \brief Add more new keys to the map.
2112
    ///
2113
    /// Add more new keys to the map. It is called by the
2114
    /// \c AlterationNotifier.
2115
    virtual void add(const std::vector<Item>& items) {
2116
      Map::add(items);
2117
      for (int i = 0; i < int(items.size()); ++i) {
2118
        Map::set(items[i], _inv_map.size());
2119
        _inv_map.push_back(items[i]);
2120
      }
2121
    }
2122

	
2123
    /// \brief Erase the key from the map.
2124
    ///
2125
    /// Erase the key from the map. It is called by the
2126
    /// \c AlterationNotifier.
2127
    virtual void erase(const Item& item) {
2128
      Map::set(_inv_map.back(), Map::operator[](item));
2129
      _inv_map[Map::operator[](item)] = _inv_map.back();
2130
      _inv_map.pop_back();
2131
      Map::erase(item);
2132
    }
2133

	
2134
    /// \brief Erase more keys from the map.
2135
    ///
2136
    /// Erase more keys from the map. It is called by the
2137
    /// \c AlterationNotifier.
2138
    virtual void erase(const std::vector<Item>& items) {
2139
      for (int i = 0; i < int(items.size()); ++i) {
2140
        Map::set(_inv_map.back(), Map::operator[](items[i]));
2141
        _inv_map[Map::operator[](items[i])] = _inv_map.back();
2142
        _inv_map.pop_back();
2143
      }
2144
      Map::erase(items);
2145
    }
2146

	
2147
    /// \brief Build the unique map.
2148
    ///
2149
    /// Build the unique map. It is called by the
2150
    /// \c AlterationNotifier.
2151
    virtual void build() {
2152
      Map::build();
2153
      Item it;
2154
      const typename Map::Notifier* nf = Map::notifier();
2155
      for (nf->first(it); it != INVALID; nf->next(it)) {
2156
        Map::set(it, _inv_map.size());
2157
        _inv_map.push_back(it);
2158
      }
2159
    }
2160

	
2161
    /// \brief Clear the keys from the map.
2162
    ///
2163
    /// Clear the keys from the map. It is called by the
2164
    /// \c AlterationNotifier.
2165
    virtual void clear() {
2166
      _inv_map.clear();
2167
      Map::clear();
2168
    }
2169

	
2170
  public:
2171

	
2172
    /// \brief Returns the maximal value plus one.
2173
    ///
2174
    /// Returns the maximal value plus one in the map.
2175
    unsigned int size() const {
2176
      return _inv_map.size();
2177
    }
2178

	
2179
    /// \brief Swaps the position of the two items in the map.
2180
    ///
2181
    /// Swaps the position of the two items in the map.
2182
    void swap(const Item& p, const Item& q) {
2183
      int pi = Map::operator[](p);
2184
      int qi = Map::operator[](q);
2185
      Map::set(p, qi);
2186
      _inv_map[qi] = p;
2187
      Map::set(q, pi);
2188
      _inv_map[pi] = q;
2189
    }
2190

	
2191
    /// \brief Gives back the \e descriptor of the item.
2192
    ///
2193
    /// Gives back the mutable and unique \e descriptor of the map.
2194
    int operator[](const Item& item) const {
2195
      return Map::operator[](item);
2196
    }
2197

	
2198
    /// \brief Gives back the item by its descriptor.
2199
    ///
2200
    /// Gives back th item by its descriptor.
2201
    Item operator()(int id) const {
2202
      return _inv_map[id];
2203
    }
2204

	
2205
  private:
2206

	
2207
    typedef std::vector<Item> Container;
2208
    Container _inv_map;
2209

	
2210
  public:
2211
    /// \brief The inverse map type of DescriptorMap.
2212
    ///
2213
    /// The inverse map type of DescriptorMap.
2214
    class InverseMap {
2215
    public:
2216
      /// \brief Constructor of the InverseMap.
2217
      ///
2218
      /// Constructor of the InverseMap.
2219
      explicit InverseMap(const DescriptorMap& inverted)
2220
        : _inverted(inverted) {}
2221

	
2222

	
2223
      /// The value type of the InverseMap.
2224
      typedef typename DescriptorMap::Key Value;
2225
      /// The key type of the InverseMap.
2226
      typedef typename DescriptorMap::Value Key;
2227

	
2228
      /// \brief Subscript operator.
2229
      ///
2230
      /// Subscript operator. It gives back the item
2231
      /// that the descriptor belongs to currently.
2232
      Value operator[](const Key& key) const {
2233
        return _inverted(key);
2234
      }
2235

	
2236
      /// \brief Size of the map.
2237
      ///
2238
      /// Returns the size of the map.
2239
      unsigned int size() const {
2240
        return _inverted.size();
2241
      }
2242

	
2243
    private:
2244
      const DescriptorMap& _inverted;
2245
    };
2246

	
2247
    /// \brief Gives back the inverse of the map.
2248
    ///
2249
    /// Gives back the inverse of the map.
2250
    const InverseMap inverse() const {
2251
      return InverseMap(*this);
2252
    }
2253
  };
2254

	
2255 1850
  /// \brief Returns the source of the given arc.
2256 1851
  ///
2257 1852
  /// The SourceMap gives back the source Node of the given arc.
2258 1853
  /// \see TargetMap
2259 1854
  template <typename Digraph>
2260 1855
  class SourceMap {
2261 1856
  public:
2262 1857

	
2263 1858
    typedef typename Digraph::Node Value;
2264 1859
    typedef typename Digraph::Arc Key;
2265 1860

	
2266 1861
    /// \brief Constructor
2267 1862
    ///
2268 1863
    /// Constructor
2269 1864
    /// \param _digraph The digraph that the map belongs to.
2270 1865
    explicit SourceMap(const Digraph& digraph) : _digraph(digraph) {}
2271 1866

	
2272 1867
    /// \brief The subscript operator.
2273 1868
    ///
2274 1869
    /// The subscript operator.
2275 1870
    /// \param arc The arc
2276 1871
    /// \return The source of the arc
2277 1872
    Value operator[](const Key& arc) const {
2278 1873
      return _digraph.source(arc);
2279 1874
    }
2280 1875

	
2281 1876
  private:
2282 1877
    const Digraph& _digraph;
2283 1878
  };
2284 1879

	
2285 1880
  /// \brief Returns a \ref SourceMap class.
2286 1881
  ///
2287 1882
  /// This function just returns an \ref SourceMap class.
2288 1883
  /// \relates SourceMap
2289 1884
  template <typename Digraph>
2290 1885
  inline SourceMap<Digraph> sourceMap(const Digraph& digraph) {
2291 1886
    return SourceMap<Digraph>(digraph);
2292 1887
  }
2293 1888

	
2294 1889
  /// \brief Returns the target of the given arc.
2295 1890
  ///
2296 1891
  /// The TargetMap gives back the target Node of the given arc.
2297 1892
  /// \see SourceMap
2298 1893
  template <typename Digraph>
2299 1894
  class TargetMap {
2300 1895
  public:
2301 1896

	
2302 1897
    typedef typename Digraph::Node Value;
2303 1898
    typedef typename Digraph::Arc Key;
2304 1899

	
2305 1900
    /// \brief Constructor
2306 1901
    ///
2307 1902
    /// Constructor
2308 1903
    /// \param _digraph The digraph that the map belongs to.
2309 1904
    explicit TargetMap(const Digraph& digraph) : _digraph(digraph) {}
2310 1905

	
2311 1906
    /// \brief The subscript operator.
2312 1907
    ///
2313 1908
    /// The subscript operator.
2314 1909
    /// \param e The arc
2315 1910
    /// \return The target of the arc
2316 1911
    Value operator[](const Key& e) const {
2317 1912
      return _digraph.target(e);
2318 1913
    }
2319 1914

	
2320 1915
  private:
2321 1916
    const Digraph& _digraph;
2322 1917
  };
2323 1918

	
2324 1919
  /// \brief Returns a \ref TargetMap class.
2325 1920
  ///
2326 1921
  /// This function just returns a \ref TargetMap class.
2327 1922
  /// \relates TargetMap
2328 1923
  template <typename Digraph>
2329 1924
  inline TargetMap<Digraph> targetMap(const Digraph& digraph) {
2330 1925
    return TargetMap<Digraph>(digraph);
2331 1926
  }
2332 1927

	
2333 1928
  /// \brief Returns the "forward" directed arc view of an edge.
2334 1929
  ///
2335 1930
  /// Returns the "forward" directed arc view of an edge.
2336 1931
  /// \see BackwardMap
2337 1932
  template <typename Graph>
2338 1933
  class ForwardMap {
2339 1934
  public:
2340 1935

	
2341 1936
    typedef typename Graph::Arc Value;
2342 1937
    typedef typename Graph::Edge Key;
2343 1938

	
2344 1939
    /// \brief Constructor
2345 1940
    ///
2346 1941
    /// Constructor
2347 1942
    /// \param _graph The graph that the map belongs to.
2348 1943
    explicit ForwardMap(const Graph& graph) : _graph(graph) {}
2349 1944

	
2350 1945
    /// \brief The subscript operator.
2351 1946
    ///
2352 1947
    /// The subscript operator.
2353 1948
    /// \param key An edge
2354 1949
    /// \return The "forward" directed arc view of edge
2355 1950
    Value operator[](const Key& key) const {
2356 1951
      return _graph.direct(key, true);
2357 1952
    }
2358 1953

	
2359 1954
  private:
2360 1955
    const Graph& _graph;
2361 1956
  };
2362 1957

	
2363 1958
  /// \brief Returns a \ref ForwardMap class.
2364 1959
  ///
2365 1960
  /// This function just returns an \ref ForwardMap class.
2366 1961
  /// \relates ForwardMap
2367 1962
  template <typename Graph>
2368 1963
  inline ForwardMap<Graph> forwardMap(const Graph& graph) {
2369 1964
    return ForwardMap<Graph>(graph);
2370 1965
  }
2371 1966

	
2372 1967
  /// \brief Returns the "backward" directed arc view of an edge.
2373 1968
  ///
2374 1969
  /// Returns the "backward" directed arc view of an edge.
2375 1970
  /// \see ForwardMap
2376 1971
  template <typename Graph>
2377 1972
  class BackwardMap {
2378 1973
  public:
2379 1974

	
2380 1975
    typedef typename Graph::Arc Value;
2381 1976
    typedef typename Graph::Edge Key;
2382 1977

	
2383 1978
    /// \brief Constructor
2384 1979
    ///
2385 1980
    /// Constructor
2386 1981
    /// \param _graph The graph that the map belongs to.
2387 1982
    explicit BackwardMap(const Graph& graph) : _graph(graph) {}
2388 1983

	
2389 1984
    /// \brief The subscript operator.
2390 1985
    ///
2391 1986
    /// The subscript operator.
2392 1987
    /// \param key An edge
2393 1988
    /// \return The "backward" directed arc view of edge
2394 1989
    Value operator[](const Key& key) const {
2395 1990
      return _graph.direct(key, false);
2396 1991
    }
2397 1992

	
2398 1993
  private:
2399 1994
    const Graph& _graph;
2400 1995
  };
2401 1996

	
2402 1997
  /// \brief Returns a \ref BackwardMap class
2403 1998

	
2404 1999
  /// This function just returns a \ref BackwardMap class.
2405 2000
  /// \relates BackwardMap
2406 2001
  template <typename Graph>
2407 2002
  inline BackwardMap<Graph> backwardMap(const Graph& graph) {
2408 2003
    return BackwardMap<Graph>(graph);
2409 2004
  }
2410 2005

	
2411 2006
  /// \brief Potential difference map
2412 2007
  ///
2413 2008
  /// If there is an potential map on the nodes then we
2414 2009
  /// can get an arc map as we get the substraction of the
2415 2010
  /// values of the target and source.
2416 2011
  template <typename Digraph, typename NodeMap>
2417 2012
  class PotentialDifferenceMap {
2418 2013
  public:
2419 2014
    typedef typename Digraph::Arc Key;
2420 2015
    typedef typename NodeMap::Value Value;
2421 2016

	
2422 2017
    /// \brief Constructor
2423 2018
    ///
2424 2019
    /// Contructor of the map
2425 2020
    explicit PotentialDifferenceMap(const Digraph& digraph,
2426 2021
                                    const NodeMap& potential)
2427 2022
      : _digraph(digraph), _potential(potential) {}
2428 2023

	
2429 2024
    /// \brief Const subscription operator
2430 2025
    ///
2431 2026
    /// Const subscription operator
2432 2027
    Value operator[](const Key& arc) const {
2433 2028
      return _potential[_digraph.target(arc)] -
2434 2029
        _potential[_digraph.source(arc)];
2435 2030
    }
2436 2031

	
2437 2032
  private:
2438 2033
    const Digraph& _digraph;
2439 2034
    const NodeMap& _potential;
2440 2035
  };
2441 2036

	
2442 2037
  /// \brief Returns a PotentialDifferenceMap.
2443 2038
  ///
2444 2039
  /// This function just returns a PotentialDifferenceMap.
2445 2040
  /// \relates PotentialDifferenceMap
2446 2041
  template <typename Digraph, typename NodeMap>
2447 2042
  PotentialDifferenceMap<Digraph, NodeMap>
2448 2043
  potentialDifferenceMap(const Digraph& digraph, const NodeMap& potential) {
2449 2044
    return PotentialDifferenceMap<Digraph, NodeMap>(digraph, potential);
2450 2045
  }
2451 2046

	
2452 2047
  /// \brief Map of the node in-degrees.
2453 2048
  ///
2454 2049
  /// This map returns the in-degree of a node. Once it is constructed,
2455 2050
  /// the degrees are stored in a standard NodeMap, so each query is done
2456 2051
  /// in constant time. On the other hand, the values are updated automatically
2457 2052
  /// whenever the digraph changes.
2458 2053
  ///
2459 2054
  /// \warning Besides addNode() and addArc(), a digraph structure may provide
2460 2055
  /// alternative ways to modify the digraph. The correct behavior of InDegMap
2461 2056
  /// is not guarantied if these additional features are used. For example
2462 2057
  /// the functions \ref ListDigraph::changeSource() "changeSource()",
2463 2058
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2464 2059
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2465 2060
  /// of \ref ListDigraph will \e not update the degree values correctly.
2466 2061
  ///
2467 2062
  /// \sa OutDegMap
2468 2063

	
2469 2064
  template <typename _Digraph>
2470 2065
  class InDegMap
2471 2066
    : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
2472 2067
      ::ItemNotifier::ObserverBase {
2473 2068

	
2474 2069
  public:
2475 2070

	
2476 2071
    typedef _Digraph Digraph;
2477 2072
    typedef int Value;
2478 2073
    typedef typename Digraph::Node Key;
2479 2074

	
2480 2075
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2481 2076
    ::ItemNotifier::ObserverBase Parent;
2482 2077

	
2483 2078
  private:
2484 2079

	
2485 2080
    class AutoNodeMap
2486 2081
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2487 2082
    public:
2488 2083

	
2489 2084
      typedef typename ItemSetTraits<Digraph, Key>::
2490 2085
      template Map<int>::Type Parent;
2491 2086

	
2492 2087
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2493 2088

	
2494 2089
      virtual void add(const Key& key) {
2495 2090
        Parent::add(key);
2496 2091
        Parent::set(key, 0);
2497 2092
      }
2498 2093

	
2499 2094
      virtual void add(const std::vector<Key>& keys) {
2500 2095
        Parent::add(keys);
2501 2096
        for (int i = 0; i < int(keys.size()); ++i) {
2502 2097
          Parent::set(keys[i], 0);
2503 2098
        }
2504 2099
      }
2505 2100

	
2506 2101
      virtual void build() {
2507 2102
        Parent::build();
2508 2103
        Key it;
2509 2104
        typename Parent::Notifier* nf = Parent::notifier();
2510 2105
        for (nf->first(it); it != INVALID; nf->next(it)) {
2511 2106
          Parent::set(it, 0);
2512 2107
        }
2513 2108
      }
2514 2109
    };
2515 2110

	
2516 2111
  public:
2517 2112

	
2518 2113
    /// \brief Constructor.
2519 2114
    ///
2520 2115
    /// Constructor for creating in-degree map.
2521 2116
    explicit InDegMap(const Digraph& digraph)
2522 2117
      : _digraph(digraph), _deg(digraph) {
2523 2118
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2524 2119

	
2525 2120
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2526 2121
        _deg[it] = countInArcs(_digraph, it);
2527 2122
      }
2528 2123
    }
2529 2124

	
2530 2125
    /// Gives back the in-degree of a Node.
2531 2126
    int operator[](const Key& key) const {
2532 2127
      return _deg[key];
2533 2128
    }
2534 2129

	
2535 2130
  protected:
2536 2131

	
2537 2132
    typedef typename Digraph::Arc Arc;
2538 2133

	
2539 2134
    virtual void add(const Arc& arc) {
2540 2135
      ++_deg[_digraph.target(arc)];
2541 2136
    }
2542 2137

	
2543 2138
    virtual void add(const std::vector<Arc>& arcs) {
2544 2139
      for (int i = 0; i < int(arcs.size()); ++i) {
2545 2140
        ++_deg[_digraph.target(arcs[i])];
2546 2141
      }
2547 2142
    }
2548 2143

	
2549 2144
    virtual void erase(const Arc& arc) {
2550 2145
      --_deg[_digraph.target(arc)];
2551 2146
    }
2552 2147

	
2553 2148
    virtual void erase(const std::vector<Arc>& arcs) {
2554 2149
      for (int i = 0; i < int(arcs.size()); ++i) {
2555 2150
        --_deg[_digraph.target(arcs[i])];
2556 2151
      }
2557 2152
    }
2558 2153

	
2559 2154
    virtual void build() {
2560 2155
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2561 2156
        _deg[it] = countInArcs(_digraph, it);
2562 2157
      }
2563 2158
    }
2564 2159

	
2565 2160
    virtual void clear() {
2566 2161
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2567 2162
        _deg[it] = 0;
2568 2163
      }
2569 2164
    }
2570 2165
  private:
2571 2166

	
2572 2167
    const Digraph& _digraph;
2573 2168
    AutoNodeMap _deg;
2574 2169
  };
2575 2170

	
2576 2171
  /// \brief Map of the node out-degrees.
2577 2172
  ///
2578 2173
  /// This map returns the out-degree of a node. Once it is constructed,
2579 2174
  /// the degrees are stored in a standard NodeMap, so each query is done
2580 2175
  /// in constant time. On the other hand, the values are updated automatically
2581 2176
  /// whenever the digraph changes.
2582 2177
  ///
2583 2178
  /// \warning Besides addNode() and addArc(), a digraph structure may provide
2584 2179
  /// alternative ways to modify the digraph. The correct behavior of OutDegMap
2585 2180
  /// is not guarantied if these additional features are used. For example
2586 2181
  /// the functions \ref ListDigraph::changeSource() "changeSource()",
2587 2182
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2588 2183
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2589 2184
  /// of \ref ListDigraph will \e not update the degree values correctly.
2590 2185
  ///
2591 2186
  /// \sa InDegMap
2592 2187

	
2593 2188
  template <typename _Digraph>
2594 2189
  class OutDegMap
2595 2190
    : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
2596 2191
      ::ItemNotifier::ObserverBase {
2597 2192

	
2598 2193
  public:
2599 2194

	
2600 2195
    typedef _Digraph Digraph;
2601 2196
    typedef int Value;
2602 2197
    typedef typename Digraph::Node Key;
2603 2198

	
2604 2199
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2605 2200
    ::ItemNotifier::ObserverBase Parent;
2606 2201

	
2607 2202
  private:
2608 2203

	
2609 2204
    class AutoNodeMap
2610 2205
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2611 2206
    public:
2612 2207

	
2613 2208
      typedef typename ItemSetTraits<Digraph, Key>::
2614 2209
      template Map<int>::Type Parent;
2615 2210

	
2616 2211
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2617 2212

	
2618 2213
      virtual void add(const Key& key) {
2619 2214
        Parent::add(key);
2620 2215
        Parent::set(key, 0);
2621 2216
      }
2622 2217
      virtual void add(const std::vector<Key>& keys) {
2623 2218
        Parent::add(keys);
2624 2219
        for (int i = 0; i < int(keys.size()); ++i) {
2625 2220
          Parent::set(keys[i], 0);
2626 2221
        }
2627 2222
      }
2628 2223
      virtual void build() {
2629 2224
        Parent::build();
2630 2225
        Key it;
2631 2226
        typename Parent::Notifier* nf = Parent::notifier();
2632 2227
        for (nf->first(it); it != INVALID; nf->next(it)) {
2633 2228
          Parent::set(it, 0);
2634 2229
        }
2635 2230
      }
2636 2231
    };
2637 2232

	
2638 2233
  public:
2639 2234

	
2640 2235
    /// \brief Constructor.
2641 2236
    ///
2642 2237
    /// Constructor for creating out-degree map.
2643 2238
    explicit OutDegMap(const Digraph& digraph)
2644 2239
      : _digraph(digraph), _deg(digraph) {
2645 2240
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2646 2241

	
2647 2242
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2648 2243
        _deg[it] = countOutArcs(_digraph, it);
2649 2244
      }
2650 2245
    }
2651 2246

	
2652 2247
    /// Gives back the out-degree of a Node.
2653 2248
    int operator[](const Key& key) const {
2654 2249
      return _deg[key];
2655 2250
    }
2656 2251

	
2657 2252
  protected:
2658 2253

	
2659 2254
    typedef typename Digraph::Arc Arc;
2660 2255

	
2661 2256
    virtual void add(const Arc& arc) {
2662 2257
      ++_deg[_digraph.source(arc)];
2663 2258
    }
2664 2259

	
2665 2260
    virtual void add(const std::vector<Arc>& arcs) {
2666 2261
      for (int i = 0; i < int(arcs.size()); ++i) {
2667 2262
        ++_deg[_digraph.source(arcs[i])];
2668 2263
      }
2669 2264
    }
2670 2265

	
2671 2266
    virtual void erase(const Arc& arc) {
2672 2267
      --_deg[_digraph.source(arc)];
2673 2268
    }
2674 2269

	
2675 2270
    virtual void erase(const std::vector<Arc>& arcs) {
2676 2271
      for (int i = 0; i < int(arcs.size()); ++i) {
2677 2272
        --_deg[_digraph.source(arcs[i])];
2678 2273
      }
2679 2274
    }
2680 2275

	
2681 2276
    virtual void build() {
2682 2277
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2683 2278
        _deg[it] = countOutArcs(_digraph, it);
2684 2279
      }
2685 2280
    }
2686 2281

	
2687 2282
    virtual void clear() {
2688 2283
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2689 2284
        _deg[it] = 0;
2690 2285
      }
2691 2286
    }
2692 2287
  private:
2693 2288

	
2694 2289
    const Digraph& _digraph;
2695 2290
    AutoNodeMap _deg;
2696 2291
  };
2697 2292

	
2698 2293
  /// @}
2699 2294
}
2700 2295

	
2701 2296
#endif // LEMON_MAPS_H
Ignore white space 6144 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
#include <cstdlib>
20 20
#include <ctime>
21 21

	
22 22
#include <lemon/random.h>
23 23
#include <lemon/list_graph.h>
24 24
#include <lemon/smart_graph.h>
25 25
#include <lemon/maps.h>
26 26

	
27 27
#include "graph_test.h"
28 28
#include "test_tools.h"
29 29

	
30 30
using namespace lemon;
31 31

	
32 32
template <typename Digraph>
33 33
void checkFindArcs() {
34 34
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
35 35

	
36 36
  {
37 37
    Digraph digraph;
38
    typename Digraph::template NodeMap<int> nodes(digraph);
39
    std::vector<Node> invNodes;
38 40
    for (int i = 0; i < 10; ++i) {
39
      digraph.addNode();
41
      invNodes.push_back(digraph.addNode());
42
      nodes[invNodes.back()]=invNodes.size()-1;
40 43
    }
41
    DescriptorMap<Digraph, Node> nodes(digraph);
42
    typename DescriptorMap<Digraph, Node>::InverseMap invNodes(nodes);
43 44
    for (int i = 0; i < 100; ++i) {
44 45
      int src = rnd[invNodes.size()];
45 46
      int trg = rnd[invNodes.size()];
46 47
      digraph.addArc(invNodes[src], invNodes[trg]);
47 48
    }
48 49
    typename Digraph::template ArcMap<bool> found(digraph, false);
49
    DescriptorMap<Digraph, Arc> arcs(digraph);
50 50
    for (NodeIt src(digraph); src != INVALID; ++src) {
51 51
      for (NodeIt trg(digraph); trg != INVALID; ++trg) {
52 52
        for (ConArcIt<Digraph> con(digraph, src, trg); con != INVALID; ++con) {
53 53
          check(digraph.source(con) == src, "Wrong source.");
54 54
          check(digraph.target(con) == trg, "Wrong target.");
55 55
          check(found[con] == false, "The arc found already.");
56 56
          found[con] = true;
57 57
        }
58 58
      }
59 59
    }
60 60
    for (ArcIt it(digraph); it != INVALID; ++it) {
61 61
      check(found[it] == true, "The arc is not found.");
62 62
    }
63 63
  }
64 64

	
65 65
  {
66 66
    int num = 5;
67 67
    Digraph fg;
68 68
    std::vector<Node> nodes;
69 69
    for (int i = 0; i < num; ++i) {
70 70
      nodes.push_back(fg.addNode());
71 71
    }
72 72
    for (int i = 0; i < num * num; ++i) {
73 73
      fg.addArc(nodes[i / num], nodes[i % num]);
74 74
    }
75 75
    check(countNodes(fg) == num, "Wrong node number.");
76 76
    check(countArcs(fg) == num*num, "Wrong arc number.");
77 77
    for (NodeIt src(fg); src != INVALID; ++src) {
78 78
      for (NodeIt trg(fg); trg != INVALID; ++trg) {
79 79
        ConArcIt<Digraph> con(fg, src, trg);
80 80
        check(con != INVALID, "There is no connecting arc.");
81 81
        check(fg.source(con) == src, "Wrong source.");
82 82
        check(fg.target(con) == trg, "Wrong target.");
83 83
        check(++con == INVALID, "There is more connecting arc.");
84 84
      }
85 85
    }
86 86
    ArcLookUp<Digraph> al1(fg);
87 87
    DynArcLookUp<Digraph> al2(fg);
88 88
    AllArcLookUp<Digraph> al3(fg);
89 89
    for (NodeIt src(fg); src != INVALID; ++src) {
90 90
      for (NodeIt trg(fg); trg != INVALID; ++trg) {
91 91
        Arc con1 = al1(src, trg);
92 92
        Arc con2 = al2(src, trg);
93 93
        Arc con3 = al3(src, trg);
94 94
        Arc con4 = findArc(fg, src, trg);
95 95
        check(con1 == con2 && con2 == con3 && con3 == con4,
96 96
              "Different results.")
97 97
        check(con1 != INVALID, "There is no connecting arc.");
98 98
        check(fg.source(con1) == src, "Wrong source.");
99 99
        check(fg.target(con1) == trg, "Wrong target.");
100 100
        check(al3(src, trg, con3) == INVALID,
101 101
              "There is more connecting arc.");
102 102
        check(findArc(fg, src, trg, con4) == INVALID,
103 103
              "There is more connecting arc.");
104 104
      }
105 105
    }
106 106
  }
107 107
}
108 108

	
109 109
template <typename Graph>
110 110
void checkFindEdges() {
111 111
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
112 112
  Graph graph;
113
  typename Graph::template NodeMap<int> nodes(graph);
114
  std::vector<Node> invNodes;
113 115
  for (int i = 0; i < 10; ++i) {
114
    graph.addNode();
116
    invNodes.push_back(graph.addNode());
117
    nodes[invNodes.back()]=invNodes.size()-1;
115 118
  }
116
  DescriptorMap<Graph, Node> nodes(graph);
117
  typename DescriptorMap<Graph, Node>::InverseMap invNodes(nodes);
118 119
  for (int i = 0; i < 100; ++i) {
119 120
    int src = rnd[invNodes.size()];
120 121
    int trg = rnd[invNodes.size()];
121 122
    graph.addEdge(invNodes[src], invNodes[trg]);
122 123
  }
123 124
  typename Graph::template EdgeMap<int> found(graph, 0);
124
  DescriptorMap<Graph, Edge> edges(graph);
125 125
  for (NodeIt src(graph); src != INVALID; ++src) {
126 126
    for (NodeIt trg(graph); trg != INVALID; ++trg) {
127 127
      for (ConEdgeIt<Graph> con(graph, src, trg); con != INVALID; ++con) {
128 128
        check( (graph.u(con) == src && graph.v(con) == trg) ||
129 129
               (graph.v(con) == src && graph.u(con) == trg),
130 130
               "Wrong end nodes.");
131 131
        ++found[con];
132 132
        check(found[con] <= 2, "The edge found more than twice.");
133 133
      }
134 134
    }
135 135
  }
136 136
  for (EdgeIt it(graph); it != INVALID; ++it) {
137 137
    check( (graph.u(it) != graph.v(it) && found[it] == 2) ||
138 138
           (graph.u(it) == graph.v(it) && found[it] == 1),
139 139
           "The edge is not found correctly.");
140 140
  }
141 141
}
142 142

	
143 143
template <class Digraph>
144 144
void checkDeg()
145 145
{
146 146
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
147 147

	
148 148
  const int nodeNum = 10;
149 149
  const int arcNum = 100;
150 150
  Digraph digraph;
151 151
  InDegMap<Digraph> inDeg(digraph);
152 152
  OutDegMap<Digraph> outDeg(digraph);
153 153
  std::vector<Node> nodes(nodeNum);
154 154
  for (int i = 0; i < nodeNum; ++i) {
155 155
    nodes[i] = digraph.addNode();
156 156
  }
157 157
  std::vector<Arc> arcs(arcNum);
158 158
  for (int i = 0; i < arcNum; ++i) {
159 159
    arcs[i] = digraph.addArc(nodes[rnd[nodeNum]], nodes[rnd[nodeNum]]);
160 160
  }
161 161
  for (int i = 0; i < nodeNum; ++i) {
162 162
    check(inDeg[nodes[i]] == countInArcs(digraph, nodes[i]),
163 163
          "Wrong in degree map");
164 164
  }
165 165
  for (int i = 0; i < nodeNum; ++i) {
166 166
    check(outDeg[nodes[i]] == countOutArcs(digraph, nodes[i]),
167 167
          "Wrong out degree map");
168 168
  }
169 169
}
170 170

	
171 171
template <class Digraph>
172 172
void checkSnapDeg()
173 173
{
174 174
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
175 175

	
176 176
  Digraph g;
177 177
  Node n1=g.addNode();
178 178
  Node n2=g.addNode();
179 179

	
180 180
  InDegMap<Digraph> ind(g);
181 181

	
182 182
  g.addArc(n1,n2);
183 183

	
184 184
  typename Digraph::Snapshot snap(g);
185 185

	
186 186
  OutDegMap<Digraph> outd(g);
187 187

	
188 188
  check(ind[n1]==0 && ind[n2]==1, "Wrong InDegMap value.");
189 189
  check(outd[n1]==1 && outd[n2]==0, "Wrong OutDegMap value.");
190 190

	
191 191
  g.addArc(n1,n2);
192 192
  g.addArc(n2,n1);
193 193

	
194 194
  check(ind[n1]==1 && ind[n2]==2, "Wrong InDegMap value.");
195 195
  check(outd[n1]==2 && outd[n2]==1, "Wrong OutDegMap value.");
196 196

	
197 197
  snap.restore();
198 198

	
199 199
  check(ind[n1]==0 && ind[n2]==1, "Wrong InDegMap value.");
200 200
  check(outd[n1]==1 && outd[n2]==0, "Wrong OutDegMap value.");
201 201
}
202 202

	
203 203
int main() {
204 204
  // Checking ConArcIt, ConEdgeIt, ArcLookUp, AllArcLookUp, and DynArcLookUp
205 205
  checkFindArcs<ListDigraph>();
206 206
  checkFindArcs<SmartDigraph>();
207 207
  checkFindEdges<ListGraph>();
208 208
  checkFindEdges<SmartGraph>();
209 209

	
210 210
  // Checking In/OutDegMap (and Snapshot feature)
211 211
  checkDeg<ListDigraph>();
212 212
  checkDeg<SmartDigraph>();
213 213
  checkSnapDeg<ListDigraph>();
214 214
  checkSnapDeg<SmartDigraph>();
215 215

	
216 216
  return 0;
217 217
}
0 comments (0 inline)