gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Remove maps having unclear purposes or little use - WrapMap (SimpleMap) - WrapWriteMap (SimpleWriteMap) - StoreBoolMap - BackInserterBoolMap - FrontInserterBoolMap - InserterBoolMap - FillBoolMap - SettingOrderBoolMap
0 1 0
default
1 file changed with 0 insertions and 448 deletions:
↑ Collapse diff ↑
Ignore white space 12 line context
... ...
@@ -770,84 +770,12 @@
770 770
  template <typename M1, typename M2>
771 771
  inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
772 772
    return ForkMap<M1,M2>(m1,m2);
773 773
  }
774 774

	
775 775

	
776
  /// Simple wrapping of a map
777

	
778
  /// This \ref concepts::ReadMap "read only map" returns the simple
779
  /// wrapping of the given map. Sometimes the reference maps cannot be
780
  /// combined with simple read maps. This map adaptor wraps the given
781
  /// map to simple read map.
782
  ///
783
  /// The simplest way of using this map is through the wrapMap()
784
  /// function.
785
  ///
786
  /// \sa WrapWriteMap
787
  template<typename M>
788
  class WrapMap : public MapBase<typename M::Key, typename M::Value> {
789
    const M &_m;
790
  public:
791
    typedef MapBase<typename M::Key, typename M::Value> Parent;
792
    typedef typename Parent::Key Key;
793
    typedef typename Parent::Value Value;
794

	
795
    /// Constructor
796
    WrapMap(const M &m) : _m(m) {}
797
    /// \e
798
    Value operator[](const Key &k) const { return _m[k]; }
799
  };
800

	
801
  /// Returns a \ref WrapMap class
802

	
803
  /// This function just returns a \ref WrapMap class.
804
  /// \relates WrapMap
805
  template<typename M>
806
  inline WrapMap<M> wrapMap(const M &map) {
807
    return WrapMap<M>(map);
808
  }
809

	
810

	
811
  /// Simple writable wrapping of a map
812

	
813
  /// This \ref concepts::ReadWriteMap "read-write map" returns the simple
814
  /// wrapping of the given map. Sometimes the reference maps cannot be
815
  /// combined with simple read-write maps. This map adaptor wraps the
816
  /// given map to simple read-write map.
817
  ///
818
  /// The simplest way of using this map is through the wrapWriteMap()
819
  /// function.
820
  ///
821
  /// \sa WrapMap
822
  template<typename M>
823
  class WrapWriteMap : public MapBase<typename M::Key, typename M::Value> {
824
    M &_m;
825
  public:
826
    typedef MapBase<typename M::Key, typename M::Value> Parent;
827
    typedef typename Parent::Key Key;
828
    typedef typename Parent::Value Value;
829

	
830
    /// Constructor
831
    WrapWriteMap(M &m) : _m(m) {}
832
    /// \e
833
    Value operator[](const Key &k) const { return _m[k]; }
834
    /// \e
835
    void set(const Key &k, const Value &c) { _m.set(k, c); }
836
  };
837

	
838
  ///Returns a \ref WrapWriteMap class
839

	
840
  ///This function just returns a \ref WrapWriteMap class.
841
  ///\relates WrapWriteMap
842
  template<typename M>
843
  inline WrapWriteMap<M> wrapWriteMap(M &map) {
844
    return WrapWriteMap<M>(map);
845
  }
846

	
847

	
848 776
  /// Sum of two maps
849 777

	
850 778
  /// This \ref concepts::ReadMap "read only map" returns the sum
851 779
  /// of the values of the two given maps.
852 780
  /// Its \c Key and \c Value types are inherited from \c M1.
853 781
  /// The \c Key and \c Value of \c M2 must be convertible to those of
... ...
@@ -1460,386 +1388,10 @@
1460 1388
  /// \relates NotWriteMap
1461 1389
  template <typename M>
1462 1390
  inline NotWriteMap<M> notWriteMap(M &m) {
1463 1391
    return NotWriteMap<M>(m);
1464 1392
  }
1465 1393

	
1466

	
1467
  namespace _maps_bits {
1468

	
1469
    template <typename Value>
1470
    struct Identity {
1471
      typedef Value argument_type;
1472
      typedef Value result_type;
1473
      Value operator()(const Value& val) const {
1474
	return val;
1475
      }
1476
    };
1477

	
1478
    template <typename _Iterator, typename Enable = void>
1479
    struct IteratorTraits {
1480
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1481
    };
1482

	
1483
    template <typename _Iterator>
1484
    struct IteratorTraits<_Iterator,
1485
      typename exists<typename _Iterator::container_type>::type>
1486
    {
1487
      typedef typename _Iterator::container_type::value_type Value;
1488
    };
1489

	
1490
  }
