gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Improvements for graph maps (#302) - Add a count() function to CrossRefMap. - Add tests for IdMap and RangeIdMap. - Extend tests for CrossRefMap. - Improve the doc.
0 2 0
default
2 files changed with 123 insertions and 5 deletions:
↑ Collapse diff ↑
Ignore white space 3072 line context
... ...
@@ -293,2514 +293,2522 @@
293 293
    }
294 294

	
295 295
  private:
296 296

	
297 297
    RangeMap& operator=(const RangeMap&);
298 298

	
299 299
  public:
300 300

	
301 301
    ///\e
302 302
    Reference operator[](const Key &k) {
303 303
      return _vector[k];
304 304
    }
305 305

	
306 306
    ///\e
307 307
    ConstReference operator[](const Key &k) const {
308 308
      return _vector[k];
309 309
    }
310 310

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

	
317 317
  /// Returns a \c RangeMap class
318 318

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

	
326 326
  /// \brief Returns a \c RangeMap class created from an appropriate
327 327
  /// \c std::vector
328 328

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

	
337 337

	
338 338
  /// Map type based on \c std::map
339 339

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

	
365 365
    /// Key type
366 366
    typedef K Key;
367 367
    /// Value type
368 368
    typedef V Value;
369 369
    /// Reference type
370 370
    typedef Value& Reference;
371 371
    /// Const reference type
372 372
    typedef const Value& ConstReference;
373 373

	
374 374
    typedef True ReferenceMapTag;
375 375

	
376 376
  private:
377 377

	
378 378
    typedef std::map<K, V, Comp> Map;
379 379
    Map _map;
380 380
    Value _value;
381 381

	
382 382
  public:
383 383

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

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

	
398 398
  private:
399 399

	
400 400
    SparseMap& operator=(const SparseMap&);
401 401

	
402 402
  public:
403 403

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

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

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

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

	
438 438
  /// Returns a \c SparseMap class
439 439

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

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

	
453 453
  /// \brief Returns a \c SparseMap class created from an appropriate
454 454
  /// \c std::map
455 455

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

	
466 466
  /// @}
467 467

	
468 468
  /// \addtogroup map_adaptors
469 469
  /// @{
470 470

	
471 471
  /// Composition of two maps
472 472

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

	
499 499
    /// Constructor
500 500
    ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
501 501

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

	
507 507
  /// Returns a \c ComposeMap class
508 508

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

	
521 521

	
522 522
  /// Combination of two maps using an STL (binary) functor.
523 523

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

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

	
563 563
  /// Returns a \c CombineMap class
564 564

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

	
587 587
  template<typename M1, typename M2, typename F>
588 588
  inline CombineMap<M1, M2, F, typename F::result_type>
589 589
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
590 590
    return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
591 591
  }
592 592

	
593 593
  template<typename M1, typename M2, typename K1, typename K2, typename V>
594 594
  inline CombineMap<M1, M2, V (*)(K1, K2), V>
595 595
  combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
596 596
    return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
597 597
  }
598 598

	
599 599

	
600 600
  /// Converts an STL style (unary) functor to a map
601 601

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

	
627 627
    /// Constructor
628 628
    FunctorToMap(const F &f = F()) : _f(f) {}
629 629
    ///\e
630 630
    Value operator[](const Key &k) const { return _f(k); }
631 631
  };
632 632

	
633 633
  /// Returns a \c FunctorToMap class
634 634

	
635 635
  /// This function just returns a \c FunctorToMap class.
636 636
  ///
637 637
  /// This function is specialized for adaptable binary function
638 638
  /// classes and C++ functions.
639 639
  ///
640 640
  /// \relates FunctorToMap
641 641
  template<typename K, typename V, typename F>
642 642
  inline FunctorToMap<F, K, V> functorToMap(const F &f) {
643 643
    return FunctorToMap<F, K, V>(f);
644 644
  }
645 645

	
646 646
  template <typename F>
647 647
  inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
648 648
    functorToMap(const F &f)
649 649
  {
650 650
    return FunctorToMap<F, typename F::argument_type,
651 651
      typename F::result_type>(f);
652 652
  }
653 653

	
654 654
  template <typename K, typename V>
655 655
  inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
656 656
    return FunctorToMap<V (*)(K), K, V>(f);
657 657
  }
658 658

	
659 659

	
660 660
  /// Converts a map to an STL style (unary) functor
661 661

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

	
682 682
    typedef typename M::Key argument_type;
683 683
    typedef typename M::Value result_type;
684 684

	
685 685
    /// Constructor
686 686
    MapToFunctor(const M &m) : _m(m) {}
687 687
    ///\e
688 688
    Value operator()(const Key &k) const { return _m[k]; }
689 689
    ///\e
690 690
    Value operator[](const Key &k) const { return _m[k]; }
691 691
  };
692 692

	
693 693
  /// Returns a \c MapToFunctor class
694 694

	
695 695
  /// This function just returns a \c MapToFunctor class.
696 696
  /// \relates MapToFunctor
697 697
  template<typename M>
698 698
  inline MapToFunctor<M> mapToFunctor(const M &m) {
699 699
    return MapToFunctor<M>(m);
700 700
  }
701 701

	
702 702

	
703 703
  /// \brief Map adaptor to convert the \c Value type of a map to
704 704
  /// another type using the default conversion.
705 705

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

	
723 723
    /// Constructor
724 724

	
725 725
    /// Constructor.
726 726
    /// \param m The underlying map.
727 727
    ConvertMap(const M &m) : _m(m) {}
728 728

	
729 729
    ///\e
730 730
    Value operator[](const Key &k) const { return _m[k]; }
731 731
  };
732 732

	
733 733
  /// Returns a \c ConvertMap class
734 734

	
735 735
  /// This function just returns a \c ConvertMap class.
736 736
  /// \relates ConvertMap
737 737
  template<typename V, typename M>
738 738
  inline ConvertMap<M, V> convertMap(const M &map) {
739 739
    return ConvertMap<M, V>(map);
740 740
  }
741 741

	
742 742

	
743 743
  /// Applies all map setting operations to two maps
744 744

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

	
766 766
    /// Constructor
767 767
    ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
768 768
    /// Returns the value associated with the given key in the first map.
769 769
    Value operator[](const Key &k) const { return _m1[k]; }
770 770
    /// Sets the value associated with the given key in both maps.
771 771
    void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
772 772
  };
773 773

	
774 774
  /// Returns a \c ForkMap class
775 775

	
776 776
  /// This function just returns a \c ForkMap class.
777 777
  /// \relates ForkMap
778 778
  template <typename M1, typename M2>
779 779
  inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
780 780
    return ForkMap<M1,M2>(m1,m2);
781 781
  }
782 782

	
783 783

	
784 784
  /// Sum of two maps
785 785

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

	
813 813
    /// Constructor
814 814
    AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
815 815
    ///\e
816 816
    Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
817 817
  };
818 818

	
819 819
  /// Returns an \c AddMap class
820 820

	
821 821
  /// This function just returns an \c AddMap class.
822 822
  ///
823 823
  /// For example, if \c m1 and \c m2 are both maps with \c double
824 824
  /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
825 825
  /// <tt>m1[x]+m2[x]</tt>.
826 826
  ///
827 827
  /// \relates AddMap
828 828
  template<typename M1, typename M2>
829 829
  inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
830 830
    return AddMap<M1, M2>(m1,m2);
831 831
  }
832 832

	
833 833

	
834 834
  /// Difference of two maps
835 835

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

	
862 862
    /// Constructor
863 863
    SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
864 864
    ///\e
865 865
    Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
866 866
  };
867 867

	
868 868
  /// Returns a \c SubMap class
869 869

	
870 870
  /// This function just returns a \c SubMap class.
871 871
  ///
872 872
  /// For example, if \c m1 and \c m2 are both maps with \c double
873 873
  /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
874 874
  /// <tt>m1[x]-m2[x]</tt>.
875 875
  ///
876 876
  /// \relates SubMap
877 877
  template<typename M1, typename M2>
878 878
  inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
879 879
    return SubMap<M1, M2>(m1,m2);
880 880
  }
881 881

	
882 882

	
883 883
  /// Product of two maps
884 884

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

	
912 912
    /// Constructor
913 913
    MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
914 914
    ///\e
915 915
    Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
916 916
  };
917 917

	
918 918
  /// Returns a \c MulMap class
919 919

	
920 920
  /// This function just returns a \c MulMap class.
921 921
  ///
922 922
  /// For example, if \c m1 and \c m2 are both maps with \c double
923 923
  /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
924 924
  /// <tt>m1[x]*m2[x]</tt>.
925 925
  ///
926 926
  /// \relates MulMap
927 927
  template<typename M1, typename M2>
928 928
  inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
929 929
    return MulMap<M1, M2>(m1,m2);
930 930
  }
931 931

	
932 932

	
933 933
  /// Quotient of two maps
934 934

	
935 935
  /// This \ref concepts::ReadMap "read-only map" returns the quotient
936 936
  /// of the values of the two given maps.
937 937
  /// Its \c Key and \c Value types are inherited from \c M1.
938 938
  /// The \c Key and \c Value of \c M2 must be convertible to those of
939 939
  /// \c M1.
940 940
  ///
941 941
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
942 942
  /// \code
943 943
  ///   DivMap<M1,M2> dm(m1,m2);
944 944
  /// \endcode
945 945
  /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
946 946
  ///
947 947
  /// The simplest way of using this map is through the divMap()
948 948
  /// function.
949 949
  ///
950 950
  /// \sa AddMap, SubMap, MulMap
951 951
  template<typename M1, typename M2>
952 952
  class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
953 953
    const M1 &_m1;
954 954
    const M2 &_m2;
955 955
  public:
956 956
    ///\e
957 957
    typedef typename M1::Key Key;
958 958
    ///\e
959 959
    typedef typename M1::Value Value;
960 960

	
961 961
    /// Constructor
962 962
    DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
963 963
    ///\e
964 964
    Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
965 965
  };
966 966

	
967 967
  /// Returns a \c DivMap class
968 968

	
969 969
  /// This function just returns a \c DivMap class.
970 970
  ///
971 971
  /// For example, if \c m1 and \c m2 are both maps with \c double
972 972
  /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
973 973
  /// <tt>m1[x]/m2[x]</tt>.
974 974
  ///
975 975
  /// \relates DivMap
976 976
  template<typename M1, typename M2>
977 977
  inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
978 978
    return DivMap<M1, M2>(m1,m2);
979 979
  }
980 980

	
981 981

	
982 982
  /// Shifts a map with a constant.
983 983

	
984 984
  /// This \ref concepts::ReadMap "read-only map" returns the sum of
985 985
  /// the given map and a constant value (i.e. it shifts the map with
986 986
  /// the constant). Its \c Key and \c Value are inherited from \c M.
987 987
  ///
988 988
  /// Actually,
989 989
  /// \code
990 990
  ///   ShiftMap<M> sh(m,v);
991 991
  /// \endcode
992 992
  /// is equivalent to
993 993
  /// \code
994 994
  ///   ConstMap<M::Key, M::Value> cm(v);
995 995
  ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
996 996
  /// \endcode
997 997
  ///
998 998
  /// The simplest way of using this map is through the shiftMap()
999 999
  /// function.
1000 1000
  ///
1001 1001
  /// \sa ShiftWriteMap
1002 1002
  template<typename M, typename C = typename M::Value>
1003 1003
  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
1004 1004
    const M &_m;
1005 1005
    C _v;
1006 1006
  public:
1007 1007
    ///\e
1008 1008
    typedef typename M::Key Key;
1009 1009
    ///\e
1010 1010
    typedef typename M::Value Value;
1011 1011

	
1012 1012
    /// Constructor
1013 1013

	
1014 1014
    /// Constructor.
1015 1015
    /// \param m The undelying map.
1016 1016
    /// \param v The constant value.
1017 1017
    ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
1018 1018
    ///\e
1019 1019
    Value operator[](const Key &k) const { return _m[k]+_v; }
1020 1020
  };
1021 1021

	
1022 1022
  /// Shifts a map with a constant (read-write version).
1023 1023

	
1024 1024
  /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
1025 1025
  /// of the given map and a constant value (i.e. it shifts the map with
1026 1026
  /// the constant). Its \c Key and \c Value are inherited from \c M.
1027 1027
  /// It makes also possible to write the map.
1028 1028
  ///
1029 1029
  /// The simplest way of using this map is through the shiftWriteMap()
1030 1030
  /// function.
1031 1031
  ///
1032 1032
  /// \sa ShiftMap
1033 1033
  template<typename M, typename C = typename M::Value>
1034 1034
  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
1035 1035
    M &_m;
1036 1036
    C _v;
1037 1037
  public:
1038 1038
    ///\e
1039 1039
    typedef typename M::Key Key;
1040 1040
    ///\e
1041 1041
    typedef typename M::Value Value;
1042 1042

	
1043 1043
    /// Constructor
1044 1044

	
1045 1045
    /// Constructor.
1046 1046
    /// \param m The undelying map.
