gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Several doc improvements and fixes in maps.h.
0 1 0
default
1 file changed with 197 insertions and 142 deletions:
197
142
↑ Collapse diff ↑
Ignore white space 24 line context
... ...
@@ -43,69 +43,76 @@
43 43
  /// It provides the necessary <tt>typedef</tt>s required by the map concept.
44 44
  template<typename K, typename T>
45 45
  class MapBase {
46 46
  public:
47 47
    ///\e
48 48
    typedef K Key;
49 49
    ///\e
50 50
    typedef T Value;
51 51
  };
52 52

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

	
55
  /// If you have to provide a map only for its type definitions,
56
  /// or if you have to provide a writable map, but
57
  /// data written to it will sent to <tt>/dev/null</tt>...
55
  /// This map can be used if you have to provide a map only for
56
  /// its type definitions, or if you have to provide a writable map, 
57
  /// but data written to it is not required (i.e. it will be sent to 
58
  /// <tt>/dev/null</tt>).
58 59
  template<typename K, typename T>
59 60
  class NullMap : public MapBase<K, T> {
60 61
  public:
61 62
    typedef MapBase<K, T> Parent;
62 63
    typedef typename Parent::Key Key;
63 64
    typedef typename Parent::Value Value;
64 65
    
65 66
    /// Gives back a default constructed element.
66 67
    T operator[](const K&) const { return T(); }
67 68
    /// Absorbs the value.
68 69
    void set(const K&, const T&) {}
69 70
  };
70 71

	
72
  ///Returns a \c NullMap class
73

	
74
  ///This function just returns a \c NullMap class.
75
  ///\relates NullMap
71 76
  template <typename K, typename V> 
72 77
  NullMap<K, V> nullMap() {
73 78
    return NullMap<K, V>();
74 79
  }
75 80

	
76 81

	
77 82
  /// Constant map.
78 83

	
79 84
  /// This is a readable map which assigns a specified value to each key.
80 85
  /// In other aspects it is equivalent to the \c NullMap.
81 86
  template<typename K, typename T>