1491

	
1492

	
1493
  /// \brief Writable bool map for logging each \c true assigned element
1494
  ///
1495
  /// A \ref concepts::ReadWriteMap "read-write" bool map for logging
1496
  /// each \c true assigned element, i.e it copies all the keys set
1497
  /// to \c true to the given iterator.
1498
  ///
1499
  /// \note The container of the iterator should contain space
1500
  /// for each element.
1501
  ///
1502
  /// The following example shows how you can write the edges found by
1503
  /// the \ref Prim algorithm directly to the standard output.
1504
  /// \code
1505
  ///   typedef IdMap<Graph, Edge> EdgeIdMap;
1506
  ///   EdgeIdMap edgeId(graph);
1507
  ///
1508
  ///   typedef MapToFunctor<EdgeIdMap> EdgeIdFunctor;
1509
  ///   EdgeIdFunctor edgeIdFunctor(edgeId);
1510
  ///
1511
  ///   StoreBoolMap<ostream_iterator<int>, EdgeIdFunctor>
1512
  ///     writerMap(ostream_iterator<int>(cout, " "), edgeIdFunctor);
1513
  ///
1514
  ///   prim(graph, cost, writerMap);
1515
  /// \endcode
1516
  ///
1517
  /// \sa BackInserterBoolMap
1518
  /// \sa FrontInserterBoolMap
1519
  /// \sa InserterBoolMap
1520
  ///
1521
  /// \todo Revise the name of this class and the related ones.
1522
  template <typename _Iterator,
1523
            typename _Functor =
1524
            _maps_bits::Identity<typename _maps_bits::
1525
                                 IteratorTraits<_Iterator>::Value> >
1526
  class StoreBoolMap {
1527
  public:
1528
    typedef _Iterator Iterator;
1529

	
1530
    typedef typename _Functor::argument_type Key;
1531
    typedef bool Value;
1532

	
1533
    typedef _Functor Functor;
1534

	
1535
    /// Constructor
1536
    StoreBoolMap(Iterator it, const Functor& functor = Functor())
1537
      : _begin(it), _end(it), _functor(functor) {}
1538

	
1539
    /// Gives back the given iterator set for the first key
1540
    Iterator begin() const {
1541
      return _begin;
1542
    }
1543

	
1544
    /// Gives back the the 'after the last' iterator
1545
    Iterator end() const {
1546
      return _end;
1547
    }
1548

	
1549
    /// The set function of the map
1550
    void set(const Key& key, Value value) const {
1551
      if (value) {
1552
	*_end++ = _functor(key);
1553
      }
1554
    }
1555

	
1556
  private:
1557
    Iterator _begin;
1558
    mutable Iterator _end;
1559
    Functor _functor;
1560
  };
1561

	
1562
  /// \brief Writable bool map for logging each \c true assigned element in
1563
  /// a back insertable container.
1564
  ///
1565
  /// Writable bool map for logging each \c true assigned element by pushing
1566
  /// them into a back insertable container.
1567
  /// It can be used to retrieve the items into a standard
1568
  /// container. The next example shows how you can store the
1569
  /// edges found by the Prim algorithm in a vector.
1570
  ///
1571
  /// \code
1572
  ///   vector<Edge> span_tree_edges;
1573
  ///   BackInserterBoolMap<vector<Edge> > inserter_map(span_tree_edges);
1574
  ///   prim(graph, cost, inserter_map);
1575
  /// \endcode
1576
  ///
1577
  /// \sa StoreBoolMap
1578
  /// \sa FrontInserterBoolMap
1579
  /// \sa InserterBoolMap
1580
  template <typename Container,
1581
            typename Functor =
1582
            _maps_bits::Identity<typename Container::value_type> >
1583
  class BackInserterBoolMap {
1584
  public:
1585
    typedef typename Functor::argument_type Key;
1586
    typedef bool Value;
1587

	
1588
    /// Constructor
1589
    BackInserterBoolMap(Container& _container,
1590
                        const Functor& _functor = Functor())
1591
      : container(_container), functor(_functor) {}
1592

	
1593
    /// The set function of the map
1594
    void set(const Key& key, Value value) {
1595
      if (value) {
1596
	container.push_back(functor(key));
1597
      }
1598
    }
1599

	
1600
  private:
1601
    Container& container;
1602
    Functor functor;
1603
  };
1604

	
1605
  /// \brief Writable bool map for logging each \c true assigned element in
1606
  /// a front insertable container.