1047 1047
    /// \param v The constant value.
1048 1048
    ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1049 1049
    ///\e
1050 1050
    Value operator[](const Key &k) const { return _m[k]+_v; }
1051 1051
    ///\e
1052 1052
    void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
1053 1053
  };
1054 1054

	
1055 1055
  /// Returns a \c ShiftMap class
1056 1056

	
1057 1057
  /// This function just returns a \c ShiftMap 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>shiftMap(m,v)[x]</tt> will be equal to
1061 1061
  /// <tt>m[x]+v</tt>.
1062 1062
  ///
1063 1063
  /// \relates ShiftMap
1064 1064
  template<typename M, typename C>
1065 1065
  inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
1066 1066
    return ShiftMap<M, C>(m,v);
1067 1067
  }
1068 1068

	
1069 1069
  /// Returns a \c ShiftWriteMap class
1070 1070

	
1071 1071
  /// This function just returns a \c ShiftWriteMap class.
1072 1072
  ///
1073 1073
  /// For example, if \c m is a map with \c double values and \c v is
1074 1074
  /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
1075 1075
  /// <tt>m[x]+v</tt>.
1076 1076
  /// Moreover it makes also possible to write the map.
1077 1077
  ///
1078 1078
  /// \relates ShiftWriteMap
1079 1079
  template<typename M, typename C>
1080 1080
  inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
1081 1081
    return ShiftWriteMap<M, C>(m,v);
1082 1082
  }
1083 1083

	
1084 1084

	
1085 1085
  /// Scales a map with a constant.
1086 1086

	
1087 1087
  /// This \ref concepts::ReadMap "read-only map" returns the value of
1088 1088
  /// the given map multiplied from the left side with a constant value.
1089 1089
  /// Its \c Key and \c Value are inherited from \c M.
1090 1090
  ///
1091 1091
  /// Actually,
1092 1092
  /// \code
1093 1093
  ///   ScaleMap<M> sc(m,v);
1094 1094
  /// \endcode
1095 1095
  /// is equivalent to
1096 1096
  /// \code
1097 1097
  ///   ConstMap<M::Key, M::Value> cm(v);
1098 1098
  ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
1099 1099
  /// \endcode
1100 1100
  ///
1101 1101
  /// The simplest way of using this map is through the scaleMap()
1102 1102
  /// function.
1103 1103
  ///
1104 1104
  /// \sa ScaleWriteMap
1105 1105
  template<typename M, typename C = typename M::Value>
1106 1106
  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
1107 1107
    const M &_m;
1108 1108
    C _v;
1109 1109
  public:
1110 1110
    ///\e
1111 1111
    typedef typename M::Key Key;
1112 1112
    ///\e
1113 1113
    typedef typename M::Value Value;
1114 1114

	
1115 1115
    /// Constructor
1116 1116

	
1117 1117
    /// Constructor.
1118 1118
    /// \param m The undelying map.
1119 1119
    /// \param v The constant value.
1120 1120
    ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
1121 1121
    ///\e
1122 1122
    Value operator[](const Key &k) const { return _v*_m[k]; }
1123 1123
  };
1124 1124

	
1125 1125
  /// Scales a map with a constant (read-write version).
1126 1126

	
1127 1127
  /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
1128 1128
  /// the given map multiplied from the left side with a constant value.
1129 1129
  /// Its \c Key and \c Value are inherited from \c M.
1130 1130
  /// It can also be used as write map if the \c / operator is defined
1131 1131
  /// between \c Value and \c C and the given multiplier is not zero.
1132 1132
  ///
1133 1133
  /// The simplest way of using this map is through the scaleWriteMap()
1134 1134
  /// function.
1135 1135
  ///
1136 1136
  /// \sa ScaleMap
1137 1137
  template<typename M, typename C = typename M::Value>
1138 1138
  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
1139 1139
    M &_m;
1140 1140
    C _v;
1141 1141
  public:
1142 1142
    ///\e
1143 1143
    typedef typename M::Key Key;
1144 1144
    ///\e
1145 1145
    typedef typename M::Value Value;
1146 1146

	
1147 1147
    /// Constructor
1148 1148

	
1149 1149
    /// Constructor.
1150 1150
    /// \param m The undelying map.
1151 1151
    /// \param v The constant value.
1152 1152
    ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1153 1153
    ///\e
1154 1154
    Value operator[](const Key &k) const { return _v*_m[k]; }
1155 1155
    ///\e
1156 1156
    void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
1157 1157
  };
1158 1158

	
1159 1159
  /// Returns a \c ScaleMap class
1160 1160

	
1161 1161
  /// This function just returns a \c ScaleMap class.
1162 1162
  ///
1163 1163
  /// For example, if \c m is a map with \c double values and \c v is
1164 1164
  /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
1165 1165
  /// <tt>v*m[x]</tt>.
1166 1166
  ///
1167 1167
  /// \relates ScaleMap
1168 1168
  template<typename M, typename C>
1169 1169
  inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
1170 1170
    return ScaleMap<M, C>(m,v);
1171 1171
  }
1172 1172

	
1173 1173
  /// Returns a \c ScaleWriteMap class
1174 1174

	
1175 1175
  /// This function just returns a \c ScaleWriteMap class.
1176 1176
  ///
1177 1177
  /// For example, if \c m is a map with \c double values and \c v is
1178 1178
  /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
1179 1179
  /// <tt>v*m[x]</tt>.
1180 1180
  /// Moreover it makes also possible to write the map.
1181 1181
  ///
1182 1182
  /// \relates ScaleWriteMap
1183 1183
  template<typename M, typename C>
1184 1184
  inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
1185 1185
    return ScaleWriteMap<M, C>(m,v);
1186 1186
  }
1187 1187

	
1188 1188

	
1189 1189
  /// Negative of a map
1190 1190

	
1191 1191
  /// This \ref concepts::ReadMap "read-only map" returns the negative
1192 1192
  /// of the values of the given map (using the unary \c - operator).
1193 1193
  /// Its \c Key and \c Value are inherited from \c M.
1194 1194
  ///
1195 1195
  /// If M::Value is \c int, \c double etc., then
1196 1196
  /// \code
1197 1197
  ///   NegMap<M> neg(m);
1198 1198
  /// \endcode
1199 1199
  /// is equivalent to
1200 1200
  /// \code
1201 1201
  ///   ScaleMap<M> neg(m,-1);
1202 1202
  /// \endcode
1203 1203
  ///
1204 1204
  /// The simplest way of using this map is through the negMap()
1205 1205
  /// function.
1206 1206
  ///
1207 1207
  /// \sa NegWriteMap
1208 1208
  template<typename M>
1209 1209
  class NegMap : public MapBase<typename M::Key, typename M::Value> {
1210 1210
    const M& _m;
1211 1211
  public:
1212 1212
    ///\e
1213 1213
    typedef typename M::Key Key;
1214 1214
    ///\e
1215 1215
    typedef typename M::Value Value;
1216 1216

	
1217 1217
    /// Constructor
1218 1218
    NegMap(const M &m) : _m(m) {}
1219 1219
    ///\e
1220 1220
    Value operator[](const Key &k) const { return -_m[k]; }
1221 1221
  };
1222 1222

	
1223 1223
  /// Negative of a map (read-write version)
1224 1224

	
1225 1225
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1226 1226
  /// negative of the values of the given map (using the unary \c -
1227 1227
  /// operator).
1228 1228
  /// Its \c Key and \c Value are inherited from \c M.
1229 1229
  /// It makes also possible to write the map.
1230 1230
  ///
1231 1231
  /// If M::Value is \c int, \c double etc., then
1232 1232
  /// \code
1233 1233
  ///   NegWriteMap<M> neg(m);
1234 1234
  /// \endcode
1235 1235
  /// is equivalent to
1236 1236
  /// \code
1237 1237
  ///   ScaleWriteMap<M> neg(m,-1);
1238 1238
  /// \endcode
1239 1239
  ///
1240 1240
  /// The simplest way of using this map is through the negWriteMap()
1241 1241
  /// function.
1242 1242
  ///
1243 1243
  /// \sa NegMap
1244 1244
  template<typename M>
1245 1245
  class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
1246 1246
    M &_m;
1247 1247
  public:
1248 1248
    ///\e
1249 1249
    typedef typename M::Key Key;
1250 1250
    ///\e
1251 1251
    typedef typename M::Value Value;
1252 1252

	
1253 1253
    /// Constructor
1254 1254
    NegWriteMap(M &m) : _m(m) {}
1255 1255
    ///\e
1256 1256
    Value operator[](const Key &k) const { return -_m[k]; }
1257 1257
    ///\e
1258 1258
    void set(const Key &k, const Value &v) { _m.set(k, -v); }
1259 1259
  };
1260 1260

	
1261 1261
  /// Returns a \c NegMap class
1262 1262

	
1263 1263
  /// This function just returns a \c NegMap class.
1264 1264
  ///
1265 1265
  /// For example, if \c m is a map with \c double values, then
1266 1266
  /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1267 1267
  ///
1268 1268
  /// \relates NegMap
1269 1269
  template <typename M>
1270 1270
  inline NegMap<M> negMap(const M &m) {
1271 1271
    return NegMap<M>(m);
1272 1272
  }
1273 1273

	
1274 1274
  /// Returns a \c NegWriteMap class
1275 1275

	
1276 1276
  /// This function just returns a \c NegWriteMap class.
1277 1277
  ///
1278 1278
  /// For example, if \c m is a map with \c double values, then
1279 1279
  /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1280 1280
  /// Moreover it makes also possible to write the map.
1281 1281
  ///
1282 1282
  /// \relates NegWriteMap
1283 1283
  template <typename M>
1284 1284
  inline NegWriteMap<M> negWriteMap(M &m) {
1285 1285
    return NegWriteMap<M>(m);
1286 1286
  }
1287 1287

	
1288 1288

	
1289 1289
  /// Absolute value of a map
1290 1290

	
1291 1291
  /// This \ref concepts::ReadMap "read-only map" returns the absolute
1292 1292
  /// value of the values of the given map.
1293 1293
  /// Its \c Key and \c Value are inherited from \c M.
1294 1294
  /// \c Value must be comparable to \c 0 and the unary \c -
1295 1295
  /// operator must be defined for it, of course.
1296 1296
  ///
1297 1297
  /// The simplest way of using this map is through the absMap()
1298 1298
  /// function.
1299 1299
  template<typename M>
1300 1300
  class AbsMap : public MapBase<typename M::Key, typename M::Value> {
1301 1301
    const M &_m;
1302 1302
  public:
1303 1303
    ///\e
1304 1304
    typedef typename M::Key Key;
1305 1305
    ///\e
1306 1306
    typedef typename M::Value Value;
1307 1307

	
1308 1308
    /// Constructor
1309 1309
    AbsMap(const M &m) : _m(m) {}
1310 1310
    ///\e
1311 1311
    Value operator[](const Key &k) const {
1312 1312
      Value tmp = _m[k];
1313 1313
      return tmp >= 0 ? tmp : -tmp;
1314 1314
    }
1315 1315

	
1316 1316
  };
1317 1317

	
1318 1318
  /// Returns an \c AbsMap class
1319 1319

	
1320 1320
  /// This function just returns an \c AbsMap class.
1321 1321
  ///
1322 1322
  /// For example, if \c m is a map with \c double values, then
1323 1323
  /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
1324 1324
  /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
1325 1325
  /// negative.
1326 1326
  ///
1327 1327
  /// \relates AbsMap
1328 1328
  template<typename M>
1329 1329
  inline AbsMap<M> absMap(const M &m) {
1330 1330
    return AbsMap<M>(m);
1331 1331
  }
1332 1332

	
1333 1333
  /// @}
1334 1334

	
1335 1335
  // Logical maps and map adaptors:
1336 1336

	
1337 1337
  /// \addtogroup maps
1338 1338
  /// @{
1339 1339

	
1340 1340
  /// Constant \c true map.
1341 1341

	
1342 1342
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1343 1343
  /// each key.
1344 1344
  ///
1345 1345
  /// Note that
1346 1346
  /// \code
1347 1347
  ///   TrueMap<K> tm;
1348 1348
  /// \endcode
1349 1349
  /// is equivalent to
1350 1350
  /// \code
1351 1351
  ///   ConstMap<K,bool> tm(true);
1352 1352
  /// \endcode
1353 1353
  ///
1354 1354
  /// \sa FalseMap
1355 1355
  /// \sa ConstMap
1356 1356
  template <typename K>
1357 1357
  class TrueMap : public MapBase<K, bool> {
1358 1358
  public:
1359 1359
    ///\e
1360 1360
    typedef K Key;
1361 1361
    ///\e
1362 1362
    typedef bool Value;
1363 1363

	
1364 1364
    /// Gives back \c true.
1365 1365
    Value operator[](const Key&) const { return true; }
1366 1366
  };
1367 1367

	
1368 1368
  /// Returns a \c TrueMap class
1369 1369

	
1370 1370
  /// This function just returns a \c TrueMap class.
1371 1371
  /// \relates TrueMap