82 87
  class ConstMap : public MapBase<K, T> {
83 88
  private:
84 89
    T v;
85 90
  public:
86 91

	
87 92
    typedef MapBase<K, T> Parent;
88 93
    typedef typename Parent::Key Key;
89 94
    typedef typename Parent::Value Value;
90 95

	
91 96
    /// Default constructor
92 97

	
98
    /// Default constructor.
93 99
    /// The value of the map will be uninitialized. 
94 100
    /// (More exactly it will be default constructed.)
95 101
    ConstMap() {}
96
    ///\e
102
    
103
    /// Constructor with specified initial value
97 104

	
98
    /// \param _v The initial value of the map.
99
    ///
105
    /// Constructor with specified initial value.
106
    /// \param _v is the initial value of the map.
100 107
    ConstMap(const T &_v) : v(_v) {}
101 108
    
102 109
    ///\e
103 110
    T operator[](const K&) const { return v; }
104 111

	
105 112
    ///\e
106 113
    void setAll(const T &t) {
107 114
      v = t;
108 115
    }    
109 116

	
110 117
    template<typename T1>
111 118
    struct rebind {
... ...
@@ -149,26 +156,26 @@
149 156

	
150 157
  ///Returns a \c ConstMap class
151 158

	
152 159
  ///This function just returns a \c ConstMap class with inlined value.
153 160
  ///\relates ConstMap
154 161
  template<typename K, typename V, V v> 
155 162
  inline ConstMap<K, Const<V, v> > constMap() {
156 163
    return ConstMap<K, Const<V, v> >();
157 164
  }
158 165

	
159 166
  ///Map based on std::map
160 167

	
161
  ///This is essentially a wrapper for \c std::map. With addition that
162
  ///you can specify a default value different from \c Value() .
168
  ///This is essentially a wrapper for \c std::map with addition that
169
  ///you can specify a default value different from \c Value().
163 170
  template <typename K, typename T, typename Compare = std::less<K> >
164 171
  class StdMap {
165 172
    template <typename K1, typename T1, typename C1>
166 173
    friend class StdMap;
167 174
  public:
168 175

	
169 176
    typedef True ReferenceMapTag;
170 177
    ///\e
171 178
    typedef K Key;
172 179
    ///\e
173 180
    typedef T Value;
174 181
    ///\e
... ...
@@ -312,27 +319,27 @@
312 319
    /// \e 
313 320
    void set(const Key &k, const T& t) {
314 321
      _vector[k] = t;
315 322
    }
316 323

	
317 324
  };
318 325

	
319 326
  /// @}
320 327

	
321 328
  /// \addtogroup map_adaptors
322 329
  /// @{
323 330

	
324
  /// \brief Identity mapping.
331
  /// \brief Identity map.
325 332
  ///
326
  /// This mapping gives back the given key as value without any
333
  /// This map gives back the given key as value without any
327 334
  /// modification. 
328 335
  template <typename T>
329 336
  class IdentityMap : public MapBase<T, T> {
330 337
  public:
331 338
    typedef MapBase<T, T> Parent;
332 339
    typedef typename Parent::Key Key;
333 340
    typedef typename Parent::Value Value;
334 341

	
335 342
    /// \e
336 343
    const T& operator[](const T& t) const {
337 344
      return t;
338 345
    }
... ...
@@ -343,109 +350,113 @@
343 350
  ///This function just returns an \c IdentityMap class.
344 351
  ///\relates IdentityMap
345 352
  template<typename T>
346 353
  inline IdentityMap<T> identityMap() {
347 354
    return IdentityMap<T>();
348 355
  }
349 356
  
350 357

	
351 358
  ///\brief Convert the \c Value of a map to another type using
352 359
  ///the default conversion.
353 360
  ///
354 361
  ///This \c concepts::ReadMap "read only map"
355
  ///converts the \c Value of a maps to type \c T.
362
  ///converts the \c Value of a map to type \c T.
356 363
  ///Its \c Key is inherited from \c M.
357 364
  template <typename M, typename T> 
358 365
  class ConvertMap : public MapBase<typename M::Key, T> {
359 366
    const M& m;
360 367
  public:
361 368
    typedef MapBase<typename M::Key, T> Parent;
362 369
    typedef typename Parent::Key Key;
363 370
    typedef typename Parent::Value Value;
364 371

	
365 372
    ///Constructor
366 373

	
367
    ///Constructor
368
    ///\param _m is the underlying map
374
    ///Constructor.
375
    ///\param _m is the underlying map.
369 376
    ConvertMap(const M &_m) : m(_m) {};
370 377

	
371 378
    /// \brief The subscript operator.
372 379
    ///
373 380
    /// The subscript operator.
374 381
    Value operator[](const Key& k) const {return m[k];}
375 382
  };
376 383
  
377
  ///Returns an \c ConvertMap class
384
  ///Returns a \c ConvertMap class
378 385

	
379
  ///This function just returns an \c ConvertMap class.
386
  ///This function just returns a \c ConvertMap class.
380 387
  ///\relates ConvertMap
381 388
  template<typename T, typename M>
382 389
  inline ConvertMap<M, T> convertMap(const M &m) {
383 390
    return ConvertMap<M, T>(m);
384 391
  }
385 392

	
386
  ///Simple wrapping of the map
393
  ///Simple wrapping of a map
387 394

	
388 395
  ///This \c concepts::ReadMap "read only map" returns the simple
389 396
  ///wrapping of the given map. Sometimes the reference maps cannot be
390 397
  ///combined with simple read maps. This map adaptor wraps the given
391 398
  ///map to simple read map.
392 399
  ///
393
  /// \todo Revise the misleading name
400
  ///\sa SimpleWriteMap
401
  ///
402
  /// \todo Revise the misleading name 
394 403
  template<typename M> 
395 404
  class SimpleMap : public MapBase<typename M::Key, typename M::Value> {
396 405
    const M& m;
397 406

	
398 407
  public:
399 408
    typedef MapBase<typename M::Key, typename M::Value> Parent;
400 409
    typedef typename Parent::Key Key;
401 410
    typedef typename Parent::Value Value;
402 411

	
403 412
    ///Constructor
404 413
    SimpleMap(const M &_m) : m(_m) {};
405 414
    ///\e
406 415
    Value operator[](Key k) const {return m[k];}
407 416
  };
408 417

	
409
  ///Simple writeable wrapping of the map
418
  ///Simple writable wrapping of the map
410 419

	
411 420
  ///This \c concepts::WriteMap "write map" returns the simple
412 421
  ///wrapping of the given map. Sometimes the reference maps cannot be
413 422
  ///combined with simple read-write maps. This map adaptor wraps the
414 423
  ///given map to simple read-write map.
415 424
  ///
425
  ///\sa SimpleMap
426
  ///
416 427
  /// \todo Revise the misleading name
417 428
  template<typename M> 
418 429
  class SimpleWriteMap : public MapBase<typename M::Key, typename M::Value> {
419 430
    M& m;
420 431

	
421 432
  public:
422 433
    typedef MapBase<typename M::Key, typename M::Value> Parent;
423 434
    typedef typename Parent::Key Key;
424 435
    typedef typename Parent::Value Value;
425 436

	
426 437
    ///Constructor
427 438
    SimpleWriteMap(M &_m) : m(_m) {};
428 439
    ///\e
429 440
    Value operator[](Key k) const {return m[k];}
430 441
    ///\e
431 442
    void set(Key k, const Value& c) { m.set(k, c); }
432 443
  };
433 444

	
434 445
  ///Sum of two maps
435 446

	
436 447
  ///This \c concepts::ReadMap "read only map" returns the sum of the two
437
  ///given maps. Its \c Key and \c Value will be inherited from \c M1.
448
  ///given maps.
449
  ///Its \c Key and \c Value are inherited from \c M1.
438 450
  ///The \c Key and \c Value of M2 must be convertible to those of \c M1.
439

	
440 451
  template<typename M1, typename M2> 
441 452
  class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
442 453
    const M1& m1;
443 454
    const M2& m2;
444 455

	
445 456
  public:
446 457
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
447 458
    typedef typename Parent::Key Key;
448 459
    typedef typename Parent::Value Value;
449 460

	
450 461
    ///Constructor
451 462
    AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
... ...
@@ -459,109 +470,107 @@
459 470
  ///\todo How to call these type of functions?
460 471
  ///
461 472
  ///\relates AddMap
462 473
  template<typename M1, typename M2> 
463 474
  inline AddMap<M1, M2> addMap(const M1 &m1,const M2 &m2) {
464 475
    return AddMap<M1, M2>(m1,m2);
465 476
  }
466 477

	
467 478
  ///Shift a map with a constant.
468 479

	
469 480
  ///This \c concepts::ReadMap "read only map" returns the sum of the
470 481
  ///given map and a constant value.
471
  ///Its \c Key and \c Value is inherited from \c M.
482
  ///Its \c Key and \c Value are inherited from \c M.
472 483
  ///
473 484
  ///Actually,
474 485
  ///\code
475 486
  ///  ShiftMap<X> sh(x,v);
476 487
  ///\endcode
477
  ///is equivalent with
488
  ///is equivalent to
478 489
  ///\code
479 490
  ///  ConstMap<X::Key, X::Value> c_tmp(v);
480 491
  ///  AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
481 492
  ///\endcode
493
  ///
494
  ///\sa ShiftWriteMap
482 495
  template<typename M, typename C = typename M::Value> 
483 496
  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
484 497
    const M& m;
485 498
    C v;
486 499
  public:
487 500
    typedef MapBase<typename M::Key, typename M::Value> Parent;
488 501
    typedef typename Parent::Key Key;
489 502
    typedef typename Parent::Value Value;
490 503

	
491 504
    ///Constructor
492 505

	
493
    ///Constructor
494
    ///\param _m is the undelying map
495
    ///\param _v is the shift value
506
    ///Constructor.
507
    ///\param _m is the undelying map.
508
    ///\param _v is the shift value.
496 509
    ShiftMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
497 510
    ///\e
498 511
    Value operator[](Key k) const {return m[k] + v;}
499 512
  };
500 513

	
501
  ///Shift a map with a constant. This map is also writable.
514
  ///Shift a map with a constant (ReadWrite version).
502 515

	
503 516
  ///This \c concepts::ReadWriteMap "read-write map" returns the sum of the
504 517
  ///given map and a constant value. It makes also possible to write the map.
505
  ///Its \c Key and \c Value is inherited from \c M.
518
  ///Its \c Key and \c Value are inherited from \c M.
506 519
  ///
507
  ///Actually,
508
  ///\code
509
  ///  ShiftMap<X> sh(x,v);
510
  ///\endcode
511
  ///is equivalent with
512
  ///\code
513
  ///  ConstMap<X::Key, X::Value> c_tmp(v);
514
  ///  AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v);
515
  ///\endcode
520
  ///\sa ShiftMap
516 521
  template<typename M, typename C = typename M::Value> 
517 522
  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
518 523
    M& m;
519 524
    C v;
520 525
  public:
521 526
    typedef MapBase<typename M::Key, typename M::Value> Parent;
522 527
    typedef typename Parent::Key Key;
523 528
    typedef typename Parent::Value Value;
524 529

	
525 530
    ///Constructor
526 531

	
527
    ///Constructor
528
    ///\param _m is the undelying map
529
    ///\param _v is the shift value
532
    ///Constructor.
533
    ///\param _m is the undelying map.
534
    ///\param _v is the shift value.
530 535
    ShiftWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
531 536
    /// \e
532 537
    Value operator[](Key k) const {return m[k] + v;}
533 538
    /// \e
534 539
    void set(Key k, const Value& c) { m.set(k, c - v); }
535 540
  };
536 541
  
537
  ///Returns an \c ShiftMap class
542
  ///Returns a \c ShiftMap class
538 543

	
539
  ///This function just returns an \c ShiftMap class.
544
  ///This function just returns a \c ShiftMap class.
540 545
  ///\relates ShiftMap
541 546
  template<typename M, typename C> 
542 547
  inline ShiftMap<M, C> shiftMap(const M &m,const C &v) {
543 548
    return ShiftMap<M, C>(m,v);
544 549
  }
545 550

	
551
  ///Returns a \c ShiftWriteMap class
552

	
553
  ///This function just returns a \c ShiftWriteMap class.
554
  ///\relates ShiftWriteMap
546 555
  template<typename M, typename C> 
547 556
  inline ShiftWriteMap<M, C> shiftMap(M &m,const C &v) {
548 557
    return ShiftWriteMap<M, C>(m,v);
549 558
  }
550 559

	
551 560
  ///Difference of two maps
552 561

	
553 562
  ///This \c concepts::ReadMap "read only map" returns the difference
554
  ///of the values of the two
555
  ///given maps. Its \c Key and \c Value will be inherited from \c M1.
563
  ///of the values of the two given maps.
564
  ///Its \c Key and \c Value are inherited from \c M1.
556 565
  ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
557 566
  ///
558 567
  /// \todo Revise the misleading name
559 568
  template<typename M1, typename M2> 
560 569
  class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
561 570
    const M1& m1;
562 571
    const M2& m2;
563 572
  public:
564 573
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
565 574
    typedef typename Parent::Key Key;
566 575
    typedef typename Parent::Value Value;
567 576

	
... ...
@@ -575,135 +584,141 @@
575 584

	
576 585
  ///This function just returns a \c SubMap class.
577 586
  ///
578 587
  ///\relates SubMap
579 588
  template<typename M1, typename M2> 
580 589
  inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
581 590
    return SubMap<M1, M2>(m1, m2);
582 591
  }