1607
  ///
1608
  /// Writable bool map for logging each \c true assigned element by pushing
1609
  /// them into a front insertable container.
1610
  /// It can be used to retrieve the items into a standard
1611
  /// container. For example see \ref BackInserterBoolMap.
1612
  ///
1613
  /// \sa BackInserterBoolMap
1614
  /// \sa InserterBoolMap
1615
  template <typename Container,
1616
            typename Functor =
1617
            _maps_bits::Identity<typename Container::value_type> >
1618
  class FrontInserterBoolMap {
1619
  public:
1620
    typedef typename Functor::argument_type Key;
1621
    typedef bool Value;
1622

	
1623
    /// Constructor
1624
    FrontInserterBoolMap(Container& _container,
1625
                         const Functor& _functor = Functor())
1626
      : container(_container), functor(_functor) {}
1627

	
1628
    /// The set function of the map
1629
    void set(const Key& key, Value value) {
1630
      if (value) {
1631
	container.push_front(functor(key));
1632
      }
1633
    }
1634

	
1635
  private:
1636
    Container& container;
1637
    Functor functor;
1638
  };
1639

	
1640
  /// \brief Writable bool map for storing each \c true assigned element in
1641
  /// an insertable container.
1642
  ///
1643
  /// Writable bool map for storing each \c true assigned element in an
1644
  /// insertable container. It will insert all the keys set to \c true into
1645
  /// the container.
1646
  ///
1647
  /// For example, if you want to store the cut arcs of the strongly
1648
  /// connected components in a set you can use the next code:
1649
  ///
1650
  /// \code
1651
  ///   set<Arc> cut_arcs;
1652
  ///   InserterBoolMap<set<Arc> > inserter_map(cut_arcs);
1653
  ///   stronglyConnectedCutArcs(digraph, cost, inserter_map);
1654
  /// \endcode
1655
  ///
1656
  /// \sa BackInserterBoolMap
1657
  /// \sa FrontInserterBoolMap
1658
  template <typename Container,
1659
            typename Functor =
1660
            _maps_bits::Identity<typename Container::value_type> >
1661
  class InserterBoolMap {
1662
  public:
1663
    typedef typename Container::value_type Key;
1664
    typedef bool Value;
1665

	
1666
    /// Constructor with specified iterator
1667

	
1668
    /// Constructor with specified iterator.
1669
    /// \param _container The container for storing the elements.
1670
    /// \param _it The elements will be inserted before this iterator.
1671
    /// \param _functor The functor that is used when an element is stored.
1672
    InserterBoolMap(Container& _container, typename Container::iterator _it,
1673
                    const Functor& _functor = Functor())
1674
      : container(_container), it(_it), functor(_functor) {}
1675

	
1676
    /// Constructor
1677

	
1678
    /// Constructor without specified iterator.
1679
    /// The elements will be inserted before <tt>_container.end()</tt>.
1680
    /// \param _container The container for storing the elements.
1681
    /// \param _functor The functor that is used when an element is stored.
1682
    InserterBoolMap(Container& _container, const Functor& _functor = Functor())
1683
      : container(_container), it(_container.end()), functor(_functor) {}
1684

	
1685
    /// The set function of the map
1686
    void set(const Key& key, Value value) {
1687
      if (value) {
1688
	it = container.insert(it, functor(key));
1689
        ++it;
1690
      }
1691
    }
1692

	
1693
  private:
1694
    Container& container;
1695
    typename Container::iterator it;
1696
    Functor functor;
1697
  };
1698

	
1699
  /// \brief Writable bool map for filling each \c true assigned element with a
1700
  /// given value.
1701
  ///
1702
  /// Writable bool map for filling each \c true assigned element with a
1703
  /// given value. The value can set the container.
1704
  ///
1705
  /// The following code finds the connected components of a graph
1706
  /// and stores it in the \c comp map:
1707
  /// \code
1708
  ///   typedef Graph::NodeMap<int> ComponentMap;
1709
  ///   ComponentMap comp(graph);
1710
  ///   typedef FillBoolMap<Graph::NodeMap<int> > ComponentFillerMap;
1711
  ///   ComponentFillerMap filler(comp, 0);
1712
  ///
1713
  ///   Dfs<Graph>::DefProcessedMap<ComponentFillerMap>::Create dfs(graph);
1714
  ///   dfs.processedMap(filler);
1715
  ///   dfs.init();
1716
  ///   for (NodeIt it(graph); it != INVALID; ++it) {
1717
  ///     if (!dfs.reached(it)) {
1718
  ///       dfs.addSource(it);
