gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 2 0
merge default
2 files changed with 1093 insertions and 10 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -22,6 +22,7 @@
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25
#include <map>
25 26

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

	
... ...
@@ -29,8 +30,6 @@
29 30
///\ingroup maps
30 31
///\brief Miscellaneous property maps
31 32

	
32
#include <map>
33

	
34 33
namespace lemon {
35 34

	
36 35
  /// \addtogroup maps
... ...
@@ -1818,7 +1817,7 @@
1818 1817
  /// \brief Provides an immutable and unique id for each item in a graph.
1819 1818
  ///
1820 1819
  /// IdMap provides a unique and immutable id for each item of the
1821
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
1820
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
1822 1821
  ///  - \b unique: different items get different ids,
1823 1822
  ///  - \b immutable: the id of an item does not change (even if you
1824 1823
  ///    delete other nodes).
... ...
@@ -2273,7 +2272,7 @@
2273 2272
    }
2274 2273

	
2275 2274
    /// \brief Gives back the item belonging to a \e RangeId
2276
    /// 
2275
    ///
2277 2276
    /// Gives back the item belonging to a \e RangeId.
2278 2277
    Item operator()(int id) const {
2279 2278
      return _inv_map[id];
... ...
@@ -2330,6 +2329,903 @@
2330 2329
    }
2331 2330
  };
2332 2331

	
2332
  /// \brief Dynamic iterable \c bool map.
2333
  ///
2334
  /// This class provides a special graph map type which can store a
2335
  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2336
  /// For both \c true and \c false values it is possible to iterate on
2337
  /// the keys.
2338
  ///
2339
  /// This type is a reference map, so it can be modified with the
2340
  /// subscript operator.
2341
  ///
2342
  /// \tparam GR The graph type.
2343
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2344
  /// \c GR::Edge).
2345
  ///
2346
  /// \see IterableIntMap, IterableValueMap
2347
  /// \see CrossRefMap
2348
  template <typename GR, typename K>
2349
  class IterableBoolMap
2350
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2351
  private:
2352
    typedef GR Graph;
2353

	
2354
    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2355
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2356

	
2357
    std::vector<K> _array;
2358
    int _sep;
2359

	
2360
  public:
2361

	
2362
    /// Indicates that the map is reference map.
2363
    typedef True ReferenceMapTag;
2364

	
2365
    /// The key type
2366
    typedef K Key;
2367
    /// The value type
2368
    typedef bool Value;
2369
    /// The const reference type.
2370
    typedef const Value& ConstReference;
2371

	
2372
  private:
2373

	
2374
    int position(const Key& key) const {
2375
      return Parent::operator[](key);
2376
    }
2377

	
2378
  public:
2379

	
2380
    /// \brief Reference to the value of the map.
2381
    ///
2382
    /// This class is similar to the \c bool type. It can be converted to
2383
    /// \c bool and it provides the same operators.
2384
    class Reference {
2385
      friend class IterableBoolMap;
2386
    private:
2387
      Reference(IterableBoolMap& map, const Key& key)
2388
        : _key(key), _map(map) {}
2389
    public:
2390

	
2391
      Reference& operator=(const Reference& value) {
2392
        _map.set(_key, static_cast<bool>(value));
2393
         return *this;
2394
      }
2395

	
2396
      operator bool() const {
2397
        return static_cast<const IterableBoolMap&>(_map)[_key];
2398
      }
2399

	
2400
      Reference& operator=(bool value) {
2401
        _map.set(_key, value);
2402
        return *this;
2403
      }
2404
      Reference& operator&=(bool value) {
2405
        _map.set(_key, _map[_key] & value);
2406
        return *this;
2407
      }
2408
      Reference& operator|=(bool value) {
2409
        _map.set(_key, _map[_key] | value);
2410
        return *this;
2411
      }
2412
      Reference& operator^=(bool value) {
2413
        _map.set(_key, _map[_key] ^ value);
2414
        return *this;
2415
      }
2416
    private:
2417
      Key _key;
2418
      IterableBoolMap& _map;
2419
    };
2420

	
2421
    /// \brief Constructor of the map with a default value.
2422
    ///
2423
    /// Constructor of the map with a default value.
2424
    explicit IterableBoolMap(const Graph& graph, bool def = false)
2425
      : Parent(graph) {
2426
      typename Parent::Notifier* nf = Parent::notifier();
2427
      Key it;
2428
      for (nf->first(it); it != INVALID; nf->next(it)) {
2429
        Parent::set(it, _array.size());
2430
        _array.push_back(it);
2431
      }
2432
      _sep = (def ? _array.size() : 0);
2433
    }
2434

	
2435
    /// \brief Const subscript operator of the map.
2436
    ///
2437
    /// Const subscript operator of the map.
2438
    bool operator[](const Key& key) const {
2439
      return position(key) < _sep;
2440
    }
2441

	
2442
    /// \brief Subscript operator of the map.