583 592

	
584 593
  ///Product of two maps
585 594

	
586 595
  ///This \c concepts::ReadMap "read only map" returns the product of the
587
  ///values of the two
588
  ///given
589
  ///maps. Its \c Key and \c Value will be inherited from \c M1.
596
  ///values of the two given maps.
597
  ///Its \c Key and \c Value are inherited from \c M1.
590 598
  ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
591

	
592 599
  template<typename M1, typename M2> 
593 600
  class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
594 601
    const M1& m1;
595 602
    const M2& m2;
596 603
  public:
597 604
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
598 605
    typedef typename Parent::Key Key;
599 606
    typedef typename Parent::Value Value;
600 607

	
601 608
    ///Constructor
602 609
    MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
603 610
    /// \e
604 611
    Value operator[](Key k) const {return m1[k]*m2[k];}
605 612
  };
606 613
  
607 614
  ///Returns a \c MulMap class
608 615

	
609 616
  ///This function just returns a \c MulMap class.
610 617
  ///\relates MulMap
611 618
  template<typename M1, typename M2> 
612 619
  inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
613 620
    return MulMap<M1, M2>(m1,m2);
614 621
  }
615 622
 
616
  ///Scales a maps with a constant.
623
  ///Scales a map with a constant.
617 624

	
618 625
  ///This \c concepts::ReadMap "read only map" returns the value of the
619 626
  ///given map multiplied from the left side with a constant value.
620
  ///Its \c Key and \c Value is inherited from \c M.
627
  ///Its \c Key and \c Value are inherited from \c M.
621 628
  ///
622 629
  ///Actually,
623 630
  ///\code
624 631
  ///  ScaleMap<X> sc(x,v);
625 632
  ///\endcode
626
  ///is equivalent with
633
  ///is equivalent to
627 634
  ///\code
628 635
  ///  ConstMap<X::Key, X::Value> c_tmp(v);
629 636
  ///  MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v);
630 637
  ///\endcode
638
  ///
639
  ///\sa ScaleWriteMap
631 640
  template<typename M, typename C = typename M::Value> 
632 641
  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
633 642
    const M& m;
634 643
    C v;
635 644
  public:
636 645
    typedef MapBase<typename M::Key, typename M::Value> Parent;
637 646
    typedef typename Parent::Key Key;
638 647
    typedef typename Parent::Value Value;
639 648

	
640 649
    ///Constructor
641 650

	
642
    ///Constructor
643
    ///\param _m is the undelying map
644
    ///\param _v is the scaling value
651
    ///Constructor.
652
    ///\param _m is the undelying map.
653
    ///\param _v is the scaling value.
645 654
    ScaleMap(const M &_m, const C &_v ) : m(_m), v(_v) {};
646 655
    /// \e
647 656
    Value operator[](Key k) const {return v * m[k];}
648 657
  };
649 658

	
650
  ///Scales a maps with a constant (ReadWrite version).
659
  ///Scales a map with a constant (ReadWrite version).
651 660

	
652 661
  ///This \c concepts::ReadWriteMap "read-write map" returns the value of the
653 662
  ///given map multiplied from the left side with a constant value. It can
654
  ///be used as write map also if the given multiplier is not zero.
655
  ///Its \c Key and \c Value is inherited from \c M.
663
  ///also be used as write map if the \c / operator is defined between
664
  ///\c Value and \c C and the given multiplier is not zero.
665
  ///Its \c Key and \c Value are inherited from \c M.
666
  ///
667
  ///\sa ScaleMap
656 668
  template<typename M, typename C = typename M::Value> 
657 669
  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
658 670
    M& m;
659 671
    C v;
660 672
  public:
661 673
    typedef MapBase<typename M::Key, typename M::Value> Parent;
662 674
    typedef typename Parent::Key Key;
663 675
    typedef typename Parent::Value Value;
664 676

	
665 677
    ///Constructor
666 678

	
667
    ///Constructor
668
    ///\param _m is the undelying map
669
    ///\param _v is the scaling value
679
    ///Constructor.
680
    ///\param _m is the undelying map.
681
    ///\param _v is the scaling value.
670 682
    ScaleWriteMap(M &_m, const C &_v ) : m(_m), v(_v) {};
671 683
    /// \e
672 684
    Value operator[](Key k) const {return v * m[k];}
673 685
    /// \e
674 686
    void set(Key k, const Value& c) { m.set(k, c / v);}
675 687
  };
676 688
  
677
  ///Returns an \c ScaleMap class
689
  ///Returns a \c ScaleMap class
678 690

	
679
  ///This function just returns an \c ScaleMap class.
691
  ///This function just returns a \c ScaleMap class.
680 692
  ///\relates ScaleMap
681 693
  template<typename M, typename C> 
682 694
  inline ScaleMap<M, C> scaleMap(const M &m,const C &v) {
683 695
    return ScaleMap<M, C>(m,v);
684 696
  }
685 697

	
698
  ///Returns a \c ScaleWriteMap class
699

	
700
  ///This function just returns a \c ScaleWriteMap class.
701
  ///\relates ScaleWriteMap
686 702
  template<typename M, typename C> 
687 703
  inline ScaleWriteMap<M, C> scaleMap(M &m,const C &v) {
688 704
    return ScaleWriteMap<M, C>(m,v);
689 705
  }
690 706

	
691 707
  ///Quotient of two maps
692 708

	
693 709
  ///This \c concepts::ReadMap "read only map" returns the quotient of the
694
  ///values of the two
695
  ///given maps. Its \c Key and \c Value will be inherited from \c M1.
710
  ///values of the two given maps.
711
  ///Its \c Key and \c Value are inherited from \c M1.
696 712
  ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1.