1719
  ///       dfs.start();
1720
  ///       ++filler.fillValue();
1721
  ///     }
1722
  ///   }
1723
  /// \endcode
1724
  template <typename Map>
1725
  class FillBoolMap {
1726
  public:
1727
    typedef typename Map::Key Key;
1728
    typedef bool Value;
1729

	
1730
    /// Constructor
1731
    FillBoolMap(Map& _map, const typename Map::Value& _fill)
1732
      : map(_map), fill(_fill) {}
1733

	
1734
    /// Constructor
1735
    FillBoolMap(Map& _map)
1736
      : map(_map), fill() {}
1737

	
1738
    /// Gives back the current fill value
1739
    const typename Map::Value& fillValue() const {
1740
      return fill;
1741
    }
1742

	
1743
    /// Gives back the current fill value
1744
    typename Map::Value& fillValue() {
1745
      return fill;
1746
    }
1747

	
1748
    /// Sets the current fill value
1749
    void fillValue(const typename Map::Value& _fill) {
1750
      fill = _fill;
1751
    }
1752

	
1753
    /// The set function of the map
1754
    void set(const Key& key, Value value) {
1755
      if (value) {
1756
	map.set(key, fill);
1757
      }
1758
    }
1759

	
1760
  private:
1761
    Map& map;
1762
    typename Map::Value fill;
1763
  };
1764

	
1765

	
1766
  /// \brief Writable bool map for storing the sequence number of
1767
  /// \c true assignments.
1768
  ///
1769
  /// Writable bool map that stores for each \c true assigned elements
1770
  /// the sequence number of this setting.
1771
  /// It makes it easy to calculate the leaving
1772
  /// order of the nodes in the \ref Dfs algorithm.
1773
  ///
1774
  /// \code
1775
  ///   typedef Digraph::NodeMap<int> OrderMap;
1776
  ///   OrderMap order(digraph);
1777
  ///   typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
1778
  ///   OrderSetterMap setter(order);
1779
  ///   Dfs<Digraph>::DefProcessedMap<OrderSetterMap>::Create dfs(digraph);
1780
  ///   dfs.processedMap(setter);
1781
  ///   dfs.init();
1782
  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
1783
  ///     if (!dfs.reached(it)) {
1784
  ///       dfs.addSource(it);
1785
  ///       dfs.start();
1786
  ///     }
1787
  ///   }
1788
  /// \endcode
1789
  ///
1790
  /// The storing of the discovering order is more difficult because the
1791
  /// ReachedMap should be readable in the dfs algorithm but the setting
1792
  /// order map is not readable. Thus we must use the fork map:
1793
  ///
1794
  /// \code
1795
  ///   typedef Digraph::NodeMap<int> OrderMap;
1796
  ///   OrderMap order(digraph);
1797
  ///   typedef SettingOrderBoolMap<OrderMap> OrderSetterMap;
1798
  ///   OrderSetterMap setter(order);
1799
  ///   typedef Digraph::NodeMap<bool> StoreMap;
1800
  ///   StoreMap store(digraph);
1801
  ///
1802
  ///   typedef ForkMap<StoreMap, OrderSetterMap> ReachedMap;
1803
  ///   ReachedMap reached(store, setter);
1804
  ///
1805
  ///   Dfs<Digraph>::DefReachedMap<ReachedMap>::Create dfs(digraph);
1806
  ///   dfs.reachedMap(reached);
1807
  ///   dfs.init();
1808
  ///   for (NodeIt it(digraph); it != INVALID; ++it) {
1809
  ///     if (!dfs.reached(it)) {
1810
  ///       dfs.addSource(it);
1811
  ///       dfs.start();
1812
  ///     }
1813
  ///   }
1814
  /// \endcode
1815
  template <typename Map>
1816
  class SettingOrderBoolMap {
1817
  public:
1818
    typedef typename Map::Key Key;
1819
    typedef bool Value;
1820

	
1821
    /// Constructor
1822
    SettingOrderBoolMap(Map& _map)
1823
      : map(_map), counter(0) {}
1824

	
1825
    /// Number of set operations.
1826
    int num() const {
1827
      return counter;
1828
    }
1829

	
1830
    /// The set function of the map
1831
    void set(const Key& key, Value value) {
1832
      if (value) {
1833
	map.set(key, counter++);
1834
      }
1835
    }
1836

	
1837
  private:
1838
    Map& map;
1839
    int counter;
1840
  };
1841

	
1842 1394
  /// @}
1843 1395
}
1844 1396

	
1845 1397
#endif // LEMON_MAPS_H
0 comments (0 inline)