1372 1372
  template<typename K>
1373 1373
  inline TrueMap<K> trueMap() {
1374 1374
    return TrueMap<K>();
1375 1375
  }
1376 1376

	
1377 1377

	
1378 1378
  /// Constant \c false map.
1379 1379

	
1380 1380
  /// This \ref concepts::ReadMap "read-only map" assigns \c false to
1381 1381
  /// each key.
1382 1382
  ///
1383 1383
  /// Note that
1384 1384
  /// \code
1385 1385
  ///   FalseMap<K> fm;
1386 1386
  /// \endcode
1387 1387
  /// is equivalent to
1388 1388
  /// \code
1389 1389
  ///   ConstMap<K,bool> fm(false);
1390 1390
  /// \endcode
1391 1391
  ///
1392 1392
  /// \sa TrueMap
1393 1393
  /// \sa ConstMap
1394 1394
  template <typename K>
1395 1395
  class FalseMap : public MapBase<K, bool> {
1396 1396
  public:
1397 1397
    ///\e
1398 1398
    typedef K Key;
1399 1399
    ///\e
1400 1400
    typedef bool Value;
1401 1401

	
1402 1402
    /// Gives back \c false.
1403 1403
    Value operator[](const Key&) const { return false; }
1404 1404
  };
1405 1405

	
1406 1406
  /// Returns a \c FalseMap class
1407 1407

	
1408 1408
  /// This function just returns a \c FalseMap class.
1409 1409
  /// \relates FalseMap
1410 1410
  template<typename K>
1411 1411
  inline FalseMap<K> falseMap() {
1412 1412
    return FalseMap<K>();
1413 1413
  }
1414 1414

	
1415 1415
  /// @}
1416 1416

	
1417 1417
  /// \addtogroup map_adaptors
1418 1418
  /// @{
1419 1419

	
1420 1420
  /// Logical 'and' of two maps
1421 1421

	
1422 1422
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1423 1423
  /// 'and' of the values of the two given maps.
1424 1424
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1425 1425
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1426 1426
  ///
1427 1427
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1428 1428
  /// \code
1429 1429
  ///   AndMap<M1,M2> am(m1,m2);
1430 1430
  /// \endcode
1431 1431
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
1432 1432
  ///
1433 1433
  /// The simplest way of using this map is through the andMap()
1434 1434
  /// function.
1435 1435
  ///
1436 1436
  /// \sa OrMap
1437 1437
  /// \sa NotMap, NotWriteMap
1438 1438
  template<typename M1, typename M2>
1439 1439
  class AndMap : public MapBase<typename M1::Key, bool> {
1440 1440
    const M1 &_m1;
1441 1441
    const M2 &_m2;
1442 1442
  public:
1443 1443
    ///\e
1444 1444
    typedef typename M1::Key Key;
1445 1445
    ///\e
1446 1446
    typedef bool Value;
1447 1447

	
1448 1448
    /// Constructor
1449 1449
    AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1450 1450
    ///\e
1451 1451
    Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
1452 1452
  };
1453 1453

	
1454 1454
  /// Returns an \c AndMap class
1455 1455

	
1456 1456
  /// This function just returns an \c AndMap class.
1457 1457
  ///
1458 1458
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1459 1459
  /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
1460 1460
  /// <tt>m1[x]&&m2[x]</tt>.
1461 1461
  ///
1462 1462
  /// \relates AndMap
1463 1463
  template<typename M1, typename M2>
1464 1464
  inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
1465 1465
    return AndMap<M1, M2>(m1,m2);
1466 1466
  }
1467 1467

	
1468 1468

	
1469 1469
  /// Logical 'or' of two maps
1470 1470

	
1471 1471
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1472 1472
  /// 'or' of the values of the two given maps.
1473 1473
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1474 1474
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1475 1475
  ///
1476 1476
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1477 1477
  /// \code
1478 1478
  ///   OrMap<M1,M2> om(m1,m2);
1479 1479
  /// \endcode
1480 1480
  /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
1481 1481
  ///
1482 1482
  /// The simplest way of using this map is through the orMap()
1483 1483
  /// function.
1484 1484
  ///
1485 1485
  /// \sa AndMap
1486 1486
  /// \sa NotMap, NotWriteMap
1487 1487
  template<typename M1, typename M2>
1488 1488
  class OrMap : public MapBase<typename M1::Key, bool> {
1489 1489
    const M1 &_m1;
1490 1490
    const M2 &_m2;
1491 1491
  public:
1492 1492
    ///\e
1493 1493
    typedef typename M1::Key Key;
1494 1494
    ///\e
1495 1495
    typedef bool Value;
1496 1496

	
1497 1497
    /// Constructor
1498 1498
    OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1499 1499
    ///\e
1500 1500
    Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
1501 1501
  };
1502 1502

	
1503 1503
  /// Returns an \c OrMap class
1504 1504

	
1505 1505
  /// This function just returns an \c OrMap class.
1506 1506
  ///
1507 1507
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1508 1508
  /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
1509 1509
  /// <tt>m1[x]||m2[x]</tt>.
1510 1510
  ///
1511 1511
  /// \relates OrMap
1512 1512
  template<typename M1, typename M2>
1513 1513
  inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
1514 1514
    return OrMap<M1, M2>(m1,m2);
1515 1515
  }
1516 1516

	
1517 1517

	
1518 1518
  /// Logical 'not' of a map
1519 1519

	
1520 1520
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1521 1521
  /// negation of the values of the given map.
1522 1522
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1523 1523
  ///
1524 1524
  /// The simplest way of using this map is through the notMap()
1525 1525
  /// function.
1526 1526
  ///
1527 1527
  /// \sa NotWriteMap
1528 1528
  template <typename M>
1529 1529
  class NotMap : public MapBase<typename M::Key, bool> {
1530 1530
    const M &_m;
1531 1531
  public:
1532 1532
    ///\e
1533 1533
    typedef typename M::Key Key;
1534 1534
    ///\e
1535 1535
    typedef bool Value;
1536 1536

	
1537 1537
    /// Constructor
1538 1538
    NotMap(const M &m) : _m(m) {}
1539 1539
    ///\e
1540 1540
    Value operator[](const Key &k) const { return !_m[k]; }
1541 1541
  };
1542 1542

	
1543 1543
  /// Logical 'not' of a map (read-write version)
1544 1544

	
1545 1545
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1546 1546
  /// logical negation of the values of the given map.
1547 1547
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1548 1548
  /// It makes also possible to write the map. When a value is set,
1549 1549
  /// the opposite value is set to the original map.
1550 1550
  ///
1551 1551
  /// The simplest way of using this map is through the notWriteMap()
1552 1552
  /// function.
1553 1553
  ///
1554 1554
  /// \sa NotMap
1555 1555
  template <typename M>
1556 1556
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1557 1557
    M &_m;
1558 1558
  public:
1559 1559
    ///\e
1560 1560
    typedef typename M::Key Key;
1561 1561
    ///\e
1562 1562
    typedef bool Value;
1563 1563

	
1564 1564
    /// Constructor
1565 1565
    NotWriteMap(M &m) : _m(m) {}
1566 1566
    ///\e
1567 1567
    Value operator[](const Key &k) const { return !_m[k]; }
1568 1568
    ///\e
1569 1569
    void set(const Key &k, bool v) { _m.set(k, !v); }
1570 1570
  };
1571 1571

	
1572 1572
  /// Returns a \c NotMap class
1573 1573

	
1574 1574
  /// This function just returns a \c NotMap class.
1575 1575
  ///
1576 1576
  /// For example, if \c m is a map with \c bool values, then
1577 1577
  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1578 1578
  ///
1579 1579
  /// \relates NotMap
1580 1580
  template <typename M>
1581 1581
  inline NotMap<M> notMap(const M &m) {
1582 1582
    return NotMap<M>(m);
1583 1583
  }
1584 1584

	
1585 1585
  /// Returns a \c NotWriteMap class
1586 1586

	
1587 1587
  /// This function just returns a \c NotWriteMap class.
1588 1588
  ///
1589 1589
  /// For example, if \c m is a map with \c bool values, then
1590 1590
  /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1591 1591
  /// Moreover it makes also possible to write the map.
1592 1592
  ///
1593 1593
  /// \relates NotWriteMap
1594 1594
  template <typename M>
1595 1595
  inline NotWriteMap<M> notWriteMap(M &m) {
1596 1596
    return NotWriteMap<M>(m);
1597 1597
  }
1598 1598

	
1599 1599

	
1600 1600
  /// Combination of two maps using the \c == operator
1601 1601

	
1602 1602
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1603 1603
  /// the keys for which the corresponding values of the two maps are
1604 1604
  /// equal.
1605 1605
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1606 1606
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1607 1607
  ///
1608 1608
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1609 1609
  /// \code
1610 1610
  ///   EqualMap<M1,M2> em(m1,m2);
1611 1611
  /// \endcode
1612 1612
  /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1613 1613
  ///
1614 1614
  /// The simplest way of using this map is through the equalMap()
1615 1615
  /// function.
1616 1616
  ///
1617 1617
  /// \sa LessMap
1618 1618
  template<typename M1, typename M2>
1619 1619
  class EqualMap : public MapBase<typename M1::Key, bool> {
1620 1620
    const M1 &_m1;
1621 1621
    const M2 &_m2;
1622 1622
  public:
1623 1623
    ///\e
1624 1624
    typedef typename M1::Key Key;
1625 1625
    ///\e
1626 1626
    typedef bool Value;
1627 1627

	
1628 1628
    /// Constructor
1629 1629
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1630 1630
    ///\e
1631 1631
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1632 1632
  };
1633 1633

	
1634 1634
  /// Returns an \c EqualMap class
1635 1635

	
1636 1636
  /// This function just returns an \c EqualMap class.
1637 1637
  ///
1638 1638
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1639 1639
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1640 1640
  /// <tt>m1[x]==m2[x]</tt>.
1641 1641
  ///
1642 1642
  /// \relates EqualMap
1643 1643
  template<typename M1, typename M2>
1644 1644
  inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1645 1645
    return EqualMap<M1, M2>(m1,m2);
1646 1646
  }
1647 1647

	
1648 1648

	
1649 1649
  /// Combination of two maps using the \c < operator
1650 1650

	
1651 1651
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1652 1652
  /// the keys for which the corresponding value of the first map is
1653 1653
  /// less then the value of the second map.
1654 1654
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1655 1655
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1656 1656
  ///
1657 1657
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1658 1658
  /// \code
1659 1659
  ///   LessMap<M1,M2> lm(m1,m2);
1660 1660
  /// \endcode
1661 1661
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1662 1662
  ///
1663 1663
  /// The simplest way of using this map is through the lessMap()
1664 1664
  /// function.
1665 1665
  ///
1666 1666
  /// \sa EqualMap
1667 1667
  template<typename M1, typename M2>
1668 1668
  class LessMap : public MapBase<typename M1::Key, bool> {
1669 1669
    const M1 &_m1;
1670 1670
    const M2 &_m2;
1671 1671
  public:
1672 1672
    ///\e
1673 1673
    typedef typename M1::Key Key;
1674 1674
    ///\e
1675 1675
    typedef bool Value;
1676 1676

	
1677 1677
    /// Constructor
1678 1678
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1679 1679
    ///\e
1680 1680
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1681 1681
  };
1682 1682

	
1683 1683
  /// Returns an \c LessMap class
1684 1684

	
1685 1685
  /// This function just returns an \c LessMap class.
1686 1686
  ///
1687 1687
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1688 1688
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1689 1689
  /// <tt>m1[x]<m2[x]</tt>.
1690 1690
  ///
1691 1691
  /// \relates LessMap
1692 1692
  template<typename M1, typename M2>
1693 1693
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1694 1694
    return LessMap<M1, M2>(m1,m2);
1695 1695
  }
1696 1696

	
1697 1697
  namespace _maps_bits {
1698 1698

	
1699 1699
    template <typename _Iterator, typename Enable = void>
1700 1700
    struct IteratorTraits {
1701 1701
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1702 1702
    };
1703 1703

	
1704 1704
    template <typename _Iterator>
1705 1705
    struct IteratorTraits<_Iterator,
1706 1706
      typename exists<typename _Iterator::container_type>::type>
1707 1707
    {
1708 1708
      typedef typename _Iterator::container_type::value_type Value;
1709 1709
    };
1710 1710

	
1711 1711
  }
1712 1712

	
1713 1713
  /// @}
1714 1714

	
1715 1715
  /// \addtogroup maps
1716 1716
  /// @{
1717 1717

	
1718 1718
  /// \brief Writable bool map for logging each \c true assigned element
1719 1719
  ///
1720 1720
  /// A \ref concepts::WriteMap "writable" bool map for logging
1721 1721
  /// each \c true assigned element, i.e it copies subsequently each
1722 1722
  /// keys set to \c true to the given iterator.
1723 1723
  /// The most important usage of it is storing certain nodes or arcs
1724 1724
  /// that were marked \c true by an algorithm.
1725 1725
  ///
1726 1726
  /// There are several algorithms that provide solutions through bool