2443
    ///
2444
    /// Subscript operator of the map.
2445
    Reference operator[](const Key& key) {
2446
      return Reference(*this, key);
2447
    }
2448

	
2449
    /// \brief Set operation of the map.
2450
    ///
2451
    /// Set operation of the map.
2452
    void set(const Key& key, bool value) {
2453
      int pos = position(key);
2454
      if (value) {
2455
        if (pos < _sep) return;
2456
        Key tmp = _array[_sep];
2457
        _array[_sep] = key;
2458
        Parent::set(key, _sep);
2459
        _array[pos] = tmp;
2460
        Parent::set(tmp, pos);
2461
        ++_sep;
2462
      } else {
2463
        if (pos >= _sep) return;
2464
        --_sep;
2465
        Key tmp = _array[_sep];
2466
        _array[_sep] = key;
2467
        Parent::set(key, _sep);
2468
        _array[pos] = tmp;
2469
        Parent::set(tmp, pos);
2470
      }
2471
    }
2472

	
2473
    /// \brief Set all items.
2474
    ///
2475
    /// Set all items in the map.
2476
    /// \note Constant time operation.
2477
    void setAll(bool value) {
2478
      _sep = (value ? _array.size() : 0);
2479
    }
2480

	
2481
    /// \brief Returns the number of the keys mapped to \c true.
2482
    ///
2483
    /// Returns the number of the keys mapped to \c true.
2484
    int trueNum() const {
2485
      return _sep;
2486
    }
2487

	
2488
    /// \brief Returns the number of the keys mapped to \c false.
2489
    ///
2490
    /// Returns the number of the keys mapped to \c false.
2491
    int falseNum() const {
2492
      return _array.size() - _sep;
2493
    }
2494

	
2495
    /// \brief Iterator for the keys mapped to \c true.
2496
    ///
2497
    /// Iterator for the keys mapped to \c true. It works
2498
    /// like a graph item iterator, it can be converted to
2499
    /// the key type of the map, incremented with \c ++ operator, and
2500
    /// if the iterator leaves the last valid key, it will be equal to
2501
    /// \c INVALID.
2502
    class TrueIt : public Key {
2503
    public:
2504
      typedef Key Parent;
2505

	
2506
      /// \brief Creates an iterator.
2507
      ///
2508
      /// Creates an iterator. It iterates on the
2509
      /// keys mapped to \c true.
2510
      /// \param map The IterableBoolMap.
2511
      explicit TrueIt(const IterableBoolMap& map)
2512
        : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
2513
          _map(&map) {}
2514

	
2515
      /// \brief Invalid constructor \& conversion.
2516
      ///
2517
      /// This constructor initializes the iterator to be invalid.
2518
      /// \sa Invalid for more details.
2519
      TrueIt(Invalid) : Parent(INVALID), _map(0) {}
2520

	
2521
      /// \brief Increment operator.
2522
      ///
2523
      /// Increment operator.
2524
      TrueIt& operator++() {
2525
        int pos = _map->position(*this);
2526
        Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
2527
        return *this;
2528
      }
2529

	
2530
    private:
2531
      const IterableBoolMap* _map;
2532
    };
2533

	
2534
    /// \brief Iterator for the keys mapped to \c false.
2535
    ///
2536
    /// Iterator for the keys mapped to \c false. It works
2537
    /// like a graph item iterator, it can be converted to
2538
    /// the key type of the map, incremented with \c ++ operator, and
2539
    /// if the iterator leaves the last valid key, it will be equal to
2540
    /// \c INVALID.
2541
    class FalseIt : public Key {
2542
    public:
2543
      typedef Key Parent;
2544

	
2545
      /// \brief Creates an iterator.
2546
      ///
2547
      /// Creates an iterator. It iterates on the
2548
      /// keys mapped to \c false.
2549
      /// \param map The IterableBoolMap.
2550
      explicit FalseIt(const IterableBoolMap& map)
2551
        : Parent(map._sep < int(map._array.size()) ?
2552
                 map._array.back() : INVALID), _map(&map) {}
2553

	
2554
      /// \brief Invalid constructor \& conversion.
2555
      ///
2556
      /// This constructor initializes the iterator to be invalid.
2557
      /// \sa Invalid for more details.
2558
      FalseIt(Invalid) : Parent(INVALID), _map(0) {}
2559

	
2560
      /// \brief Increment operator.
2561
      ///
2562
      /// Increment operator.
2563
      FalseIt& operator++() {
2564
        int pos = _map->position(*this);
2565
        Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
2566
        return *this;
2567
      }
2568

	
2569
    private:
2570
      const IterableBoolMap* _map;
2571
    };
2572

	
2573
    /// \brief Iterator for the keys mapped to a given value.
2574
    ///
2575
    /// Iterator for the keys mapped to a given value. It works
2576
    /// like a graph item iterator, it can be converted to
2577
    /// the key type of the map, incremented with \c ++ operator, and