697

	
698 713
  template<typename M1, typename M2> 
699 714
  class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
700 715
    const M1& m1;
701 716
    const M2& m2;
702 717
  public:
703 718
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
704 719
    typedef typename Parent::Key Key;
705 720
    typedef typename Parent::Value Value;
706 721

	
707 722
    ///Constructor
708 723
    DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
709 724
    /// \e
... ...
@@ -713,90 +728,91 @@
713 728
  ///Returns a \c DivMap class
714 729

	
715 730
  ///This function just returns a \c DivMap class.
716 731
  ///\relates DivMap
717 732
  template<typename M1, typename M2> 
718 733
  inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
719 734
    return DivMap<M1, M2>(m1,m2);
720 735
  }
721 736
  
722 737
  ///Composition of two maps
723 738

	
724 739
  ///This \c concepts::ReadMap "read only map" returns the composition of
725
  ///two
726
  ///given maps. That is to say, if \c m1 is of type \c M1 and \c m2 is
727
  ///of \c M2,
740
  ///two given maps.
741
  ///That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2,
728 742
  ///then for
729 743
  ///\code
730 744
  ///  ComposeMap<M1, M2> cm(m1,m2);
731 745
  ///\endcode
732
  /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>
746
  /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
733 747
  ///
734
  ///Its \c Key is inherited from \c M2 and its \c Value is from
735
  ///\c M1.
736
  ///The \c M2::Value must be convertible to \c M1::Key.
748
  ///Its \c Key is inherited from \c M2 and its \c Value is from \c M1.
749
  ///\c M2::Value must be convertible to \c M1::Key.
750
  ///
751
  ///\sa CombineMap
752
  ///
737 753
  ///\todo Check the requirements.
738 754
  template <typename M1, typename M2> 
739 755
  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
740 756
    const M1& m1;
741 757
    const M2& m2;
742 758
  public:
743 759
    typedef MapBase<typename M2::Key, typename M1::Value> Parent;
744 760
    typedef typename Parent::Key Key;
745 761
    typedef typename Parent::Value Value;
746 762

	
747 763
    ///Constructor
748 764
    ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {};
749 765
    
750 766
    /// \e
751 767

	
752 768

	
753 769
    /// \todo Use the  MapTraits once it is ported.
754 770
    ///
755 771

	
756 772
    //typename MapTraits<M1>::ConstReturnValue
757 773
    typename M1::Value
758 774
    operator[](Key k) const {return m1[m2[k]];}
759 775
  };
776

	
760 777
  ///Returns a \c ComposeMap class
761 778

	
762 779
  ///This function just returns a \c ComposeMap class.
763
  ///
764 780
  ///\relates ComposeMap
765 781
  template <typename M1, typename M2> 
766 782
  inline ComposeMap<M1, M2> composeMap(const M1 &m1,const M2 &m2) {
767 783
    return ComposeMap<M1, M2>(m1,m2);
768 784
  }
769 785
  
770
  ///Combines of two maps using an STL (binary) functor.
786
  ///Combine of two maps using an STL (binary) functor.
771 787

	
772
  ///Combines of two maps using an STL (binary) functor.
773
  ///
788
  ///Combine of two maps using an STL (binary) functor.
774 789
  ///
775 790
  ///This \c concepts::ReadMap "read only map" takes two maps and a
776
  ///binary functor and returns the composition of
777
  ///the two
791
  ///binary functor and returns the composition of the two
778 792
  ///given maps unsing the functor. 
779 793
  ///That is to say, if \c m1 and \c m2 is of type \c M1 and \c M2
780
  ///and \c f is of \c F,
781
  ///then for
794
  ///and \c f is of \c F, then for
782 795
  ///\code
783
  ///  CombineMap<M1, M2,F,V> cm(m1,m2,f);
796
  ///  CombineMap<M1,M2,F,V> cm(m1,m2,f);
784 797
  ///\endcode
785 798
  /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>
786 799
  ///
787 800
  ///Its \c Key is inherited from \c M1 and its \c Value is \c V.
788
  ///The \c M2::Value and \c M1::Value must be convertible to the corresponding
801
  ///\c M2::Value and \c M1::Value must be convertible to the corresponding
789 802
  ///input parameter of \c F and the return type of \c F must be convertible
790 803
  ///to \c V.
804
  ///
805
  ///\sa ComposeMap
806
  ///
791 807
  ///\todo Check the requirements.
792 808
  template<typename M1, typename M2, typename F,
793 809
	   typename V = typename F::result_type> 
794 810
  class CombineMap : public MapBase<typename M1::Key, V> {
795 811
    const M1& m1;
796 812
    const M2& m2;
797 813
    F f;
798 814
  public:
799 815
    typedef MapBase<typename M1::Key, V> Parent;
800 816
    typedef typename Parent::Key Key;
801 817
    typedef typename Parent::Value Value;
802 818

	
... ...
@@ -806,80 +822,81 @@
806 822
    /// \e
807 823
    Value operator[](Key k) const {return f(m1[k],m2[k]);}
808 824
  };
809 825
  
810 826
  ///Returns a \c CombineMap class
811 827

	
812 828
  ///This function just returns a \c CombineMap class.
813 829
  ///
814 830
  ///For example if \c m1 and \c m2 are both \c double valued maps, then 
815 831
  ///\code
816 832
  ///combineMap<double>(m1,m2,std::plus<double>())
817 833
  ///\endcode
818
  ///is equivalent with
834
  ///is equivalent to
819 835
  ///\code
820 836
  ///addMap(m1,m2)
821 837
  ///\endcode
822 838
  ///
823 839
  ///This function is specialized for adaptable binary function
824
  ///classes and c++ functions.
840
  ///classes and C++ functions.
825 841
  ///
826 842
  ///\relates CombineMap
827 843
  template<typename M1, typename M2, typename F, typename V> 
828 844
  inline CombineMap<M1, M2, F, V> 
829 845
  combineMap(const M1& m1,const M2& m2, const F& f) {
830 846
    return CombineMap<M1, M2, F, V>(m1,m2,f);
831 847
  }
832 848

	
833 849
  template<typename M1, typename M2, typename F> 
834 850
  inline CombineMap<M1, M2, F, typename F::result_type> 
835 851
  combineMap(const M1& m1, const M2& m2, const F& f) {
836 852
    return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
837 853
  }
838 854

	
839 855
  template<typename M1, typename M2, typename K1, typename K2, typename V> 
840 856
  inline CombineMap<M1, M2, V (*)(K1, K2), V> 
841 857
  combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
842 858
    return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
843 859
  }
844 860

	
845 861
  ///Negative value of a map
846 862

	
847 863
  ///This \c concepts::ReadMap "read only map" returns the negative
848
  ///value of the
849
  ///value returned by the
850
  ///given map. Its \c Key and \c Value will be inherited from \c M.
864
  ///value of the value returned by the given map.
865
  ///Its \c Key and \c Value are inherited from \c M.
851 866
  ///The unary \c - operator must be defined for \c Value, of course.
852

	
867
  ///
868
  ///\sa NegWriteMap
853 869
  template<typename M> 