1727 1727
  /// maps and most of them assign \c true at most once for each key.
1728 1728
  /// In these cases it is a natural request to store each \c true
1729 1729
  /// assigned elements (in order of the assignment), which can be
1730 1730
  /// easily done with LoggerBoolMap.
1731 1731
  ///
1732 1732
  /// The simplest way of using this map is through the loggerBoolMap()
1733 1733
  /// function.
1734 1734
  ///
1735 1735
  /// \tparam IT The type of the iterator.
1736 1736
  /// \tparam KEY The key type of the map. The default value set
1737 1737
  /// according to the iterator type should work in most cases.
1738 1738
  ///
1739 1739
  /// \note The container of the iterator must contain enough space
1740 1740
  /// for the elements or the iterator should be an inserter iterator.
1741 1741
#ifdef DOXYGEN
1742 1742
  template <typename IT, typename KEY>
1743 1743
#else
1744 1744
  template <typename IT,
1745 1745
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1746 1746
#endif
1747 1747
  class LoggerBoolMap : public MapBase<KEY, bool> {
1748 1748
  public:
1749 1749

	
1750 1750
    ///\e
1751 1751
    typedef KEY Key;
1752 1752
    ///\e
1753 1753
    typedef bool Value;
1754 1754
    ///\e
1755 1755
    typedef IT Iterator;
1756 1756

	
1757 1757
    /// Constructor
1758 1758
    LoggerBoolMap(Iterator it)
1759 1759
      : _begin(it), _end(it) {}
1760 1760

	
1761 1761
    /// Gives back the given iterator set for the first key
1762 1762
    Iterator begin() const {
1763 1763
      return _begin;
1764 1764
    }
1765 1765

	
1766 1766
    /// Gives back the the 'after the last' iterator
1767 1767
    Iterator end() const {
1768 1768
      return _end;
1769 1769
    }
1770 1770

	
1771 1771
    /// The set function of the map
1772 1772
    void set(const Key& key, Value value) {
1773 1773
      if (value) {
1774 1774
        *_end++ = key;
1775 1775
      }
1776 1776
    }
1777 1777

	
1778 1778
  private:
1779 1779
    Iterator _begin;
1780 1780
    Iterator _end;
1781 1781
  };
1782 1782

	
1783 1783
  /// Returns a \c LoggerBoolMap class
1784 1784

	
1785 1785
  /// This function just returns a \c LoggerBoolMap class.
1786 1786
  ///
1787 1787
  /// The most important usage of it is storing certain nodes or arcs
1788 1788
  /// that were marked \c true by an algorithm.
1789 1789
  /// For example it makes easier to store the nodes in the processing
1790 1790
  /// order of Dfs algorithm, as the following examples show.
1791 1791
  /// \code
1792 1792
  ///   std::vector<Node> v;
1793 1793
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1794 1794
  /// \endcode
1795 1795
  /// \code
1796 1796
  ///   std::vector<Node> v(countNodes(g));
1797 1797
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1798 1798
  /// \endcode
1799 1799
  ///
1800 1800
  /// \note The container of the iterator must contain enough space
1801 1801
  /// for the elements or the iterator should be an inserter iterator.
1802 1802
  ///
1803 1803
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1804 1804
  /// it cannot be used when a readable map is needed, for example as
1805 1805
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1806 1806
  ///
1807 1807
  /// \relates LoggerBoolMap
1808 1808
  template<typename Iterator>
1809 1809
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1810 1810
    return LoggerBoolMap<Iterator>(it);
1811 1811
  }
1812 1812

	
1813 1813
  /// @}
1814 1814

	
1815 1815
  /// \addtogroup graph_maps
1816 1816
  /// @{
1817 1817

	
1818 1818
  /// \brief Provides an immutable and unique id for each item in a graph.
1819 1819
  ///
1820 1820
  /// IdMap provides a unique and immutable id for each item of the
1821 1821
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
1822 1822
  ///  - \b unique: different items get different ids,
1823 1823
  ///  - \b immutable: the id of an item does not change (even if you
1824 1824
  ///    delete other nodes).
1825 1825
  ///
1826 1826
  /// Using this map you get access (i.e. can read) the inner id values of
1827 1827
  /// the items stored in the graph, which is returned by the \c id()
1828 1828
  /// function of the graph. This map can be inverted with its member
1829
  /// class \c InverseMap or with the \c operator() member.
1829
  /// class \c InverseMap or with the \c operator()() member.
1830 1830
  ///
1831 1831
  /// \tparam GR The graph type.
1832 1832
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1833 1833
  /// \c GR::Edge).
1834 1834
  ///
1835 1835
  /// \see RangeIdMap
1836 1836
  template <typename GR, typename K>
1837 1837
  class IdMap : public MapBase<K, int> {
1838 1838
  public:
1839 1839
    /// The graph type of IdMap.
1840 1840
    typedef GR Graph;
1841 1841
    typedef GR Digraph;
1842 1842
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1843 1843
    typedef K Item;
1844 1844
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1845 1845
    typedef K Key;
1846 1846
    /// The value type of IdMap.
1847 1847
    typedef int Value;
1848 1848

	
1849 1849
    /// \brief Constructor.
1850 1850
    ///
1851 1851
    /// Constructor of the map.
1852 1852
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1853 1853

	
1854 1854
    /// \brief Gives back the \e id of the item.
1855 1855
    ///
1856 1856
    /// Gives back the immutable and unique \e id of the item.
1857 1857
    int operator[](const Item& item) const { return _graph->id(item);}
1858 1858

	
1859 1859
    /// \brief Gives back the \e item by its id.
1860 1860
    ///
1861 1861
    /// Gives back the \e item by its id.
1862 1862
    Item operator()(int id) { return _graph->fromId(id, Item()); }
1863 1863

	
1864 1864
  private:
1865 1865
    const Graph* _graph;
1866 1866

	
1867 1867
  public:
1868 1868

	
1869 1869
    /// \brief This class represents the inverse of its owner (IdMap).
1870 1870
    ///
1871 1871
    /// This class represents the inverse of its owner (IdMap).
1872 1872
    /// \see inverse()
1873 1873
    class InverseMap {
1874 1874
    public:
1875 1875

	
1876 1876
      /// \brief Constructor.
1877 1877
      ///
1878 1878
      /// Constructor for creating an id-to-item map.
1879 1879
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1880 1880

	
1881 1881
      /// \brief Constructor.
1882 1882
      ///
1883 1883
      /// Constructor for creating an id-to-item map.
1884 1884
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1885 1885

	
1886 1886
      /// \brief Gives back the given item from its id.
1887 1887
      ///
1888 1888
      /// Gives back the given item from its id.
1889 1889
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1890 1890

	
1891 1891
    private:
1892 1892
      const Graph* _graph;
1893 1893
    };
1894 1894

	
1895 1895
    /// \brief Gives back the inverse of the map.
1896 1896
    ///
1897 1897
    /// Gives back the inverse of the IdMap.
1898 1898
    InverseMap inverse() const { return InverseMap(*_graph);}
1899 1899
  };
1900 1900

	
1901 1901

	
1902 1902
  /// \brief General cross reference graph map type.
1903 1903

	
1904 1904
  /// This class provides simple invertable graph maps.
1905 1905
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1906 1906
  /// and if a key is set to a new value, then stores it in the inverse map.
1907 1907
  /// The values of the map can be accessed
1908 1908
  /// with stl compatible forward iterator.
1909 1909
  ///
1910 1910
  /// This type is not reference map, so it cannot be modified with
1911 1911
  /// the subscript operator.
1912 1912
  ///
1913 1913
  /// \tparam GR The graph type.
1914 1914
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1915 1915
  /// \c GR::Edge).
1916 1916
  /// \tparam V The value type of the map.
1917 1917
  ///
1918 1918
  /// \see IterableValueMap
1919 1919
  template <typename GR, typename K, typename V>
1920 1920
  class CrossRefMap
1921 1921
    : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1922 1922
  private:
1923 1923

	
1924 1924
    typedef typename ItemSetTraits<GR, K>::
1925 1925
      template Map<V>::Type Map;
1926 1926

	
1927 1927
    typedef std::multimap<V, K> Container;
1928 1928
    Container _inv_map;
1929 1929

	
1930 1930
  public:
1931 1931

	
1932 1932
    /// The graph type of CrossRefMap.
1933 1933
    typedef GR Graph;
1934 1934
    typedef GR Digraph;
1935 1935
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1936 1936
    typedef K Item;
1937 1937
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1938 1938
    typedef K Key;
1939 1939
    /// The value type of CrossRefMap.
1940 1940
    typedef V Value;
1941 1941

	
1942 1942
    /// \brief Constructor.
1943 1943
    ///
1944 1944
    /// Construct a new CrossRefMap for the given graph.
1945 1945
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1946 1946

	
1947 1947
    /// \brief Forward iterator for values.
1948 1948
    ///
1949 1949
    /// This iterator is an stl compatible forward
1950 1950
    /// iterator on the values of the map. The values can
1951 1951
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1952 1952
    /// They are considered with multiplicity, so each value is
1953 1953
    /// traversed for each item it is assigned to.
1954 1954
    class ValueIterator
1955 1955
      : public std::iterator<std::forward_iterator_tag, Value> {
1956 1956
      friend class CrossRefMap;
1957 1957
    private:
1958 1958
      ValueIterator(typename Container::const_iterator _it)
1959 1959
        : it(_it) {}
1960 1960
    public:
1961 1961

	
1962 1962
      ValueIterator() {}
1963 1963

	
1964 1964
      ValueIterator& operator++() { ++it; return *this; }
1965 1965
      ValueIterator operator++(int) {
1966 1966
        ValueIterator tmp(*this);
1967 1967
        operator++();
1968 1968
        return tmp;
1969 1969
      }
1970 1970

	
1971 1971
      const Value& operator*() const { return it->first; }
1972 1972
      const Value* operator->() const { return &(it->first); }
1973 1973

	
1974 1974
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1975 1975
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1976 1976

	
1977 1977
    private:
1978 1978
      typename Container::const_iterator it;
1979 1979
    };
1980 1980

	
1981 1981
    /// \brief Returns an iterator to the first value.
1982 1982
    ///
1983 1983
    /// Returns an stl compatible iterator to the
1984 1984
    /// first value of the map. The values of the
1985 1985
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1986 1986
    /// range.
1987 1987
    ValueIterator beginValue() const {
1988 1988
      return ValueIterator(_inv_map.begin());
1989 1989
    }
1990 1990

	
1991 1991
    /// \brief Returns an iterator after the last value.
1992 1992
    ///
1993 1993
    /// Returns an stl compatible iterator after the
1994 1994
    /// last value of the map. The values of the
1995 1995
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1996 1996
    /// range.
1997 1997
    ValueIterator endValue() const {
1998 1998
      return ValueIterator(_inv_map.end());
1999 1999
    }
2000 2000

	
2001 2001
    /// \brief Sets the value associated with the given key.
2002 2002
    ///
2003 2003
    /// Sets the value associated with the given key.
2004 2004
    void set(const Key& key, const Value& val) {
2005 2005
      Value oldval = Map::operator[](key);
2006 2006
      typename Container::iterator it;
2007 2007
      for (it = _inv_map.equal_range(oldval).first;
2008 2008
           it != _inv_map.equal_range(oldval).second; ++it) {
2009 2009
        if (it->second == key) {
2010 2010
          _inv_map.erase(it);
2011 2011
          break;
2012 2012
        }
2013 2013
      }
2014 2014
      _inv_map.insert(std::make_pair(val, key));
2015 2015
      Map::set(key, val);
2016 2016
    }
2017 2017

	
2018 2018
    /// \brief Returns the value associated with the given key.
2019 2019
    ///
2020 2020
    /// Returns the value associated with the given key.
2021 2021
    typename MapTraits<Map>::ConstReturnValue
2022 2022
    operator[](const Key& key) const {
2023 2023
      return Map::operator[](key);
2024 2024
    }
2025 2025

	
2026 2026
    /// \brief Gives back an item by its value.
2027 2027
    ///
2028 2028
    /// This function gives back an item that is assigned to
2029 2029
    /// the given value or \c INVALID if no such item exists.
2030 2030
    /// If there are more items with the same associated value,
2031 2031
    /// only one of them is returned.
2032 2032
    Key operator()(const Value& val) const {
2033 2033
      typename Container::const_iterator it = _inv_map.find(val);
2034 2034
      return it != _inv_map.end() ? it->second : INVALID;
2035 2035
    }
2036
    
2037
    /// \brief Returns the number of items with the given value.
2038
    ///
2039
    /// This function returns the number of items with the given value
2040
    /// associated with it.
2041
    int count(const Value &val) const {
2042
      return _inv_map.count(val);
2043
    }
2036 2044

	
2037 2045
  protected:
2038 2046

	
2039 2047
    /// \brief Erase the key from the map and the inverse map.
2040 2048
    ///
2041 2049
    /// Erase the key from the map and the inverse map. It is called by the