2578
    /// if the iterator leaves the last valid key, it will be equal to
2579
    /// \c INVALID.
2580
    class ItemIt : public Key {
2581
    public:
2582
      typedef Key Parent;
2583

	
2584
      /// \brief Creates an iterator with a value.
2585
      ///
2586
      /// Creates an iterator with a value. It iterates on the
2587
      /// keys mapped to the given value.
2588
      /// \param map The IterableBoolMap.
2589
      /// \param value The value.
2590
      ItemIt(const IterableBoolMap& map, bool value)
2591
        : Parent(value ? 
2592
                 (map._sep > 0 ?
2593
                  map._array[map._sep - 1] : INVALID) :
2594
                 (map._sep < int(map._array.size()) ?
2595
                  map._array.back() : INVALID)), _map(&map) {}
2596

	
2597
      /// \brief Invalid constructor \& conversion.
2598
      ///
2599
      /// This constructor initializes the iterator to be invalid.
2600
      /// \sa Invalid for more details.
2601
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2602

	
2603
      /// \brief Increment operator.
2604
      ///
2605
      /// Increment operator.
2606
      ItemIt& operator++() {
2607
        int pos = _map->position(*this);
2608
        int _sep = pos >= _map->_sep ? _map->_sep : 0;
2609
        Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
2610
        return *this;
2611
      }
2612

	
2613
    private:
2614
      const IterableBoolMap* _map;
2615
    };
2616

	
2617
  protected:
2618

	
2619
    virtual void add(const Key& key) {
2620
      Parent::add(key);
2621
      Parent::set(key, _array.size());
2622
      _array.push_back(key);
2623
    }
2624

	
2625
    virtual void add(const std::vector<Key>& keys) {
2626
      Parent::add(keys);
2627
      for (int i = 0; i < int(keys.size()); ++i) {
2628
        Parent::set(keys[i], _array.size());
2629
        _array.push_back(keys[i]);
2630
      }
2631
    }
2632

	
2633
    virtual void erase(const Key& key) {
2634
      int pos = position(key);
2635
      if (pos < _sep) {
2636
        --_sep;
2637
        Parent::set(_array[_sep], pos);
2638
        _array[pos] = _array[_sep];
2639
        Parent::set(_array.back(), _sep);
2640
        _array[_sep] = _array.back();
2641
        _array.pop_back();
2642
      } else {
2643
        Parent::set(_array.back(), pos);
2644
        _array[pos] = _array.back();
2645
        _array.pop_back();
2646
      }
2647
      Parent::erase(key);
2648
    }
2649

	
2650
    virtual void erase(const std::vector<Key>& keys) {
2651
      for (int i = 0; i < int(keys.size()); ++i) {
2652
        int pos = position(keys[i]);
2653
        if (pos < _sep) {
2654
          --_sep;
2655
          Parent::set(_array[_sep], pos);
2656
          _array[pos] = _array[_sep];
2657
          Parent::set(_array.back(), _sep);
2658
          _array[_sep] = _array.back();
2659
          _array.pop_back();
2660
        } else {
2661
          Parent::set(_array.back(), pos);
2662
          _array[pos] = _array.back();
2663
          _array.pop_back();
2664
        }
2665
      }
2666
      Parent::erase(keys);
2667
    }
2668

	
2669
    virtual void build() {
2670
      Parent::build();
2671
      typename Parent::Notifier* nf = Parent::notifier();
2672
      Key it;
2673
      for (nf->first(it); it != INVALID; nf->next(it)) {
2674
        Parent::set(it, _array.size());
2675
        _array.push_back(it);
2676
      }
2677
      _sep = 0;
2678
    }
2679

	
2680
    virtual void clear() {
2681
      _array.clear();
2682
      _sep = 0;
2683
      Parent::clear();
2684
    }
2685

	
2686
  };
2687

	
2688

	
2689
  namespace _maps_bits {
2690
    template <typename Item>
2691
    struct IterableIntMapNode {
2692
      IterableIntMapNode() : value(-1) {}
2693
      IterableIntMapNode(int _value) : value(_value) {}
2694
      Item prev, next;
2695
      int value;
2696
    };
2697
  }
2698

	
2699
  /// \brief Dynamic iterable integer map.
2700
  ///
2701
  /// This class provides a special graph map type which can store an
2702
  /// integer value for graph items (\c Node, \c Arc or \c Edge).
2703
  /// For each non-negative value it is possible to iterate on the keys
2704
  /// mapped to the value.
2705
  ///
2706
  /// This type is a reference map, so it can be modified with the
2707
  /// subscript operator.
2708
  ///
2709
  /// \note The size of the data structure depends on the largest
2710
  /// value in the map.
2711
  ///
2712
  /// \tparam GR The graph type.
2713
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2714
  /// \c GR::Edge).
2715
  ///
2716
  /// \see IterableBoolMap, IterableValueMap