854 870
  class NegMap : public MapBase<typename M::Key, typename M::Value> {
855 871
    const M& m;
856 872
  public:
857 873
    typedef MapBase<typename M::Key, typename M::Value> Parent;
858 874
    typedef typename Parent::Key Key;
859 875
    typedef typename Parent::Value Value;
860 876

	
861 877
    ///Constructor
862 878
    NegMap(const M &_m) : m(_m) {};
863 879
    /// \e
864 880
    Value operator[](Key k) const {return -m[k];}
865 881
  };
866 882
  
867 883
  ///Negative value of a map (ReadWrite version)
868 884

	
869 885
  ///This \c concepts::ReadWriteMap "read-write map" returns the negative
870
  ///value of the value returned by the
871
  ///given map. Its \c Key and \c Value will be inherited from \c M.
886
  ///value of the value returned by the given map.
887
  ///Its \c Key and \c Value are inherited from \c M.
872 888
  ///The unary \c - operator must be defined for \c Value, of course.
873

	
889
  ///
890
  /// \sa NegMap
874 891
  template<typename M> 
875 892
  class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
876 893
    M& m;
877 894
  public:
878 895
    typedef MapBase<typename M::Key, typename M::Value> Parent;
879 896
    typedef typename Parent::Key Key;
880 897
    typedef typename Parent::Value Value;
881 898

	
882 899
    ///Constructor
883 900
    NegWriteMap(M &_m) : m(_m) {};
884 901
    /// \e
885 902
    Value operator[](Key k) const {return -m[k];}
... ...
@@ -887,100 +904,101 @@
887 904
    void set(Key k, const Value& v) { m.set(k, -v); }
888 905
  };
889 906

	
890 907
  ///Returns a \c NegMap class
891 908

	
892 909
  ///This function just returns a \c NegMap class.
893 910
  ///\relates NegMap
894 911
  template <typename M> 
895 912
  inline NegMap<M> negMap(const M &m) {
896 913
    return NegMap<M>(m);
897 914
  }
898 915

	
916
  ///Returns a \c NegWriteMap class
917

	
918
  ///This function just returns a \c NegWriteMap class.
919
  ///\relates NegWriteMap
899 920
  template <typename M> 
900 921
  inline NegWriteMap<M> negMap(M &m) {
901 922
    return NegWriteMap<M>(m);
902 923
  }
903 924

	
904 925
  ///Absolute value of a map
905 926

	
906 927
  ///This \c concepts::ReadMap "read only map" returns the absolute value
907
  ///of the
908
  ///value returned by the
909
  ///given map. Its \c Key and \c Value will be inherited
910
  ///from <tt>M</tt>. <tt>Value</tt>
911
  ///must be comparable to <tt>0</tt> and the unary <tt>-</tt>
928
  ///of the value returned by the given map.
929
  ///Its \c Key and \c Value are inherited from \c M. 
930
  ///\c Value must be comparable to \c 0 and the unary \c -
912 931
  ///operator must be defined for it, of course.
913
  ///
914

	
915 932
  template<typename M> 
916 933
  class AbsMap : public MapBase<typename M::Key, typename M::Value> {
917 934
    const M& m;
918 935
  public:
919 936
    typedef MapBase<typename M::Key, typename M::Value> Parent;
920 937
    typedef typename Parent::Key Key;
921 938
    typedef typename Parent::Value Value;
922 939

	
923 940
    ///Constructor
924 941
    AbsMap(const M &_m) : m(_m) {};
925 942
    /// \e
926 943
    Value operator[](Key k) const {
927 944
      Value tmp = m[k]; 
928 945
      return tmp >= 0 ? tmp : -tmp;
929 946
    }
930 947

	
931 948
  };
932 949
  
933
  ///Returns a \c AbsMap class
950
  ///Returns an \c AbsMap class
934 951

	
935
  ///This function just returns a \c AbsMap class.
952
  ///This function just returns an \c AbsMap class.
936 953
  ///\relates AbsMap
937 954
  template<typename M> 
938 955
  inline AbsMap<M> absMap(const M &m) {
939 956
    return AbsMap<M>(m);
940 957
  }
941 958

	
942 959
  ///Converts an STL style functor to a map
943 960

	
944 961
  ///This \c concepts::ReadMap "read only map" returns the value
945
  ///of a
946
  ///given map.
962
  ///of a given functor.
947 963
  ///
948 964
  ///Template parameters \c K and \c V will become its
949
  ///\c Key and \c Value. They must be given explicitely
965
  ///\c Key and \c Value. They must be given explicitly
950 966
  ///because a functor does not provide such typedefs.
951 967
  ///
952 968
  ///Parameter \c F is the type of the used functor.
969
  ///
970
  ///\sa MapFunctor
953 971
  template<typename F, 
954 972
	   typename K = typename F::argument_type, 
955 973
	   typename V = typename F::result_type> 
956 974
  class FunctorMap : public MapBase<K, V> {
957 975
    F f;
958 976
  public:
959 977
    typedef MapBase<K, V> Parent;
960 978
    typedef typename Parent::Key Key;
961 979
    typedef typename Parent::Value Value;
962 980

	
963 981
    ///Constructor
964 982
    FunctorMap(const F &_f = F()) : f(_f) {}
965 983
    /// \e
966 984
    Value operator[](Key k) const { return f(k);}
967 985
  };
968 986
  
969 987
  ///Returns a \c FunctorMap class
970 988

	
971 989
  ///This function just returns a \c FunctorMap class.
972 990
  ///
973 991
  ///It is specialized for adaptable function classes and
974
  ///c++ functions.
992
  ///C++ functions.
975 993
  ///\relates FunctorMap
976 994
  template<typename K, typename V, typename F> inline 
977 995
  FunctorMap<F, K, V> functorMap(const F &f) {
978 996
    return FunctorMap<F, K, V>(f);
979 997
  }
980 998

	
981 999
  template <typename F> inline 
982 1000
  FunctorMap<F, typename F::argument_type, typename F::result_type> 
983 1001
  functorMap(const F &f) {
984 1002
    return FunctorMap<F, typename F::argument_type, 
985 1003
      typename F::result_type>(f);
986 1004
  }
... ...
@@ -990,24 +1008,26 @@
990 1008
    return FunctorMap<V (*)(K), K, V>(f);
991 1009
  }
992 1010

	
993 1011

	
994 1012
  ///Converts a map to an STL style (unary) functor
995 1013

	
996 1014
  ///This class Converts a map to an STL style (unary) functor.
997 1015
  ///that is it provides an <tt>operator()</tt> to read its values.
998 1016
  ///
999 1017
  ///For the sake of convenience it also works as
1000 1018
  ///a ususal \c concepts::ReadMap "readable map",
1001 1019
  ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist.
1020
  ///
1021
  ///\sa FunctorMap
1002 1022
  template <typename M> 