2042 2050
    /// \c AlterationNotifier.
2043 2051
    virtual void erase(const Key& key) {
2044 2052
      Value val = Map::operator[](key);
2045 2053
      typename Container::iterator it;
2046 2054
      for (it = _inv_map.equal_range(val).first;
2047 2055
           it != _inv_map.equal_range(val).second; ++it) {
2048 2056
        if (it->second == key) {
2049 2057
          _inv_map.erase(it);
2050 2058
          break;
2051 2059
        }
2052 2060
      }
2053 2061
      Map::erase(key);
2054 2062
    }
2055 2063

	
2056 2064
    /// \brief Erase more keys from the map and the inverse map.
2057 2065
    ///
2058 2066
    /// Erase more keys from the map and the inverse map. It is called by the
2059 2067
    /// \c AlterationNotifier.
2060 2068
    virtual void erase(const std::vector<Key>& keys) {
2061 2069
      for (int i = 0; i < int(keys.size()); ++i) {
2062 2070
        Value val = Map::operator[](keys[i]);
2063 2071
        typename Container::iterator it;
2064 2072
        for (it = _inv_map.equal_range(val).first;
2065 2073
             it != _inv_map.equal_range(val).second; ++it) {
2066 2074
          if (it->second == keys[i]) {
2067 2075
            _inv_map.erase(it);
2068 2076
            break;
2069 2077
          }
2070 2078
        }
2071 2079
      }
2072 2080
      Map::erase(keys);
2073 2081
    }
2074 2082

	
2075 2083
    /// \brief Clear the keys from the map and the inverse map.
2076 2084
    ///
2077 2085
    /// Clear the keys from the map and the inverse map. It is called by the
2078 2086
    /// \c AlterationNotifier.
2079 2087
    virtual void clear() {
2080 2088
      _inv_map.clear();
2081 2089
      Map::clear();
2082 2090
    }
2083 2091

	
2084 2092
  public:
2085 2093

	
2086 2094
    /// \brief The inverse map type.
2087 2095
    ///
2088 2096
    /// The inverse of this map. The subscript operator of the map
2089 2097
    /// gives back the item that was last assigned to the value.
2090 2098
    class InverseMap {
2091 2099
    public:
2092 2100
      /// \brief Constructor
2093 2101
      ///
2094 2102
      /// Constructor of the InverseMap.
2095 2103
      explicit InverseMap(const CrossRefMap& inverted)
2096 2104
        : _inverted(inverted) {}
2097 2105

	
2098 2106
      /// The value type of the InverseMap.
2099 2107
      typedef typename CrossRefMap::Key Value;
2100 2108
      /// The key type of the InverseMap.
2101 2109
      typedef typename CrossRefMap::Value Key;
2102 2110

	
2103 2111
      /// \brief Subscript operator.
2104 2112
      ///
2105 2113
      /// Subscript operator. It gives back an item
2106 2114
      /// that is assigned to the given value or \c INVALID
2107 2115
      /// if no such item exists.
2108 2116
      Value operator[](const Key& key) const {
2109 2117
        return _inverted(key);
2110 2118
      }
2111 2119

	
2112 2120
    private:
2113 2121
      const CrossRefMap& _inverted;
2114 2122
    };
2115 2123

	
2116 2124
    /// \brief It gives back the read-only inverse map.
2117 2125
    ///
2118 2126
    /// It gives back the read-only inverse map.
2119 2127
    InverseMap inverse() const {
2120 2128
      return InverseMap(*this);
2121 2129
    }
2122 2130

	
2123 2131
  };
2124 2132

	
2125
  /// \brief Provides continuous and unique ID for the
2133
  /// \brief Provides continuous and unique id for the
2126 2134
  /// items of a graph.
2127 2135
  ///
2128 2136
  /// RangeIdMap provides a unique and continuous
2129
  /// ID for each item of a given type (\c Node, \c Arc or
2137
  /// id for each item of a given type (\c Node, \c Arc or
2130 2138
  /// \c Edge) in a graph. This id is
2131 2139
  ///  - \b unique: different items get different ids,
2132 2140
  ///  - \b continuous: the range of the ids is the set of integers
2133 2141
  ///    between 0 and \c n-1, where \c n is the number of the items of
2134 2142
  ///    this type (\c Node, \c Arc or \c Edge).
2135 2143
  ///  - So, the ids can change when deleting an item of the same type.
2136 2144
  ///
2137 2145
  /// Thus this id is not (necessarily) the same as what can get using
2138 2146
  /// the \c id() function of the graph or \ref IdMap.
2139 2147
  /// This map can be inverted with its member class \c InverseMap,
2140
  /// or with the \c operator() member.
2148
  /// or with the \c operator()() member.
2141 2149
  ///
2142 2150
  /// \tparam GR The graph type.
2143 2151
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2144 2152
  /// \c GR::Edge).
2145 2153
  ///
2146 2154
  /// \see IdMap
2147 2155
  template <typename GR, typename K>
2148 2156
  class RangeIdMap
2149 2157
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2150 2158

	
2151 2159
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2152 2160

	
2153 2161
  public:
2154 2162
    /// The graph type of RangeIdMap.
2155 2163
    typedef GR Graph;
2156 2164
    typedef GR Digraph;
2157 2165
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2158 2166
    typedef K Item;
2159 2167
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2160 2168
    typedef K Key;
2161 2169
    /// The value type of RangeIdMap.
2162 2170
    typedef int Value;
2163 2171

	
2164 2172
    /// \brief Constructor.
2165 2173
    ///
2166 2174
    /// Constructor.
2167 2175
    explicit RangeIdMap(const Graph& gr) : Map(gr) {
2168 2176
      Item it;
2169 2177
      const typename Map::Notifier* nf = Map::notifier();
2170 2178
      for (nf->first(it); it != INVALID; nf->next(it)) {
2171 2179
        Map::set(it, _inv_map.size());
2172 2180
        _inv_map.push_back(it);
2173 2181
      }
2174 2182
    }
2175 2183

	
2176 2184
  protected:
2177 2185

	
2178 2186
    /// \brief Adds a new key to the map.
2179 2187
    ///
2180 2188
    /// Add a new key to the map. It is called by the
2181 2189
    /// \c AlterationNotifier.
2182 2190
    virtual void add(const Item& item) {
2183 2191
      Map::add(item);
2184 2192
      Map::set(item, _inv_map.size());
2185 2193
      _inv_map.push_back(item);
2186 2194
    }
2187 2195

	
2188 2196
    /// \brief Add more new keys to the map.
2189 2197
    ///
2190 2198
    /// Add more new keys to the map. It is called by the
2191 2199
    /// \c AlterationNotifier.
2192 2200
    virtual void add(const std::vector<Item>& items) {
2193 2201
      Map::add(items);
2194 2202
      for (int i = 0; i < int(items.size()); ++i) {
2195 2203
        Map::set(items[i], _inv_map.size());
2196 2204
        _inv_map.push_back(items[i]);
2197 2205
      }
2198 2206
    }
2199 2207

	
2200 2208
    /// \brief Erase the key from the map.
2201 2209
    ///
2202 2210
    /// Erase the key from the map. It is called by the
2203 2211
    /// \c AlterationNotifier.
2204 2212
    virtual void erase(const Item& item) {
2205 2213
      Map::set(_inv_map.back(), Map::operator[](item));
2206 2214
      _inv_map[Map::operator[](item)] = _inv_map.back();
2207 2215
      _inv_map.pop_back();
2208 2216
      Map::erase(item);
2209 2217
    }
2210 2218

	
2211 2219
    /// \brief Erase more keys from the map.
2212 2220
    ///
2213 2221
    /// Erase more keys from the map. It is called by the
2214 2222
    /// \c AlterationNotifier.
2215 2223
    virtual void erase(const std::vector<Item>& items) {
2216 2224
      for (int i = 0; i < int(items.size()); ++i) {
2217 2225
        Map::set(_inv_map.back(), Map::operator[](items[i]));
2218 2226
        _inv_map[Map::operator[](items[i])] = _inv_map.back();
2219 2227
        _inv_map.pop_back();
2220 2228
      }
2221 2229
      Map::erase(items);
2222 2230
    }
2223 2231

	
2224 2232
    /// \brief Build the unique map.
2225 2233
    ///
2226 2234
    /// Build the unique map. It is called by the
2227 2235
    /// \c AlterationNotifier.
2228 2236
    virtual void build() {
2229 2237
      Map::build();
2230 2238
      Item it;
2231 2239
      const typename Map::Notifier* nf = Map::notifier();
2232 2240
      for (nf->first(it); it != INVALID; nf->next(it)) {
2233 2241
        Map::set(it, _inv_map.size());
2234 2242
        _inv_map.push_back(it);
2235 2243
      }
2236 2244
    }
2237 2245

	
2238 2246
    /// \brief Clear the keys from the map.
2239 2247
    ///
2240 2248
    /// Clear the keys from the map. It is called by the
2241 2249
    /// \c AlterationNotifier.
2242 2250
    virtual void clear() {
2243 2251
      _inv_map.clear();
2244 2252
      Map::clear();
2245 2253
    }
2246 2254

	
2247 2255
  public:
2248 2256

	
2249 2257
    /// \brief Returns the maximal value plus one.
2250 2258
    ///
2251 2259
    /// Returns the maximal value plus one in the map.
2252 2260
    unsigned int size() const {
2253 2261
      return _inv_map.size();
2254 2262
    }
2255 2263

	
2256 2264
    /// \brief Swaps the position of the two items in the map.
2257 2265
    ///
2258 2266
    /// Swaps the position of the two items in the map.
2259 2267
    void swap(const Item& p, const Item& q) {
2260 2268
      int pi = Map::operator[](p);
2261 2269
      int qi = Map::operator[](q);
2262 2270
      Map::set(p, qi);
2263 2271
      _inv_map[qi] = p;
2264 2272
      Map::set(q, pi);
2265 2273
      _inv_map[pi] = q;
2266 2274
    }
2267 2275

	
2268 2276
    /// \brief Gives back the \e RangeId of the item
2269 2277
    ///
2270 2278
    /// Gives back the \e RangeId of the item.
2271 2279
    int operator[](const Item& item) const {
2272 2280
      return Map::operator[](item);
2273 2281
    }
2274 2282

	
2275 2283
    /// \brief Gives back the item belonging to a \e RangeId
2276 2284
    /// 
2277 2285
    /// Gives back the item belonging to a \e RangeId.
2278 2286
    Item operator()(int id) const {
2279 2287
      return _inv_map[id];
2280 2288
    }
2281 2289

	
2282 2290
  private:
2283 2291

	
2284 2292
    typedef std::vector<Item> Container;
2285 2293
    Container _inv_map;
2286 2294

	
2287 2295
  public:
2288 2296

	
2289 2297
    /// \brief The inverse map type of RangeIdMap.
2290 2298
    ///
2291 2299
    /// The inverse map type of RangeIdMap.
2292 2300
    class InverseMap {
2293 2301
    public:
2294 2302
      /// \brief Constructor
2295 2303
      ///
2296 2304
      /// Constructor of the InverseMap.
2297 2305
      explicit InverseMap(const RangeIdMap& inverted)
2298 2306
        : _inverted(inverted) {}
2299 2307

	
2300 2308

	
2301 2309
      /// The value type of the InverseMap.
2302 2310
      typedef typename RangeIdMap::Key Value;
2303 2311
      /// The key type of the InverseMap.
2304 2312
      typedef typename RangeIdMap::Value Key;
2305 2313

	
2306 2314
      /// \brief Subscript operator.
2307 2315
      ///
2308 2316
      /// Subscript operator. It gives back the item
2309 2317
      /// that the descriptor currently belongs to.
2310 2318
      Value operator[](const Key& key) const {
2311 2319
        return _inverted(key);
2312 2320
      }
2313 2321

	
2314 2322
      /// \brief Size of the map.
2315 2323
      ///
2316 2324
      /// Returns the size of the map.
2317 2325
      unsigned int size() const {
2318 2326
        return _inverted.size();
2319 2327
      }
2320 2328

	
2321 2329
    private:
2322 2330
      const RangeIdMap& _inverted;
2323 2331
    };
2324 2332

	
2325 2333
    /// \brief Gives back the inverse of the map.
2326 2334
    ///
2327 2335
    /// Gives back the inverse of the map.
2328 2336
    const InverseMap inverse() const {
2329 2337
      return InverseMap(*this);
2330 2338
    }
2331 2339
  };
2332 2340

	
2333 2341
  /// \brief Map of the source nodes of arcs in a digraph.
2334 2342
  ///
2335 2343
  /// SourceMap provides access for the source node of each arc in a digraph,
2336 2344
  /// which is returned by the \c source() function of the digraph.
2337 2345
  /// \tparam GR The digraph type.
2338 2346
  /// \see TargetMap
2339 2347
  template <typename GR>