2717
  /// \see CrossRefMap
2718
  template <typename GR, typename K>
2719
  class IterableIntMap
2720
    : protected ItemSetTraits<GR, K>::
2721
        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2722
  public:
2723
    typedef typename ItemSetTraits<GR, K>::
2724
      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2725

	
2726
    /// The key type
2727
    typedef K Key;
2728
    /// The value type
2729
    typedef int Value;
2730
    /// The graph type
2731
    typedef GR Graph;
2732

	
2733
    /// \brief Constructor of the map.
2734
    ///
2735
    /// Constructor of the map. It sets all values to -1.
2736
    explicit IterableIntMap(const Graph& graph)
2737
      : Parent(graph) {}
2738

	
2739
    /// \brief Constructor of the map with a given value.
2740
    ///
2741
    /// Constructor of the map with a given value.
2742
    explicit IterableIntMap(const Graph& graph, int value)
2743
      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2744
      if (value >= 0) {
2745
        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2746
          lace(it);
2747
        }
2748
      }
2749
    }
2750

	
2751
  private:
2752

	
2753
    void unlace(const Key& key) {
2754
      typename Parent::Value& node = Parent::operator[](key);
2755
      if (node.value < 0) return;
2756
      if (node.prev != INVALID) {
2757
        Parent::operator[](node.prev).next = node.next;
2758
      } else {
2759
        _first[node.value] = node.next;
2760
      }
2761
      if (node.next != INVALID) {
2762
        Parent::operator[](node.next).prev = node.prev;
2763
      }
2764
      while (!_first.empty() && _first.back() == INVALID) {
2765
        _first.pop_back();
2766
      }
2767
    }
2768

	
2769
    void lace(const Key& key) {
2770
      typename Parent::Value& node = Parent::operator[](key);
2771
      if (node.value < 0) return;
2772
      if (node.value >= int(_first.size())) {
2773
        _first.resize(node.value + 1, INVALID);
2774
      }
2775
      node.prev = INVALID;
2776
      node.next = _first[node.value];
2777
      if (node.next != INVALID) {
2778
        Parent::operator[](node.next).prev = key;
2779
      }
2780
      _first[node.value] = key;
2781
    }
2782

	
2783
  public:
2784

	
2785
    /// Indicates that the map is reference map.
2786
    typedef True ReferenceMapTag;
2787

	
2788
    /// \brief Reference to the value of the map.
2789
    ///
2790
    /// This class is similar to the \c int type. It can
2791
    /// be converted to \c int and it has the same operators.
2792
    class Reference {
2793
      friend class IterableIntMap;
2794
    private:
2795
      Reference(IterableIntMap& map, const Key& key)
2796
        : _key(key), _map(map) {}
2797
    public:
2798

	
2799
      Reference& operator=(const Reference& value) {
2800
        _map.set(_key, static_cast<const int&>(value));
2801
         return *this;
2802
      }
2803

	
2804
      operator const int&() const {
2805
        return static_cast<const IterableIntMap&>(_map)[_key];
2806
      }
2807

	
2808
      Reference& operator=(int value) {
2809
        _map.set(_key, value);
2810
        return *this;
2811
      }
2812
      Reference& operator++() {
2813
        _map.set(_key, _map[_key] + 1);
2814
        return *this;
2815
      }
2816
      int operator++(int) {
2817
        int value = _map[_key];
2818
        _map.set(_key, value + 1);
2819
        return value;
2820
      }
2821
      Reference& operator--() {
2822
        _map.set(_key, _map[_key] - 1);
2823
        return *this;
2824
      }
2825
      int operator--(int) {
2826
        int value = _map[_key];
2827
        _map.set(_key, value - 1);
2828
        return value;
2829
      }
2830
      Reference& operator+=(int value) {
2831
        _map.set(_key, _map[_key] + value);
2832
        return *this;
2833
      }
2834
      Reference& operator-=(int value) {
2835
        _map.set(_key, _map[_key] - value);
2836
        return *this;
2837
      }
2838
      Reference& operator*=(int value) {
2839
        _map.set(_key, _map[_key] * value);
2840
        return *this;
2841
      }
2842
      Reference& operator/=(int value) {
2843
        _map.set(_key, _map[_key] / value);
2844
        return *this;
2845
      }
2846
      Reference& operator%=(int value) {
2847
        _map.set(_key, _map[_key] % value);
2848
        return *this;
2849
      }
2850
      Reference& operator&=(int value) {
2851
        _map.set(_key, _map[_key] & value);
2852
        return *this;
2853
      }
2854
      Reference& operator|=(int value) {
2855
        _map.set(_key, _map[_key] | value);
2856
        return *this;
2857
      }
2858
      Reference& operator^=(int value) {
2859
        _map.set(_key, _map[_key] ^ value);
2860
        return *this;
2861
      }
2862
      Reference& operator<<=(int value) {
2863
        _map.set(_key, _map[_key] << value);
2864
        return *this;
2865
      }
2866
      Reference& operator>>=(int value) {
2867
        _map.set(_key, _map[_key] >> value);
2868
        return *this;
2869
      }
2870

	
2871
    private:
2872
      Key _key;
2873
      IterableIntMap& _map;
2874
    };