1003 1023
  class MapFunctor : public MapBase<typename M::Key, typename M::Value> {
1004 1024
    const M& m;
1005 1025
  public:
1006 1026
    typedef MapBase<typename M::Key, typename M::Value> Parent;
1007 1027
    typedef typename Parent::Key Key;
1008 1028
    typedef typename Parent::Value Value;
1009 1029

	
1010 1030
    typedef typename M::Key argument_type;
1011 1031
    typedef typename M::Value result_type;
1012 1032

	
1013 1033
    ///Constructor
... ...
@@ -1024,27 +1044,29 @@
1024 1044
  ///\relates MapFunctor
1025 1045
  template<typename M> 
1026 1046
  inline MapFunctor<M> mapFunctor(const M &m) {
1027 1047
    return MapFunctor<M>(m);
1028 1048
  }
1029 1049

	
1030 1050
  ///Applies all map setting operations to two maps
1031 1051

	
1032 1052
  ///This map has two \c concepts::ReadMap "readable map"
1033 1053
  ///parameters and each read request will be passed just to the
1034 1054
  ///first map. This class is the just readable map type of the ForkWriteMap.
1035 1055
  ///
1036
  ///The \c Key and \c Value will be inherited from \c M1.
1056
  ///The \c Key and \c Value are inherited from \c M1.
1037 1057
  ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
1038 1058
  ///
1059
  ///\sa ForkWriteMap
1060
  ///
1039 1061
  /// \todo Why is it needed?
1040 1062
  template<typename  M1, typename M2> 
1041 1063
  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
1042 1064
    const M1& m1;
1043 1065
    const M2& m2;
1044 1066
  public:
1045 1067
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
1046 1068
    typedef typename Parent::Key Key;
1047 1069
    typedef typename Parent::Value Value;
1048 1070

	
1049 1071
    ///Constructor
1050 1072
    ForkMap(const M1 &_m1, const M2 &_m2) : m1(_m1), m2(_m2) {};
... ...
@@ -1052,90 +1074,96 @@
1052 1074
    Value operator[](Key k) const {return m1[k];}
1053 1075
  };
1054 1076

	
1055 1077

	
1056 1078
  ///Applies all map setting operations to two maps
1057 1079

	
1058 1080
  ///This map has two \c concepts::WriteMap "writable map"
1059 1081
  ///parameters and each write request will be passed to both of them.
1060 1082
  ///If \c M1 is also \c concepts::ReadMap "readable",
1061 1083
  ///then the read operations will return the
1062 1084
  ///corresponding values of \c M1.
1063 1085
  ///
1064
  ///The \c Key and \c Value will be inherited from \c M1.
1086
  ///The \c Key and \c Value are inherited from \c M1.
1065 1087
  ///The \c Key and \c Value of M2 must be convertible from those of \c M1.
1088
  ///
1089
  ///\sa ForkMap
1066 1090
  template<typename  M1, typename M2> 
1067 1091
  class ForkWriteMap : public MapBase<typename M1::Key, typename M1::Value> {
1068 1092
    M1& m1;
1069 1093
    M2& m2;
1070 1094
  public:
1071 1095
    typedef MapBase<typename M1::Key, typename M1::Value> Parent;
1072 1096
    typedef typename Parent::Key Key;
1073 1097
    typedef typename Parent::Value Value;
1074 1098

	
1075 1099
    ///Constructor
1076 1100
    ForkWriteMap(M1 &_m1, M2 &_m2) : m1(_m1), m2(_m2) {};
1077 1101
    ///\e
1078 1102
    Value operator[](Key k) const {return m1[k];}
1079 1103
    ///\e
1080 1104
    void set(Key k, const Value &v) {m1.set(k,v); m2.set(k,v);}
1081 1105
  };
1082 1106
  
1083
  ///Returns an \c ForkMap class
1107
  ///Returns a \c ForkMap class
1084 1108

	
1085
  ///This function just returns an \c ForkMap class.
1086
  ///
1109
  ///This function just returns a \c ForkMap class.
1087 1110
  ///\relates ForkMap
1088 1111
  template <typename M1, typename M2> 
1089 1112
  inline ForkMap<M1, M2> forkMap(const M1 &m1, const M2 &m2) {
1090 1113
    return ForkMap<M1, M2>(m1,m2);
1091 1114
  }
1092 1115

	
1116
  ///Returns a \c ForkWriteMap class
1117

	
1118
  ///This function just returns a \c ForkWriteMap class.
1119
  ///\relates ForkWriteMap
1093 1120
  template <typename M1, typename M2> 
1094 1121
  inline ForkWriteMap<M1, M2> forkMap(M1 &m1, M2 &m2) {
1095 1122
    return ForkWriteMap<M1, M2>(m1,m2);
1096 1123
  }
1097 1124

	
1098 1125

	
1099 1126
  
1100 1127
  /* ************* BOOL MAPS ******************* */
1101 1128
  
1102 1129
  ///Logical 'not' of a map
1103 1130
  
1104 1131
  ///This bool \c concepts::ReadMap "read only map" returns the 
1105
  ///logical negation of
1106
  ///value returned by the
1107
  ///given map. Its \c Key and will be inherited from \c M,
1108
  ///its Value is <tt>bool</tt>.
1132
  ///logical negation of the value returned by the given map.
1133
  ///Its \c Key is inherited from \c M, its Value is \c bool.
1134
  ///
1135
  ///\sa NotWriteMap
1109 1136
  template <typename M> 
1110 1137
  class NotMap : public MapBase<typename M::Key, bool> {
1111 1138
    const M& m;
1112 1139
  public:
1113 1140
    typedef MapBase<typename M::Key, bool> Parent;
1114 1141
    typedef typename Parent::Key Key;
1115 1142
    typedef typename Parent::Value Value;
1116 1143

	
1117 1144
    /// Constructor
1118 1145
    NotMap(const M &_m) : m(_m) {};
1119 1146
    ///\e
1120 1147
    Value operator[](Key k) const {return !m[k];}
1121 1148
  };
1122 1149

	
1123 1150
  ///Logical 'not' of a map (ReadWrie version)
1124 1151
  
1125 1152
  ///This bool \c concepts::ReadWriteMap "read-write map" returns the 
1126
  ///logical negation of value returned by the given map. When it is set,
1153
  ///logical negation of the value returned by the given map. When it is set,
1127 1154
  ///the opposite value is set to the original map.
1128
  ///Its \c Key and will be inherited from \c M,
1129
  ///its Value is <tt>bool</tt>.
1155
  ///Its \c Key is inherited from \c M, its Value is \c bool.
1156
  ///
1157
  ///\sa NotMap
1130 1158
  template <typename M> 
1131 1159
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1132 1160
    M& m;
1133 1161
  public:
1134 1162
    typedef MapBase<typename M::Key, bool> Parent;
1135 1163
    typedef typename Parent::Key Key;
1136 1164
    typedef typename Parent::Value Value;
1137 1165

	
1138 1166
    /// Constructor
1139 1167
    NotWriteMap(M &_m) : m(_m) {};
1140 1168
    ///\e
1141 1169
    Value operator[](Key k) const {return !m[k];}
... ...
@@ -1143,24 +1171,28 @@
1143 1171
    void set(Key k, bool v) { m.set(k, !v); }
1144 1172
  };
1145 1173
  
1146 1174
  ///Returns a \c NotMap class
1147 1175
  
1148 1176
  ///This function just returns a \c NotMap class.
1149 1177
  ///\relates NotMap