2340 2348
  class SourceMap {
2341 2349
  public:
2342 2350

	
2343 2351
    ///\e
2344 2352
    typedef typename GR::Arc Key;
2345 2353
    ///\e
2346 2354
    typedef typename GR::Node Value;
2347 2355

	
2348 2356
    /// \brief Constructor
2349 2357
    ///
2350 2358
    /// Constructor.
2351 2359
    /// \param digraph The digraph that the map belongs to.
2352 2360
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
2353 2361

	
2354 2362
    /// \brief Returns the source node of the given arc.
2355 2363
    ///
2356 2364
    /// Returns the source node of the given arc.
2357 2365
    Value operator[](const Key& arc) const {
2358 2366
      return _graph.source(arc);
2359 2367
    }
2360 2368

	
2361 2369
  private:
2362 2370
    const GR& _graph;
2363 2371
  };
2364 2372

	
2365 2373
  /// \brief Returns a \c SourceMap class.
2366 2374
  ///
2367 2375
  /// This function just returns an \c SourceMap class.
2368 2376
  /// \relates SourceMap
2369 2377
  template <typename GR>
2370 2378
  inline SourceMap<GR> sourceMap(const GR& graph) {
2371 2379
    return SourceMap<GR>(graph);
2372 2380
  }
2373 2381

	
2374 2382
  /// \brief Map of the target nodes of arcs in a digraph.
2375 2383
  ///
2376 2384
  /// TargetMap provides access for the target node of each arc in a digraph,
2377 2385
  /// which is returned by the \c target() function of the digraph.
2378 2386
  /// \tparam GR The digraph type.
2379 2387
  /// \see SourceMap
2380 2388
  template <typename GR>
2381 2389
  class TargetMap {
2382 2390
  public:
2383 2391

	
2384 2392
    ///\e
2385 2393
    typedef typename GR::Arc Key;
2386 2394
    ///\e
2387 2395
    typedef typename GR::Node Value;
2388 2396

	
2389 2397
    /// \brief Constructor
2390 2398
    ///
2391 2399
    /// Constructor.
2392 2400
    /// \param digraph The digraph that the map belongs to.
2393 2401
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
2394 2402

	
2395 2403
    /// \brief Returns the target node of the given arc.
2396 2404
    ///
2397 2405
    /// Returns the target node of the given arc.
2398 2406
    Value operator[](const Key& e) const {
2399 2407
      return _graph.target(e);
2400 2408
    }
2401 2409

	
2402 2410
  private:
2403 2411
    const GR& _graph;
2404 2412
  };
2405 2413

	
2406 2414
  /// \brief Returns a \c TargetMap class.
2407 2415
  ///
2408 2416
  /// This function just returns a \c TargetMap class.
2409 2417
  /// \relates TargetMap
2410 2418
  template <typename GR>
2411 2419
  inline TargetMap<GR> targetMap(const GR& graph) {
2412 2420
    return TargetMap<GR>(graph);
2413 2421
  }
2414 2422

	
2415 2423
  /// \brief Map of the "forward" directed arc view of edges in a graph.
2416 2424
  ///
2417 2425
  /// ForwardMap provides access for the "forward" directed arc view of
2418 2426
  /// each edge in a graph, which is returned by the \c direct() function
2419 2427
  /// of the graph with \c true parameter.
2420 2428
  /// \tparam GR The graph type.
2421 2429
  /// \see BackwardMap
2422 2430
  template <typename GR>
2423 2431
  class ForwardMap {
2424 2432
  public:
2425 2433

	
2426 2434
    typedef typename GR::Arc Value;
2427 2435
    typedef typename GR::Edge Key;
2428 2436

	
2429 2437
    /// \brief Constructor
2430 2438
    ///
2431 2439
    /// Constructor.
2432 2440
    /// \param graph The graph that the map belongs to.
2433 2441
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
2434 2442

	
2435 2443
    /// \brief Returns the "forward" directed arc view of the given edge.
2436 2444
    ///
2437 2445
    /// Returns the "forward" directed arc view of the given edge.
2438 2446
    Value operator[](const Key& key) const {
2439 2447
      return _graph.direct(key, true);
2440 2448
    }
2441 2449

	
2442 2450
  private:
2443 2451
    const GR& _graph;
2444 2452
  };
2445 2453

	
2446 2454
  /// \brief Returns a \c ForwardMap class.
2447 2455
  ///
2448 2456
  /// This function just returns an \c ForwardMap class.
2449 2457
  /// \relates ForwardMap
2450 2458
  template <typename GR>
2451 2459
  inline ForwardMap<GR> forwardMap(const GR& graph) {
2452 2460
    return ForwardMap<GR>(graph);
2453 2461
  }
2454 2462

	
2455 2463
  /// \brief Map of the "backward" directed arc view of edges in a graph.
2456 2464
  ///
2457 2465
  /// BackwardMap provides access for the "backward" directed arc view of
2458 2466
  /// each edge in a graph, which is returned by the \c direct() function
2459 2467
  /// of the graph with \c false parameter.
2460 2468
  /// \tparam GR The graph type.
2461 2469
  /// \see ForwardMap
2462 2470
  template <typename GR>
2463 2471
  class BackwardMap {
2464 2472
  public:
2465 2473

	
2466 2474
    typedef typename GR::Arc Value;
2467 2475
    typedef typename GR::Edge Key;
2468 2476

	
2469 2477
    /// \brief Constructor
2470 2478
    ///
2471 2479
    /// Constructor.
2472 2480
    /// \param graph The graph that the map belongs to.
2473 2481
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
2474 2482

	
2475 2483
    /// \brief Returns the "backward" directed arc view of the given edge.
2476 2484
    ///
2477 2485
    /// Returns the "backward" directed arc view of the given edge.
2478 2486
    Value operator[](const Key& key) const {
2479 2487
      return _graph.direct(key, false);
2480 2488
    }
2481 2489

	
2482 2490
  private:
2483 2491
    const GR& _graph;
2484 2492
  };
2485 2493

	
2486 2494
  /// \brief Returns a \c BackwardMap class
2487 2495

	
2488 2496
  /// This function just returns a \c BackwardMap class.
2489 2497
  /// \relates BackwardMap
2490 2498
  template <typename GR>
2491 2499
  inline BackwardMap<GR> backwardMap(const GR& graph) {
2492 2500
    return BackwardMap<GR>(graph);
2493 2501
  }
2494 2502

	
2495 2503
  /// \brief Map of the in-degrees of nodes in a digraph.
2496 2504
  ///
2497 2505
  /// This map returns the in-degree of a node. Once it is constructed,
2498 2506
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2499 2507
  /// in constant time. On the other hand, the values are updated automatically
2500 2508
  /// whenever the digraph changes.
2501 2509
  ///
2502 2510
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
2503 2511
  /// may provide alternative ways to modify the digraph.
2504 2512
  /// The correct behavior of InDegMap is not guarantied if these additional
2505 2513
  /// features are used. For example the functions
2506 2514
  /// \ref ListDigraph::changeSource() "changeSource()",
2507 2515
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2508 2516
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2509 2517
  /// of \ref ListDigraph will \e not update the degree values correctly.
2510 2518
  ///
2511 2519
  /// \sa OutDegMap
2512 2520
  template <typename GR>
2513 2521
  class InDegMap
2514 2522
    : protected ItemSetTraits<GR, typename GR::Arc>
2515 2523
      ::ItemNotifier::ObserverBase {
2516 2524

	
2517 2525
  public:
2518 2526
    
2519 2527
    /// The graph type of InDegMap
2520 2528
    typedef GR Graph;
2521 2529
    typedef GR Digraph;
2522 2530
    /// The key type
2523 2531
    typedef typename Digraph::Node Key;
2524 2532
    /// The value type
2525 2533
    typedef int Value;
2526 2534

	
2527 2535
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2528 2536
    ::ItemNotifier::ObserverBase Parent;
2529 2537

	
2530 2538
  private:
2531 2539

	
2532 2540
    class AutoNodeMap
2533 2541
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2534 2542
    public:
2535 2543

	
2536 2544
      typedef typename ItemSetTraits<Digraph, Key>::
2537 2545
      template Map<int>::Type Parent;
2538 2546

	
2539 2547
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2540 2548

	
2541 2549
      virtual void add(const Key& key) {
2542 2550
        Parent::add(key);
2543 2551
        Parent::set(key, 0);
2544 2552
      }
2545 2553

	
2546 2554
      virtual void add(const std::vector<Key>& keys) {
2547 2555
        Parent::add(keys);
2548 2556
        for (int i = 0; i < int(keys.size()); ++i) {
2549 2557
          Parent::set(keys[i], 0);
2550 2558
        }
2551 2559
      }
2552 2560

	
2553 2561
      virtual void build() {
2554 2562
        Parent::build();
2555 2563
        Key it;
2556 2564
        typename Parent::Notifier* nf = Parent::notifier();
2557 2565
        for (nf->first(it); it != INVALID; nf->next(it)) {
2558 2566
          Parent::set(it, 0);
2559 2567
        }
2560 2568
      }
2561 2569
    };
2562 2570

	
2563 2571
  public:
2564 2572

	
2565 2573
    /// \brief Constructor.
2566 2574
    ///
2567 2575
    /// Constructor for creating an in-degree map.
2568 2576
    explicit InDegMap(const Digraph& graph)
2569 2577
      : _digraph(graph), _deg(graph) {
2570 2578
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2571 2579

	
2572 2580
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2573 2581
        _deg[it] = countInArcs(_digraph, it);
2574 2582
      }
2575 2583
    }
2576 2584

	
2577 2585
    /// \brief Gives back the in-degree of a Node.
2578 2586
    ///
2579 2587
    /// Gives back the in-degree of a Node.
2580 2588
    int operator[](const Key& key) const {
2581 2589
      return _deg[key];
2582 2590
    }
2583 2591

	
2584 2592
  protected:
2585 2593

	
2586 2594
    typedef typename Digraph::Arc Arc;
2587 2595

	
2588 2596
    virtual void add(const Arc& arc) {
2589 2597
      ++_deg[_digraph.target(arc)];
2590 2598
    }
2591 2599

	
2592 2600
    virtual void add(const std::vector<Arc>& arcs) {
2593 2601
      for (int i = 0; i < int(arcs.size()); ++i) {
2594 2602
        ++_deg[_digraph.target(arcs[i])];
2595 2603
      }
2596 2604
    }
2597 2605

	
2598 2606
    virtual void erase(const Arc& arc) {
2599 2607
      --_deg[_digraph.target(arc)];
2600 2608
    }
2601 2609

	
2602 2610
    virtual void erase(const std::vector<Arc>& arcs) {
2603 2611
      for (int i = 0; i < int(arcs.size()); ++i) {
2604 2612
        --_deg[_digraph.target(arcs[i])];
2605 2613
      }
2606 2614
    }
2607 2615

	
2608 2616
    virtual void build() {
2609 2617
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2610 2618
        _deg[it] = countInArcs(_digraph, it);
2611 2619
      }
2612 2620
    }
2613 2621

	
2614 2622
    virtual void clear() {
2615 2623
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2616 2624
        _deg[it] = 0;
2617 2625
      }
2618 2626
    }
2619 2627
  private:
2620 2628

	
2621 2629
    const Digraph& _digraph;
2622 2630
    AutoNodeMap _deg;
2623 2631
  };
2624 2632

	
2625 2633
  /// \brief Map of the out-degrees of nodes in a digraph.
2626 2634
  ///
2627 2635
  /// This map returns the out-degree of a node. Once it is constructed,
2628 2636
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2629 2637
  /// in constant time. On the other hand, the values are updated automatically
2630 2638
  /// whenever the digraph changes.
2631 2639
  ///
2632 2640
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
2633 2641
  /// may provide alternative ways to modify the digraph.
2634 2642
  /// The correct behavior of OutDegMap is not guarantied if these additional
2635 2643
  /// features are used. For example the functions
2636 2644
  /// \ref ListDigraph::changeSource() "changeSource()",
2637 2645
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2638 2646
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2639 2647
  /// of \ref ListDigraph will \e not update the degree values correctly.
2640 2648
  ///
2641 2649
  /// \sa InDegMap
2642 2650
  template <typename GR>
2643 2651
  class OutDegMap
2644 2652
    : protected ItemSetTraits<GR, typename GR::Arc>
2645 2653
      ::ItemNotifier::ObserverBase {
2646 2654

	
2647 2655
  public:
2648 2656

	
2649 2657
    /// The graph type of OutDegMap
2650 2658
    typedef GR Graph;
2651 2659
    typedef GR Digraph;
2652 2660
    /// The key type
2653 2661
    typedef typename Digraph::Node Key;
2654 2662
    /// The value type
2655 2663
    typedef int Value;
2656 2664

	
2657 2665
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2658 2666
    ::ItemNotifier::ObserverBase Parent;
2659 2667

	
2660 2668
  private:
2661 2669

	
2662 2670
    class AutoNodeMap
2663 2671
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2664 2672
    public:
2665 2673

	
2666 2674
      typedef typename ItemSetTraits<Digraph, Key>::
2667 2675
      template Map<int>::Type Parent;
2668 2676

	
2669 2677
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2670 2678

	
2671 2679
      virtual void add(const Key& key) {
2672 2680
        Parent::add(key);
2673 2681
        Parent::set(key, 0);
2674 2682
      }
2675 2683
      virtual void add(const std::vector<Key>& keys) {
2676 2684
        Parent::add(keys);
2677 2685
        for (int i = 0; i < int(keys.size()); ++i) {
2678 2686
          Parent::set(keys[i], 0);
2679 2687
        }
2680 2688
      }
2681 2689
      virtual void build() {
2682 2690
        Parent::build();
2683 2691
        Key it;
2684 2692
        typename Parent::Notifier* nf = Parent::notifier();
2685 2693
        for (nf->first(it); it != INVALID; nf->next(it)) {
2686 2694
          Parent::set(it, 0);
2687 2695
        }
2688 2696
      }
2689 2697
    };