2875

	
2876
    /// The const reference type.
2877
    typedef const Value& ConstReference;
2878

	
2879
    /// \brief Gives back the maximal value plus one.
2880
    ///
2881
    /// Gives back the maximal value plus one.
2882
    int size() const {
2883
      return _first.size();
2884
    }
2885

	
2886
    /// \brief Set operation of the map.
2887
    ///
2888
    /// Set operation of the map.
2889
    void set(const Key& key, const Value& value) {
2890
      unlace(key);
2891
      Parent::operator[](key).value = value;
2892
      lace(key);
2893
    }
2894

	
2895
    /// \brief Const subscript operator of the map.
2896
    ///
2897
    /// Const subscript operator of the map.
2898
    const Value& operator[](const Key& key) const {
2899
      return Parent::operator[](key).value;
2900
    }
2901

	
2902
    /// \brief Subscript operator of the map.
2903
    ///
2904
    /// Subscript operator of the map.
2905
    Reference operator[](const Key& key) {
2906
      return Reference(*this, key);
2907
    }
2908

	
2909
    /// \brief Iterator for the keys with the same value.
2910
    ///
2911
    /// Iterator for the keys with the same value. It works
2912
    /// like a graph item iterator, it can be converted to
2913
    /// the item type of the map, incremented with \c ++ operator, and
2914
    /// if the iterator leaves the last valid item, it will be equal to
2915
    /// \c INVALID.
2916
    class ItemIt : public Key {
2917
    public:
2918
      typedef Key Parent;
2919

	
2920
      /// \brief Invalid constructor \& conversion.
2921
      ///
2922
      /// This constructor initializes the iterator to be invalid.
2923
      /// \sa Invalid for more details.
2924
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2925

	
2926
      /// \brief Creates an iterator with a value.
2927
      ///
2928
      /// Creates an iterator with a value. It iterates on the
2929
      /// keys mapped to the given value.
2930
      /// \param map The IterableIntMap.
2931
      /// \param value The value.
2932
      ItemIt(const IterableIntMap& map, int value) : _map(&map) {
2933
        if (value < 0 || value >= int(_map->_first.size())) {
2934
          Parent::operator=(INVALID);
2935
        } else {
2936
          Parent::operator=(_map->_first[value]);
2937
        }
2938
      }
2939

	
2940
      /// \brief Increment operator.
2941
      ///
2942
      /// Increment operator.
2943
      ItemIt& operator++() {
2944
        Parent::operator=(_map->IterableIntMap::Parent::
2945
                          operator[](static_cast<Parent&>(*this)).next);
2946
        return *this;
2947
      }
2948

	
2949
    private:
2950
      const IterableIntMap* _map;
2951
    };
2952

	
2953
  protected:
2954

	
2955
    virtual void erase(const Key& key) {
2956
      unlace(key);
2957
      Parent::erase(key);
2958
    }
2959

	
2960
    virtual void erase(const std::vector<Key>& keys) {
2961
      for (int i = 0; i < int(keys.size()); ++i) {
2962
        unlace(keys[i]);
2963
      }
2964
      Parent::erase(keys);
2965
    }
2966

	
2967
    virtual void clear() {
2968
      _first.clear();
2969
      Parent::clear();
2970
    }
2971

	
2972
  private:
2973
    std::vector<Key> _first;
2974
  };
2975

	
2976
  namespace _maps_bits {
2977
    template <typename Item, typename Value>
2978
    struct IterableValueMapNode {
2979
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
2980
      Item prev, next;
2981
      Value value;
2982
    };
2983
  }
2984

	
2985
  /// \brief Dynamic iterable map for comparable values.
2986
  ///
2987
  /// This class provides a special graph map type which can store an
2988
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
2989
  /// For each value it is possible to iterate on the keys mapped to
2990
  /// the value.
2991
  ///
2992
  /// The map stores for each value a linked list with
2993
  /// the items which mapped to the value, and the values are stored
2994
  /// in balanced binary tree. The values of the map can be accessed
2995
  /// with stl compatible forward iterator.
2996
  ///
2997
  /// This type is not reference map, so it cannot be modified with
2998
  /// the subscript operator.
2999
  ///
3000
  /// \tparam GR The graph type.
3001
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3002
  /// \c GR::Edge).
3003
  /// \tparam V The value type of the map. It can be any comparable
3004
  /// value type.
3005
  ///
3006
  /// \see IterableBoolMap, IterableIntMap
3007
  /// \see CrossRefMap
3008
  template <typename GR, typename K, typename V>
3009
  class IterableValueMap
3010
    : protected ItemSetTraits<GR, K>::