1150 1178
  template <typename M> 
1151 1179
  inline NotMap<M> notMap(const M &m) {
1152 1180
    return NotMap<M>(m);
1153 1181
  }
1154 1182
  
1183
  ///Returns a \c NotWriteMap class
1184
  
1185
  ///This function just returns a \c NotWriteMap class.
1186
  ///\relates NotWriteMap
1155 1187
  template <typename M> 
1156 1188
  inline NotWriteMap<M> notMap(M &m) {
1157 1189
    return NotWriteMap<M>(m);
1158 1190
  }
1159 1191

	
1160 1192
  namespace _maps_bits {
1161 1193

	
1162 1194
    template <typename Value>
1163 1195
    struct Identity {
1164 1196
      typedef Value argument_type;
1165 1197
      typedef Value result_type;
1166 1198
      Value operator()(const Value& val) const {
... ...
@@ -1174,49 +1206,51 @@
1174 1206
    };
1175 1207

	
1176 1208
    template <typename _Iterator>
1177 1209
    struct IteratorTraits<_Iterator,
1178 1210
      typename exists<typename _Iterator::container_type>::type> 
1179 1211
    {
1180 1212
      typedef typename _Iterator::container_type::value_type Value;
1181 1213
    };
1182 1214

	
1183 1215
  }
1184 1216
  
1185 1217

	
1186
  /// \brief Writable bool map for logging each true assigned elements
1218
  /// \brief Writable bool map for logging each \c true assigned element
1187 1219
  ///
1188
  /// Writable bool map for logging each true assigned elements, i.e it
1189
  /// copies all the keys set to true to the given iterator.
1220
  /// Writable bool map for logging each \c true assigned element, i.e it
1221
  /// copies all the keys set to \c true to the given iterator.
1190 1222
  ///
1191 1223
  /// \note The container of the iterator should contain space 
1192 1224
  /// for each element.
1193 1225
  ///
1194 1226
  /// The following example shows how you can write the edges found by the Prim
1195 1227
  /// algorithm directly
1196 1228
  /// to the standard output.
1197 1229
  ///\code
1198 1230
  /// typedef IdMap<Graph, Edge> EdgeIdMap;
1199 1231
  /// EdgeIdMap edgeId(graph);
1200 1232
  ///
1201 1233
  /// typedef MapFunctor<EdgeIdMap> EdgeIdFunctor;
1202 1234
  /// EdgeIdFunctor edgeIdFunctor(edgeId);
1203 1235
  ///
1204 1236
  /// StoreBoolMap<ostream_iterator<int>, EdgeIdFunctor> 
1205 1237
  ///   writerMap(ostream_iterator<int>(cout, " "), edgeIdFunctor);
1206 1238
  ///
1207 1239
  /// prim(graph, cost, writerMap);
1208 1240
  ///\endcode
1209 1241
  ///
1210
  ///\todo Revise the name of this class and the relates ones.
1242
  ///\sa BackInserterBoolMap 
1243
  ///
1244
  ///\todo Revise the name of this class and the related ones.
1211 1245
  template <typename _Iterator, 
1212 1246
            typename _Functor =
1213 1247
            _maps_bits::Identity<typename _maps_bits::
1214 1248
                                 IteratorTraits<_Iterator>::Value> >
1215 1249
  class StoreBoolMap {
1216 1250
  public:
1217 1251
    typedef _Iterator Iterator;
1218 1252

	
1219 1253
    typedef typename _Functor::argument_type Key;
1220 1254
    typedef bool Value;
1221 1255

	
1222 1256
    typedef _Functor Functor;
... ...
@@ -1226,158 +1260,179 @@
1226 1260
      : _begin(it), _end(it), _functor(functor) {}
1227 1261

	
1228 1262
    /// Gives back the given iterator set for the first key
1229 1263
    Iterator begin() const {
1230 1264
      return _begin;
1231 1265
    }
1232 1266
 
1233 1267
    /// Gives back the the 'after the last' iterator
1234 1268
    Iterator end() const {
1235 1269
      return _end;
1236 1270
    }
1237 1271

	
1238
    /// Setter function of the map
1272
    /// The \c set function of the map
1239 1273
    void set(const Key& key, Value value) const {
1240 1274
      if (value) {
1241 1275
	*_end++ = _functor(key);
1242 1276
      }
1243 1277
    }
1244 1278
    
1245 1279
  private:
1246 1280
    Iterator _begin;
1247 1281
    mutable Iterator _end;
1248 1282
    Functor _functor;
1249 1283
  };
1250 1284

	
1251
  /// \brief Writable bool map for logging each true assigned elements in 
1252
  /// a back insertable container
1285
  /// \brief Writable bool map for logging each \c true assigned element in 
1286
  /// a back insertable container.
1253 1287
  ///
1254
  /// Writable bool map for logging each true assigned elements by pushing
1255
  /// back them into a back insertable container.
1288
  /// Writable bool map for logging each \c true assigned element by pushing
1289
  /// them into a back insertable container.
1256 1290
  /// It can be used to retrieve the items into a standard
1257 1291
  /// container. The next example shows how you can store the
1258 1292
  /// edges found by the Prim algorithm in a vector.
1259 1293
  ///
1260 1294
  ///\code
1261 1295
  /// vector<Edge> span_tree_edges;
1262 1296
  /// BackInserterBoolMap<vector<Edge> > inserter_map(span_tree_edges);
1263 1297
  /// prim(graph, cost, inserter_map);
1264 1298
  ///\endcode
1299
  ///
1300
  ///\sa StoreBoolMap
1301
  ///\sa FrontInserterBoolMap
1302
  ///\sa InserterBoolMap
1265 1303
  template <typename Container,
1266 1304
            typename Functor =
1267 1305
            _maps_bits::Identity<typename Container::value_type> >
1268 1306
  class BackInserterBoolMap {
1269 1307
  public:
1270 1308
    typedef typename Container::value_type Key;
1271 1309
    typedef bool Value;
1272 1310

	
1273 1311
    /// Constructor
1274 1312
    BackInserterBoolMap(Container& _container, 
1275 1313
                        const Functor& _functor = Functor()) 
1276 1314
      : container(_container), functor(_functor) {}
1277 1315

	
1278
    /// Setter function of the map
1316
    /// The \c set function of the map
1279 1317
    void set(const Key& key, Value value) {
1280 1318
      if (value) {
1281 1319
	container.push_back(functor(key));
1282 1320
      }
1283 1321
    }
1284 1322
    
1285 1323
  private:
1286 1324
    Container& container;
1287 1325
    Functor functor;
1288 1326
  };
1289 1327

	
1290
  /// \brief Writable bool map for storing each true assignments in 
1328
  /// \brief Writable bool map for logging each \c true assigned element in 
1291 1329
  /// a front insertable container.
1292 1330
  ///
1293
  /// Writable bool map for storing each true assignment in a front 
1294
  /// insertable container. It will push front all the keys set to \c true into
1295
  /// the container. For example see the BackInserterBoolMap.
1331
  /// Writable bool map for logging each \c true assigned element by pushing
1332
  /// them into a front insertable container.
1333
  /// It can be used to retrieve the items into a standard
1334
  /// container. For example see \ref BackInserterBoolMap.
1335
  ///
1336
  ///\sa BackInserterBoolMap
1337
  ///\sa InserterBoolMap
1296 1338
  template <typename Container,
1297 1339
            typename Functor =
1298 1340
            _maps_bits::Identity<typename Container::value_type> >
1299 1341
  class FrontInserterBoolMap {
1300 1342
  public:
1301 1343
    typedef typename Container::value_type Key;
1302 1344
    typedef bool Value;
1303 1345

	
1304 1346
    /// Constructor
1305 1347
    FrontInserterBoolMap(Container& _container,
1306 1348
                         const Functor& _functor = Functor()) 
1307 1349
      : container(_container), functor(_functor) {}
1308 1350

	
1309
    /// Setter function of the map
1351
    /// The \c set function of the map
1310 1352
    void set(const Key& key, Value value) {
1311 1353
      if (value) {
1312 1354
	container.push_front(key);
1313 1355
      }
1314 1356
    }
1315 1357
    
1316 1358
  private:
1317 1359
    Container& container;    
1318 1360
    Functor functor;
1319 1361
  };
1320 1362

	
1321
  /// \brief Writable bool map for storing each true assigned elements in 
1363
  /// \brief Writable bool map for storing each \c true assigned element in 
1322 1364
  /// an insertable container.
1323 1365
  ///
1324
  /// Writable bool map for storing each true assigned elements in an 
1366
  /// Writable bool map for storing each \c true assigned element in an 
1325 1367
  /// insertable container. It will insert all the keys set to \c true into
1326 1368
  /// the container.
1327 1369
  ///
1328 1370
  /// For example, if you want to store the cut arcs of the strongly
1329 1371
  /// connected components in a set you can use the next code:
1330 1372
  ///
1331 1373
  ///\code
1332 1374
  /// set<Arc> cut_arcs;
1333 1375
  /// InserterBoolMap<set<Arc> > inserter_map(cut_arcs);
1334 1376
  /// stronglyConnectedCutArcs(digraph, cost, inserter_map);
1335 1377
  ///\endcode
1378
  ///
1379
  ///\sa BackInserterBoolMap
1380
  ///\sa FrontInserterBoolMap
1336 1381
  template <typename Container,
1337 1382
            typename Functor =
1338 1383
            _maps_bits::Identity<typename Container::value_type> >
1339 1384
  class InserterBoolMap {
1340 1385
  public:
1341 1386
    typedef typename Container::value_type Key;
1342 1387
    typedef bool Value;
1343 1388

	
1344
    /// Constructor
1389
    /// Constructor with specified iterator
1390
    
1391
    /// Constructor with specified iterator.
1392
    /// \param _container The container for storing the elements.
1393
    /// \param _it The elements will be inserted before this iterator.
1394
    /// \param _functor The functor that is used when an element is stored.
1345 1395
    InserterBoolMap(Container& _container, typename Container::iterator _it,
1346 1396
                    const Functor& _functor = Functor()) 
1347 1397
      : container(_container), it(_it), functor(_functor) {}
1348 1398

	
1349 1399
    /// Constructor
1400

	
1401
    /// Constructor without specified iterator.
1402
    /// The elements will be inserted before <tt>_container.end()</tt>.
1403
    /// \param _container The container for storing the elements.
1404
    /// \param _functor The functor that is used when an element is stored.
1350 1405
    InserterBoolMap(Container& _container, const Functor& _functor = Functor())
1351 1406
      : container(_container), it(_container.end()), functor(_functor) {}
1352 1407

	
1353
    /// Setter function of the map
1408
    /// The \c set function of the map
1354 1409
    void set(const Key& key, Value value) {
1355 1410
      if (value) {
1356 1411
	it = container.insert(it, key);
1357 1412
        ++it;
1358 1413
      }
1359 1414
    }
1360 1415
    
1361 1416
  private:
1362 1417
    Container& container;
1363 1418
    typename Container::iterator it;
1364 1419
    Functor functor;
1365 1420
  };
1366 1421

	
1367
  /// \brief Fill the true set elements with a given value.
1422
  /// \brief Writable bool map for filling each \c true assigned element with a 
1423
  /// given value.
1368 1424
  ///
1369
  /// Writable bool map to fill the elements set to \c true with a given value.
1370
  /// The value can set 
1371
  /// the container.
1425
  /// Writable bool map for filling each \c true assigned element with a 
1426
  /// given value. The value can set the container.
1372 1427
  ///
1373 1428
  /// The following code finds the connected components of a graph
1374 1429
  /// and stores it in the \c comp map:
1375 1430
  ///\code
1376 1431
  /// typedef Graph::NodeMap<int> ComponentMap;
1377 1432
  /// ComponentMap comp(graph);
1378 1433
  /// typedef FillBoolMap<Graph::NodeMap<int> > ComponentFillerMap;
1379 1434
  /// ComponentFillerMap filler(comp, 0);
1380 1435
  ///
1381 1436
  /// Dfs<Graph>::DefProcessedMap<ComponentFillerMap>::Create dfs(graph);
1382 1437
  /// dfs.processedMap(filler);
1383 1438
  /// dfs.init();
... ...
@@ -1409,41 +1464,41 @@
1409 1464
    } 