2690 2698

	
2691 2699
  public:
2692 2700

	
2693 2701
    /// \brief Constructor.
2694 2702
    ///
2695 2703
    /// Constructor for creating an out-degree map.
2696 2704
    explicit OutDegMap(const Digraph& graph)
2697 2705
      : _digraph(graph), _deg(graph) {
2698 2706
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2699 2707

	
2700 2708
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2701 2709
        _deg[it] = countOutArcs(_digraph, it);
2702 2710
      }
2703 2711
    }
2704 2712

	
2705 2713
    /// \brief Gives back the out-degree of a Node.
2706 2714
    ///
2707 2715
    /// Gives back the out-degree of a Node.
2708 2716
    int operator[](const Key& key) const {
2709 2717
      return _deg[key];
2710 2718
    }
2711 2719

	
2712 2720
  protected:
2713 2721

	
2714 2722
    typedef typename Digraph::Arc Arc;
2715 2723

	
2716 2724
    virtual void add(const Arc& arc) {
2717 2725
      ++_deg[_digraph.source(arc)];
2718 2726
    }
2719 2727

	
2720 2728
    virtual void add(const std::vector<Arc>& arcs) {
2721 2729
      for (int i = 0; i < int(arcs.size()); ++i) {
2722 2730
        ++_deg[_digraph.source(arcs[i])];
2723 2731
      }
2724 2732
    }
2725 2733

	
2726 2734
    virtual void erase(const Arc& arc) {
2727 2735
      --_deg[_digraph.source(arc)];
2728 2736
    }
2729 2737

	
2730 2738
    virtual void erase(const std::vector<Arc>& arcs) {
2731 2739
      for (int i = 0; i < int(arcs.size()); ++i) {
2732 2740
        --_deg[_digraph.source(arcs[i])];
2733 2741
      }
2734 2742
    }
2735 2743

	
2736 2744
    virtual void build() {
2737 2745
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2738 2746
        _deg[it] = countOutArcs(_digraph, it);
2739 2747
      }
2740 2748
    }
2741 2749

	
2742 2750
    virtual void clear() {
2743 2751
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2744 2752
        _deg[it] = 0;
2745 2753
      }
2746 2754
    }
2747 2755
  private:
2748 2756

	
2749 2757
    const Digraph& _digraph;
2750 2758
    AutoNodeMap _deg;
2751 2759
  };
2752 2760

	
2753 2761
  /// \brief Potential difference map
2754 2762
  ///
2755 2763
  /// PotentialDifferenceMap returns the difference between the potentials of
2756 2764
  /// the source and target nodes of each arc in a digraph, i.e. it returns
2757 2765
  /// \code
2758 2766
  ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2759 2767
  /// \endcode
2760 2768
  /// \tparam GR The digraph type.
2761 2769
  /// \tparam POT A node map storing the potentials.
2762 2770
  template <typename GR, typename POT>
2763 2771
  class PotentialDifferenceMap {
2764 2772
  public:
2765 2773
    /// Key type
2766 2774
    typedef typename GR::Arc Key;
2767 2775
    /// Value type
2768 2776
    typedef typename POT::Value Value;
2769 2777

	
2770 2778
    /// \brief Constructor
2771 2779
    ///
2772 2780
    /// Contructor of the map.
2773 2781
    explicit PotentialDifferenceMap(const GR& gr,
2774 2782
                                    const POT& potential)
2775 2783
      : _digraph(gr), _potential(potential) {}
2776 2784

	
2777 2785
    /// \brief Returns the potential difference for the given arc.
2778 2786
    ///
2779 2787
    /// Returns the potential difference for the given arc, i.e.
2780 2788
    /// \code
2781 2789
    ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2782 2790
    /// \endcode
2783 2791
    Value operator[](const Key& arc) const {
2784 2792
      return _potential[_digraph.target(arc)] -
2785 2793
        _potential[_digraph.source(arc)];
2786 2794
    }
2787 2795

	
2788 2796
  private:
2789 2797
    const GR& _digraph;
2790 2798
    const POT& _potential;
2791 2799
  };
2792 2800

	
2793 2801
  /// \brief Returns a PotentialDifferenceMap.
2794 2802
  ///
2795 2803
  /// This function just returns a PotentialDifferenceMap.
2796 2804
  /// \relates PotentialDifferenceMap
2797 2805
  template <typename GR, typename POT>
2798 2806
  PotentialDifferenceMap<GR, POT>
2799 2807
  potentialDifferenceMap(const GR& gr, const POT& potential) {
2800 2808
    return PotentialDifferenceMap<GR, POT>(gr, potential);
2801 2809
  }
2802 2810

	
2803 2811
  /// @}
2804 2812
}
2805 2813

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

	
19 19
#include <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25 25
#include <lemon/list_graph.h>
26 26

	
27 27
#include "test_tools.h"
28 28

	
29 29
using namespace lemon;
30 30
using namespace lemon::concepts;
31 31

	
32 32
struct A {};
33 33
inline bool operator<(A, A) { return true; }
34 34
struct B {};
35 35

	
36 36
class C {
37 37
  int x;
38 38
public:
39 39
  C(int _x) : x(_x) {}
40 40
};
41 41

	
42 42
class F {
43 43
public:
44 44
  typedef A argument_type;
45 45
  typedef B result_type;
46 46

	
47 47
  B operator()(const A&) const { return B(); }
48 48
private:
49 49
  F& operator=(const F&);
50 50
};
51 51

	
52 52
int func(A) { return 3; }
53 53

	
54 54
int binc(int a, B) { return a+1; }
55 55

	
56 56
typedef ReadMap<A, double> DoubleMap;
57 57
typedef ReadWriteMap<A, double> DoubleWriteMap;
58 58
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
59 59

	
60 60
typedef ReadMap<A, bool> BoolMap;
61 61
typedef ReadWriteMap<A, bool> BoolWriteMap;
62 62
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
63 63

	
64 64
int main()
65 65
{
66 66
  // Map concepts
67 67
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
68 68
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
69 69
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
70 70
  checkConcept<WriteMap<A,C>, WriteMap<A,C> >();
71 71
  checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >();
72 72
  checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >();
73 73
  checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
74 74
  checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >();
75 75

	
76 76
  // NullMap
77 77
  {
78 78
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
79 79
    NullMap<A,B> map1;
80 80
    NullMap<A,B> map2 = map1;
81 81
    map1 = nullMap<A,B>();
82 82
  }
83 83

	
84 84
  // ConstMap
85 85
  {
86 86
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
87 87
    checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >();
88 88
    ConstMap<A,B> map1;
89 89
    ConstMap<A,B> map2 = B();
90 90
    ConstMap<A,B> map3 = map1;
91 91
    map1 = constMap<A>(B());
92 92
    map1 = constMap<A,B>();
93 93
    map1.setAll(B());
94 94
    ConstMap<A,C> map4(C(1));
95 95
    ConstMap<A,C> map5 = map4;
96 96
    map4 = constMap<A>(C(2));
97 97
    map4.setAll(C(3));
98 98

	
99 99
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
100 100
    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
101 101

	
102 102
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
103 103
    ConstMap<A,Const<int,10> > map6;
104 104
    ConstMap<A,Const<int,10> > map7 = map6;
105 105
    map6 = constMap<A,int,10>();
106 106
    map7 = constMap<A,Const<int,10> >();
107 107
    check(map6[A()] == 10 && map7[A()] == 10,
108 108
          "Something is wrong with ConstMap");
109 109
  }
110 110

	
111 111
  // IdentityMap
112 112
  {
113 113
    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
114 114
    IdentityMap<A> map1;
115 115
    IdentityMap<A> map2 = map1;
116 116
    map1 = identityMap<A>();
117 117

	
118 118
    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
119 119
    check(identityMap<double>()[1.0] == 1.0 &&
120 120
          identityMap<double>()[3.14] == 3.14,
121 121
          "Something is wrong with IdentityMap");
122 122
  }
123 123

	
124 124
  // RangeMap
125 125
  {
126 126
    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
127 127
    RangeMap<B> map1;
128 128
    RangeMap<B> map2(10);
129 129
    RangeMap<B> map3(10,B());
130 130
    RangeMap<B> map4 = map1;
131 131
    RangeMap<B> map5 = rangeMap<B>();
132 132
    RangeMap<B> map6 = rangeMap<B>(10);
133 133
    RangeMap<B> map7 = rangeMap(10,B());
134 134

	
135 135
    checkConcept< ReferenceMap<int, double, double&, const double&>,
136 136
                  RangeMap<double> >();
137 137
    std::vector<double> v(10, 0);
138 138
    v[5] = 100;
139 139
    RangeMap<double> map8(v);
140 140
    RangeMap<double> map9 = rangeMap(v);
141 141
    check(map9.size() == 10 && map9[2] == 0 && map9[5] == 100,
142 142
          "Something is wrong with RangeMap");
143 143
  }
144 144

	
145 145
  // SparseMap
146 146
  {
147 147
    checkConcept<ReferenceMap<A,B,B&,const B&>, SparseMap<A,B> >();
148 148
    SparseMap<A,B> map1;
149 149
    SparseMap<A,B> map2 = B();
150 150
    SparseMap<A,B> map3 = sparseMap<A,B>();
151 151
    SparseMap<A,B> map4 = sparseMap<A>(B());
152 152

	
153 153
    checkConcept< ReferenceMap<double, int, int&, const int&>,
154 154
                  SparseMap<double, int> >();
155 155
    std::map<double, int> m;
156 156
    SparseMap<double, int> map5(m);
157 157
    SparseMap<double, int> map6(m,10);
158 158
    SparseMap<double, int> map7 = sparseMap(m);
159 159
    SparseMap<double, int> map8 = sparseMap(m,10);
160 160

	
161 161
    check(map5[1.0] == 0 && map5[3.14] == 0 &&
162 162
          map6[1.0] == 10 && map6[3.14] == 10,
163 163
          "Something is wrong with SparseMap");
164 164
    map5[1.0] = map6[3.14] = 100;
165 165
    check(map5[1.0] == 100 && map5[3.14] == 0 &&
166 166
          map6[1.0] == 10 && map6[3.14] == 100,
167 167
          "Something is wrong with SparseMap");
168 168
  }
169 169

	
170 170
  // ComposeMap
171 171
  {
172 172
    typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
173 173
    checkConcept<ReadMap<B,double>, CompMap>();
174 174
    CompMap map1 = CompMap(DoubleMap(),ReadMap<B,A>());
175 175
    CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
176 176

	
177 177
    SparseMap<double, bool> m1(false); m1[3.14] = true;
178 178
    RangeMap<double> m2(2); m2[0] = 3.0; m2[1] = 3.14;
179 179
    check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1],
180 180
          "Something is wrong with ComposeMap")
181 181
  }
182 182

	
183 183
  // CombineMap
184 184
  {
185 185
    typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
186 186
    checkConcept<ReadMap<A,double>, CombMap>();
187 187
    CombMap map1 = CombMap(DoubleMap(), DoubleMap());
188 188
    CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
189 189

	
190 190
    check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3,
191 191
          "Something is wrong with CombineMap");
192 192
  }
193 193

	
194 194
  // FunctorToMap, MapToFunctor
195 195
  {
196 196
    checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >();
197 197
    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
198 198
    FunctorToMap<F> map1;
199 199
    FunctorToMap<F> map2 = FunctorToMap<F>(F());
200 200
    B b = functorToMap(F())[A()];
201 201

	
202 202
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
203 203
    MapToFunctor<ReadMap<A,B> > map = MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
204 204

	
205 205
    check(functorToMap(&func)[A()] == 3,
206 206
          "Something is wrong with FunctorToMap");
207 207
    check(mapToFunctor(constMap<A,int>(2))(A()) == 2,
208 208
          "Something is wrong with MapToFunctor");
209 209
    check(mapToFunctor(functorToMap(&func))(A()) == 3 &&
210 210
          mapToFunctor(functorToMap(&func))[A()] == 3,
211 211
          "Something is wrong with FunctorToMap or MapToFunctor");
212 212
    check(functorToMap(mapToFunctor(constMap<A,int>(2)))[A()] == 2,
213 213
          "Something is wrong with FunctorToMap or MapToFunctor");
214 214
  }