3011
        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3012
  public:
3013
    typedef typename ItemSetTraits<GR, K>::
3014
      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3015

	
3016
    /// The key type
3017
    typedef K Key;
3018
    /// The value type
3019
    typedef V Value;
3020
    /// The graph type
3021
    typedef GR Graph;
3022

	
3023
  public:
3024

	
3025
    /// \brief Constructor of the map with a given value.
3026
    ///
3027
    /// Constructor of the map with a given value.
3028
    explicit IterableValueMap(const Graph& graph,
3029
                              const Value& value = Value())
3030
      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3031
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3032
        lace(it);
3033
      }
3034
    }
3035

	
3036
  protected:
3037

	
3038
    void unlace(const Key& key) {
3039
      typename Parent::Value& node = Parent::operator[](key);
3040
      if (node.prev != INVALID) {
3041
        Parent::operator[](node.prev).next = node.next;
3042
      } else {
3043
        if (node.next != INVALID) {
3044
          _first[node.value] = node.next;
3045
        } else {
3046
          _first.erase(node.value);
3047
        }
3048
      }
3049
      if (node.next != INVALID) {
3050
        Parent::operator[](node.next).prev = node.prev;
3051
      }
3052
    }
3053

	
3054
    void lace(const Key& key) {
3055
      typename Parent::Value& node = Parent::operator[](key);
3056
      typename std::map<Value, Key>::iterator it = _first.find(node.value);
3057
      if (it == _first.end()) {
3058
        node.prev = node.next = INVALID;
3059
        _first.insert(std::make_pair(node.value, key));
3060
      } else {
3061
        node.prev = INVALID;
3062
        node.next = it->second;
3063
        if (node.next != INVALID) {
3064
          Parent::operator[](node.next).prev = key;
3065
        }
3066
        it->second = key;
3067
      }
3068
    }
3069

	
3070
  public:
3071

	
3072
    /// \brief Forward iterator for values.
3073
    ///
3074
    /// This iterator is an stl compatible forward
3075
    /// iterator on the values of the map. The values can
3076
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3077
    class ValueIterator
3078
      : public std::iterator<std::forward_iterator_tag, Value> {
3079
      friend class IterableValueMap;
3080
    private:
3081
      ValueIterator(typename std::map<Value, Key>::const_iterator _it)
3082
        : it(_it) {}
3083
    public:
3084

	
3085
      ValueIterator() {}
3086

	
3087
      ValueIterator& operator++() { ++it; return *this; }
3088
      ValueIterator operator++(int) {
3089
        ValueIterator tmp(*this);
3090
        operator++();
3091
        return tmp;
3092
      }
3093

	
3094
      const Value& operator*() const { return it->first; }
3095
      const Value* operator->() const { return &(it->first); }
3096

	
3097
      bool operator==(ValueIterator jt) const { return it == jt.it; }
3098
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
3099

	
3100
    private:
3101
      typename std::map<Value, Key>::const_iterator it;
3102
    };
3103

	
3104
    /// \brief Returns an iterator to the first value.
3105
    ///
3106
    /// Returns an stl compatible iterator to the
3107
    /// first value of the map. The values of the
3108
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3109
    /// range.
3110
    ValueIterator beginValue() const {
3111
      return ValueIterator(_first.begin());
3112
    }
3113

	
3114
    /// \brief Returns an iterator after the last value.
3115
    ///
3116
    /// Returns an stl compatible iterator after the
3117
    /// last value of the map. The values of the
3118
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3119
    /// range.
3120
    ValueIterator endValue() const {
3121
      return ValueIterator(_first.end());
3122
    }
3123

	
3124
    /// \brief Set operation of the map.
3125
    ///
3126
    /// Set operation of the map.
3127
    void set(const Key& key, const Value& value) {
3128
      unlace(key);
3129
      Parent::operator[](key).value = value;
3130
      lace(key);
3131
    }
3132

	
3133
    /// \brief Const subscript operator of the map.
3134
    ///
3135
    /// Const subscript operator of the map.
3136
    const Value& operator[](const Key& key) const {
3137
      return Parent::operator[](key).value;
3138
    }
3139

	
3140
    /// \brief Iterator for the keys with the same value.
3141
    ///
3142
    /// Iterator for the keys with the same value. It works
3143
    /// like a graph item iterator, it can be converted to
3144
    /// the item type of the map, incremented with \c ++ operator, and
3145
    /// if the iterator leaves the last valid item, it will be equal to
3146
    /// \c INVALID.