1410 1465

	
1411 1466
    /// Gives back the current fill value
1412 1467
    typename Map::Value& fillValue() {
1413 1468
      return fill;
1414 1469
    } 
1415 1470

	
1416 1471
    /// Sets the current fill value
1417 1472
    void fillValue(const typename Map::Value& _fill) {
1418 1473
      fill = _fill;
1419 1474
    } 
1420 1475

	
1421
    /// Set function of the map
1476
    /// The \c set function of the map
1422 1477
    void set(const Key& key, Value value) {
1423 1478
      if (value) {
1424 1479
	map.set(key, fill);
1425 1480
      }
1426 1481
    }
1427 1482
    
1428 1483
  private:
1429 1484
    Map& map;
1430 1485
    typename Map::Value fill;
1431 1486
  };
1432 1487

	
1433 1488

	
1434
  /// \brief Writable bool map which stores the sequence number of 
1435
  /// true assignments.  
1489
  /// \brief Writable bool map for storing the sequence number of 
1490
  /// \c true assignments.  
1436 1491
  /// 
1437
  /// Writable bool map which stores for each true assigned elements  
1492
  /// Writable bool map that stores for each \c true assigned elements  
1438 1493
  /// the sequence number of this setting.
1439 1494
  /// It makes it easy to calculate the leaving
1440 1495
  /// order of the nodes in the \c Dfs algorithm.
1441 1496
  ///
1442 1497
  ///\code
1443 1498
  /// typedef Digraph::NodeMap<int> OrderMap;
1444 1499
  /// OrderMap order(digraph);
1445 1500
  /// typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
1446 1501
  /// OrderSetterMap setter(order);
1447 1502
  /// Dfs<Digraph>::DefProcessedMap<OrderSetterMap>::Create dfs(digraph);
1448 1503
  /// dfs.processedMap(setter);
1449 1504
  /// dfs.init();
0 comments (0 inline)