215 215

	
216 216
  // ConvertMap
217 217
  {
218 218
    checkConcept<ReadMap<double,double>,
219 219
      ConvertMap<ReadMap<double, int>, double> >();
220 220
    ConvertMap<RangeMap<bool>, int> map1(rangeMap(1, true));
221 221
    ConvertMap<RangeMap<bool>, int> map2 = convertMap<int>(rangeMap(2, false));
222 222
  }
223 223

	
224 224
  // ForkMap
225 225
  {
226 226
    checkConcept<DoubleWriteMap, ForkMap<DoubleWriteMap, DoubleWriteMap> >();
227 227

	
228 228
    typedef RangeMap<double> RM;
229 229
    typedef SparseMap<int, double> SM;
230 230
    RM m1(10, -1);
231 231
    SM m2(-1);
232 232
    checkConcept<ReadWriteMap<int, double>, ForkMap<RM, SM> >();
233 233
    checkConcept<ReadWriteMap<int, double>, ForkMap<SM, RM> >();
234 234
    ForkMap<RM, SM> map1(m1,m2);
235 235
    ForkMap<SM, RM> map2 = forkMap(m2,m1);
236 236
    map2.set(5, 10);
237 237
    check(m1[1] == -1 && m1[5] == 10 && m2[1] == -1 &&
238 238
          m2[5] == 10 && map2[1] == -1 && map2[5] == 10,
239 239
          "Something is wrong with ForkMap");
240 240
  }
241 241

	
242 242
  // Arithmetic maps:
243 243
  // - AddMap, SubMap, MulMap, DivMap
244 244
  // - ShiftMap, ShiftWriteMap, ScaleMap, ScaleWriteMap
245 245
  // - NegMap, NegWriteMap, AbsMap
246 246
  {
247 247
    checkConcept<DoubleMap, AddMap<DoubleMap,DoubleMap> >();
248 248
    checkConcept<DoubleMap, SubMap<DoubleMap,DoubleMap> >();
249 249
    checkConcept<DoubleMap, MulMap<DoubleMap,DoubleMap> >();
250 250
    checkConcept<DoubleMap, DivMap<DoubleMap,DoubleMap> >();
251 251

	
252 252
    ConstMap<int, double> c1(1.0), c2(3.14);
253 253
    IdentityMap<int> im;
254 254
    ConvertMap<IdentityMap<int>, double> id(im);
255 255
    check(addMap(c1,id)[0] == 1.0  && addMap(c1,id)[10] == 11.0,
256 256
          "Something is wrong with AddMap");
257 257
    check(subMap(id,c1)[0] == -1.0 && subMap(id,c1)[10] == 9.0,
258 258
          "Something is wrong with SubMap");
259 259
    check(mulMap(id,c2)[0] == 0    && mulMap(id,c2)[2]  == 6.28,
260 260
          "Something is wrong with MulMap");
261 261
    check(divMap(c2,id)[1] == 3.14 && divMap(c2,id)[2]  == 1.57,
262 262
          "Something is wrong with DivMap");
263 263

	
264 264
    checkConcept<DoubleMap, ShiftMap<DoubleMap> >();
265 265
    checkConcept<DoubleWriteMap, ShiftWriteMap<DoubleWriteMap> >();
266 266
    checkConcept<DoubleMap, ScaleMap<DoubleMap> >();
267 267
    checkConcept<DoubleWriteMap, ScaleWriteMap<DoubleWriteMap> >();
268 268
    checkConcept<DoubleMap, NegMap<DoubleMap> >();
269 269
    checkConcept<DoubleWriteMap, NegWriteMap<DoubleWriteMap> >();
270 270
    checkConcept<DoubleMap, AbsMap<DoubleMap> >();
271 271

	
272 272
    check(shiftMap(id, 2.0)[1] == 3.0 && shiftMap(id, 2.0)[10] == 12.0,
273 273
          "Something is wrong with ShiftMap");
274 274
    check(shiftWriteMap(id, 2.0)[1] == 3.0 &&
275 275
          shiftWriteMap(id, 2.0)[10] == 12.0,
276 276
          "Something is wrong with ShiftWriteMap");
277 277
    check(scaleMap(id, 2.0)[1] == 2.0 && scaleMap(id, 2.0)[10] == 20.0,
278 278
          "Something is wrong with ScaleMap");
279 279
    check(scaleWriteMap(id, 2.0)[1] == 2.0 &&
280 280
          scaleWriteMap(id, 2.0)[10] == 20.0,
281 281
          "Something is wrong with ScaleWriteMap");
282 282
    check(negMap(id)[1] == -1.0 && negMap(id)[-10] == 10.0,
283 283
          "Something is wrong with NegMap");
284 284
    check(negWriteMap(id)[1] == -1.0 && negWriteMap(id)[-10] == 10.0,
285 285
          "Something is wrong with NegWriteMap");
286 286
    check(absMap(id)[1] == 1.0 && absMap(id)[-10] == 10.0,
287 287
          "Something is wrong with AbsMap");
288 288
  }
289 289

	
290 290
  // Logical maps:
291 291
  // - TrueMap, FalseMap
292 292
  // - AndMap, OrMap
293 293
  // - NotMap, NotWriteMap
294 294
  // - EqualMap, LessMap
295 295
  {
296 296
    checkConcept<BoolMap, TrueMap<A> >();
297 297
    checkConcept<BoolMap, FalseMap<A> >();
298 298
    checkConcept<BoolMap, AndMap<BoolMap,BoolMap> >();
299 299
    checkConcept<BoolMap, OrMap<BoolMap,BoolMap> >();
300 300
    checkConcept<BoolMap, NotMap<BoolMap> >();
301 301
    checkConcept<BoolWriteMap, NotWriteMap<BoolWriteMap> >();
302 302
    checkConcept<BoolMap, EqualMap<DoubleMap,DoubleMap> >();
303 303
    checkConcept<BoolMap, LessMap<DoubleMap,DoubleMap> >();
304 304

	
305 305
    TrueMap<int> tm;
306 306
    FalseMap<int> fm;
307 307
    RangeMap<bool> rm(2);
308 308
    rm[0] = true; rm[1] = false;
309 309
    check(andMap(tm,rm)[0] && !andMap(tm,rm)[1] &&
310 310
          !andMap(fm,rm)[0] && !andMap(fm,rm)[1],
311 311
          "Something is wrong with AndMap");
312 312
    check(orMap(tm,rm)[0] && orMap(tm,rm)[1] &&
313 313
          orMap(fm,rm)[0] && !orMap(fm,rm)[1],
314 314
          "Something is wrong with OrMap");
315 315
    check(!notMap(rm)[0] && notMap(rm)[1],
316 316
          "Something is wrong with NotMap");
317 317
    check(!notWriteMap(rm)[0] && notWriteMap(rm)[1],
318 318
          "Something is wrong with NotWriteMap");
319 319

	
320 320
    ConstMap<int, double> cm(2.0);
321 321
    IdentityMap<int> im;
322 322
    ConvertMap<IdentityMap<int>, double> id(im);
323 323
    check(lessMap(id,cm)[1] && !lessMap(id,cm)[2] && !lessMap(id,cm)[3],
324 324
          "Something is wrong with LessMap");
325 325
    check(!equalMap(id,cm)[1] && equalMap(id,cm)[2] && !equalMap(id,cm)[3],
326 326
          "Something is wrong with EqualMap");
327 327
  }
328 328

	
329 329
  // LoggerBoolMap
330 330
  {
331 331
    typedef std::vector<int> vec;
332
    checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >();
333
    checkConcept<WriteMap<int, bool>,
334
                 LoggerBoolMap<std::back_insert_iterator<vec> > >();
335

	
332 336
    vec v1;
333 337
    vec v2(10);
334 338
    LoggerBoolMap<std::back_insert_iterator<vec> >
335 339
      map1(std::back_inserter(v1));
336 340
    LoggerBoolMap<vec::iterator> map2(v2.begin());
337 341
    map1.set(10, false);
338 342
    map1.set(20, true);   map2.set(20, true);
339 343
    map1.set(30, false);  map2.set(40, false);
340 344
    map1.set(50, true);   map2.set(50, true);
341 345
    map1.set(60, true);   map2.set(60, true);
342 346
    check(v1.size() == 3 && v2.size() == 10 &&
343 347
          v1[0]==20 && v1[1]==50 && v1[2]==60 &&
344 348
          v2[0]==20 && v2[1]==50 && v2[2]==60,
345 349
          "Something is wrong with LoggerBoolMap");
346 350

	
347 351
    int i = 0;
348 352
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
349 353
          it != map2.end(); ++it )
350 354
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
351 355
  }
352 356
  
357
  // IdMap, RangeIdMap
358
  {
359
    typedef ListDigraph Graph;
360
    DIGRAPH_TYPEDEFS(Graph);
361

	
362
    checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >();
363
    checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >();
364
    checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >();
365
    checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >();
366
    
367
    Graph gr;
368
    IdMap<Graph, Node> nmap(gr);
369
    IdMap<Graph, Arc> amap(gr);
370
    RangeIdMap<Graph, Node> nrmap(gr);
371
    RangeIdMap<Graph, Arc> armap(gr);
372
    
373
    Node n0 = gr.addNode();
374
    Node n1 = gr.addNode();
375
    Node n2 = gr.addNode();
376
    
377
    Arc a0 = gr.addArc(n0, n1);
378
    Arc a1 = gr.addArc(n0, n2);
379
    Arc a2 = gr.addArc(n2, n1);
380
    Arc a3 = gr.addArc(n2, n0);
381
    
382
    check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap");
383
    check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap");
384
    check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap");
385

	
386
    check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap");
387
    check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap");
388
    check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap");
389
    check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap");
390

	
391
    check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap");
392
    check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap");
393
    
394
    check(nrmap.size() == 3 && armap.size() == 4,
395
          "Wrong RangeIdMap::size()");
396

	
397
    check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap");
398
    check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap");
399
    check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap");
400
    
401
    check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap");
402
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
403
    check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap");
404
    check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap");
405

	
406
    check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap");
407
    check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap");
408
    
409
    gr.erase(n1);
410
    
411
    if (nrmap[n0] == 1) nrmap.swap(n0, n2);
412
    nrmap.swap(n2, n0);
413
    if (armap[a1] == 1) armap.swap(a1, a3);
414
    armap.swap(a3, a1);
415
    
416
    check(nrmap.size() == 2 && armap.size() == 2,
417
          "Wrong RangeIdMap::size()");
418

	
419
    check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap");
420
    check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap");
421
    
422
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
423
    check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
424

	
425
    check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
426
    check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
427
  }
428
  
353 429
  // CrossRefMap
354 430
  {
355 431
    typedef ListDigraph Graph;
356 432
    DIGRAPH_TYPEDEFS(Graph);
357 433

	
358 434
    checkConcept<ReadWriteMap<Node, int>,
359 435
                 CrossRefMap<Graph, Node, int> >();
436
    checkConcept<ReadWriteMap<Node, bool>,
437
                 CrossRefMap<Graph, Node, bool> >();
438
    checkConcept<ReadWriteMap<Node, double>,
439
                 CrossRefMap<Graph, Node, double> >();
360 440
    
361 441
    Graph gr;
362 442
    typedef CrossRefMap<Graph, Node, char> CRMap;
363 443
    typedef CRMap::ValueIterator ValueIt;
364 444
    CRMap map(gr);
365 445
    
366 446
    Node n0 = gr.addNode();
367 447
    Node n1 = gr.addNode();
368 448
    Node n2 = gr.addNode();
369 449
    
370 450
    map.set(n0, 'A');
371 451
    map.set(n1, 'B');
372 452
    map.set(n2, 'C');
453
    
454
    check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
455
          "Wrong CrossRefMap");
456
    check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
457
          "Wrong CrossRefMap");
458
    check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
459
          "Wrong CrossRefMap");
460
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
461
          "Wrong CrossRefMap::count()");
462
    
463
    ValueIt it = map.beginValue();
464
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
465
          it == map.endValue(), "Wrong value iterator");
466
    
373 467
    map.set(n2, 'A');
468

	
469
    check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
470
          "Wrong CrossRefMap");
471
    check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
472
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
473
    check(map('C') == INVALID && map.inverse()['C'] == INVALID,
474
          "Wrong CrossRefMap");
475
    check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
476
          "Wrong CrossRefMap::count()");
477

	
478
    it = map.beginValue();
479
    check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' &&
480
          it == map.endValue(), "Wrong value iterator");
481

	
374 482
    map.set(n0, 'C');
375 483

	
376 484
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
377 485
          "Wrong CrossRefMap");
378 486
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
379 487
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
380 488
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
489
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
490
          "Wrong CrossRefMap::count()");
381 491

	
382
    ValueIt it = map.beginValue();
492
    it = map.beginValue();
383 493
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
384 494
          it == map.endValue(), "Wrong value iterator");
385 495
  }
386 496

	
387 497
  return 0;
388 498
}
0 comments (0 inline)