3147
    class ItemIt : public Key {
3148
    public:
3149
      typedef Key Parent;
3150

	
3151
      /// \brief Invalid constructor \& conversion.
3152
      ///
3153
      /// This constructor initializes the iterator to be invalid.
3154
      /// \sa Invalid for more details.
3155
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3156

	
3157
      /// \brief Creates an iterator with a value.
3158
      ///
3159
      /// Creates an iterator with a value. It iterates on the
3160
      /// keys which have the given value.
3161
      /// \param map The IterableValueMap
3162
      /// \param value The value
3163
      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3164
        typename std::map<Value, Key>::const_iterator it =
3165
          map._first.find(value);
3166
        if (it == map._first.end()) {
3167
          Parent::operator=(INVALID);
3168
        } else {
3169
          Parent::operator=(it->second);
3170
        }
3171
      }
3172

	
3173
      /// \brief Increment operator.
3174
      ///
3175
      /// Increment Operator.
3176
      ItemIt& operator++() {
3177
        Parent::operator=(_map->IterableValueMap::Parent::
3178
                          operator[](static_cast<Parent&>(*this)).next);
3179
        return *this;
3180
      }
3181

	
3182

	
3183
    private:
3184
      const IterableValueMap* _map;
3185
    };
3186

	
3187
  protected:
3188

	
3189
    virtual void add(const Key& key) {
3190
      Parent::add(key);
3191
      unlace(key);
3192
    }
3193

	
3194
    virtual void add(const std::vector<Key>& keys) {
3195
      Parent::add(keys);
3196
      for (int i = 0; i < int(keys.size()); ++i) {
3197
        lace(keys[i]);
3198
      }
3199
    }
3200

	
3201
    virtual void erase(const Key& key) {
3202
      unlace(key);
3203
      Parent::erase(key);
3204
    }
3205

	
3206
    virtual void erase(const std::vector<Key>& keys) {
3207
      for (int i = 0; i < int(keys.size()); ++i) {
3208
        unlace(keys[i]);
3209
      }
3210
      Parent::erase(keys);
3211
    }
3212

	
3213
    virtual void build() {
3214
      Parent::build();
3215
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3216
        lace(it);
3217
      }
3218
    }
3219

	
3220
    virtual void clear() {
3221
      _first.clear();
3222
      Parent::clear();
3223
    }
3224

	
3225
  private:
3226
    std::map<Value, Key> _first;
3227
  };
3228

	
2333 3229
  /// \brief Map of the source nodes of arcs in a digraph.
2334 3230
  ///
2335 3231
  /// SourceMap provides access for the source node of each arc in a digraph,
... ...
@@ -2499,7 +3395,7 @@
2499 3395
  /// in constant time. On the other hand, the values are updated automatically
2500 3396
  /// whenever the digraph changes.
2501 3397
  ///
2502
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3398
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2503 3399
  /// may provide alternative ways to modify the digraph.
2504 3400
  /// The correct behavior of InDegMap is not guarantied if these additional
2505 3401
  /// features are used. For example the functions
... ...
@@ -2515,7 +3411,7 @@
2515 3411
      ::ItemNotifier::ObserverBase {
2516 3412

	
2517 3413
  public:
2518
    
3414

	
2519 3415
    /// The graph type of InDegMap
2520 3416
    typedef GR Graph;
2521 3417
    typedef GR Digraph;
... ...
@@ -2629,7 +3525,7 @@
2629 3525
  /// in constant time. On the other hand, the values are updated automatically
2630 3526
  /// whenever the digraph changes.
2631 3527
  ///
2632
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3528
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2633 3529
  /// may provide alternative ways to modify the digraph.
2634 3530
  /// The correct behavior of OutDegMap is not guarantied if these additional
2635 3531
  /// features are used. For example the functions
Ignore white space 6 line context
... ...
@@ -22,7 +22,7 @@
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25
#include <lemon/list_graph.h>
25
#include <lemon/smart_graph.h>
26 26

	
27 27
#include "test_tools.h"
28 28

	
... ...
@@ -349,10 +349,10 @@
349 349
          it != map2.end(); ++it )
350 350
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
351 351
  }
352
  
352

	
353 353
  // CrossRefMap
354 354
  {
355
    typedef ListDigraph Graph;
355
    typedef SmartDigraph Graph;
356 356
    DIGRAPH_TYPEDEFS(Graph);
357 357

	
358 358
    checkConcept<ReadWriteMap<Node, int>,
... ...
@@ -383,6 +383,193 @@
383 383
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
384 384
          it == map.endValue(), "Wrong value iterator");
385 385
  }
386
  
387
  // Iterable bool map
388
  {
389
    typedef SmartGraph Graph;
390
    typedef SmartGraph::Node Item;
386 391

	
392
    typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
393
    checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
394

	
395
    const int num = 10;
396
    Graph g;
397
    std::vector<Item> items;
398
    for (int i = 0; i < num; ++i) {
399
      items.push_back(g.addNode());
400
    }
401

	
402
    Ibm map1(g, true);
403
    int n = 0;
404
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
405
      check(map1[static_cast<Item>(it)], "Wrong TrueIt");
406
      ++n;
407
    }
408
    check(n == num, "Wrong number");
409

	
410
    n = 0;
411
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
412
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
413
        ++n;
414
    }
415
    check(n == num, "Wrong number");
416
    check(Ibm::FalseIt(map1) == INVALID, "Wrong FalseIt");
417
    check(Ibm::ItemIt(map1, false) == INVALID, "Wrong ItemIt for false");
418

	
419
    map1[items[5]] = true;
420

	
421
    n = 0;
422
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
423
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
424
        ++n;
425
    }
426
    check(n == num, "Wrong number");
427

	
428
    map1[items[num / 2]] = false;
429
    check(map1[items[num / 2]] == false, "Wrong map value");
430

	
431
    n = 0;
432
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
433
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
434
        ++n;
435
    }
436
    check(n == num - 1, "Wrong number");
437

	
438
    n = 0;
439
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
440
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
441
        ++n;
442
    }
443
    check(n == 1, "Wrong number");
444

	
445
    map1[items[0]] = false;
446
    check(map1[items[0]] == false, "Wrong map value");
447

	
448
    map1[items[num - 1]] = false;
449
    check(map1[items[num - 1]] == false, "Wrong map value");
450

	
451
    n = 0;
452
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
453
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
454
        ++n;
455
    }
456
    check(n == num - 3, "Wrong number");
457
    check(map1.trueNum() == num - 3, "Wrong number");
458

	
459
    n = 0;
460
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
461
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
462
        ++n;
463
    }
464
    check(n == 3, "Wrong number");
465
    check(map1.falseNum() == 3, "Wrong number");
466
  }
467

	
468
  // Iterable int map
469
  {
470
    typedef SmartGraph Graph;
471
    typedef SmartGraph::Node Item;
472
    typedef IterableIntMap<SmartGraph, SmartGraph::Node> Iim;
473

	
474
    checkConcept<ReferenceMap<Item, int, int&, const int&>, Iim>();
475

	
476
    const int num = 10;
477
    Graph g;
478
    std::vector<Item> items;
479
    for (int i = 0; i < num; ++i) {
480
      items.push_back(g.addNode());
481
    }
482

	
483
    Iim map1(g);
484
    check(map1.size() == 0, "Wrong size");
485

	
486
    for (int i = 0; i < num; ++i) {
487
      map1[items[i]] = i;
488
    }
489
    check(map1.size() == num, "Wrong size");
490

	
491
    for (int i = 0; i < num; ++i) {
492
      Iim::ItemIt it(map1, i);
493
      check(static_cast<Item>(it) == items[i], "Wrong value");
494
      ++it;
495
      check(static_cast<Item>(it) == INVALID, "Wrong value");
496
    }
497

	
498
    for (int i = 0; i < num; ++i) {
499
      map1[items[i]] = i % 2;
500
    }
501
    check(map1.size() == 2, "Wrong size");
502

	
503
    int n = 0;
504
    for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
505
      check(map1[static_cast<Item>(it)] == 0, "Wrong value");
506
      ++n;
507
    }
508
    check(n == (num + 1) / 2, "Wrong number");
509

	
510
    for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
511
      check(map1[static_cast<Item>(it)] == 1, "Wrong value");
512
      ++n;
513
    }
514
    check(n == num, "Wrong number");
515

	
516
  }
517

	
518
  // Iterable value map
519
  {
520
    typedef SmartGraph Graph;
521
    typedef SmartGraph::Node Item;
522
    typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
523

	
524
    checkConcept<ReadWriteMap<Item, double>, Ivm>();
525

	
526
    const int num = 10;
527
    Graph g;
528
    std::vector<Item> items;
529
    for (int i = 0; i < num; ++i) {
530
      items.push_back(g.addNode());
531
    }
532

	
533
    Ivm map1(g, 0.0);
534
    check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
535
    check(*map1.beginValue() == 0.0, "Wrong value");
536

	
537
    for (int i = 0; i < num; ++i) {
538
      map1.set(items[i], static_cast<double>(i));
539
    }
540
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
541

	
542
    for (int i = 0; i < num; ++i) {
543
      Ivm::ItemIt it(map1, static_cast<double>(i));
544
      check(static_cast<Item>(it) == items[i], "Wrong value");
545
      ++it;
546
      check(static_cast<Item>(it) == INVALID, "Wrong value");
547
    }
548

	
549
    for (Ivm::ValueIterator vit = map1.beginValue();
550
         vit != map1.endValue(); ++vit) {
551
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
552
            "Wrong ValueIterator");
553
    }
554

	
555
    for (int i = 0; i < num; ++i) {
556
      map1.set(items[i], static_cast<double>(i % 2));
557
    }
558
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
559

	
560
    int n = 0;
561
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
562
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
563
      ++n;
564
    }
565
    check(n == (num + 1) / 2, "Wrong number");
566

	
567
    for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
568
      check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
569
      ++n;
570
    }
571
    check(n == num, "Wrong number");
572

	
573
  }
387 574
  return 0;
388 575
}
0 comments (0 inline)