... |
... |
@@ -1691,96 +1691,96 @@
|
1691 |
1691 |
/// \brief Writable bool map for logging each \c true assigned element
|
1692 |
1692 |
///
|
1693 |
1693 |
/// A \ref concepts::WriteMap "writable" bool map for logging
|
1694 |
1694 |
/// each \c true assigned element, i.e it copies subsequently each
|
1695 |
1695 |
/// keys set to \c true to the given iterator.
|
1696 |
1696 |
/// The most important usage of it is storing certain nodes or arcs
|
1697 |
1697 |
/// that were marked \c true by an algorithm.
|
1698 |
1698 |
///
|
1699 |
1699 |
/// There are several algorithms that provide solutions through bool
|
1700 |
1700 |
/// maps and most of them assign \c true at most once for each key.
|
1701 |
1701 |
/// In these cases it is a natural request to store each \c true
|
1702 |
1702 |
/// assigned elements (in order of the assignment), which can be
|
1703 |
|
/// easily done with StoreBoolMap.
|
|
1703 |
/// easily done with LoggerBoolMap.
|
1704 |
1704 |
///
|
1705 |
|
/// The simplest way of using this map is through the storeBoolMap()
|
|
1705 |
/// The simplest way of using this map is through the loggerBoolMap()
|
1706 |
1706 |
/// function.
|
1707 |
1707 |
///
|
1708 |
1708 |
/// \tparam It The type of the iterator.
|
1709 |
1709 |
/// \tparam Ke The key type of the map. The default value set
|
1710 |
1710 |
/// according to the iterator type should work in most cases.
|
1711 |
1711 |
///
|
1712 |
1712 |
/// \note The container of the iterator must contain enough space
|
1713 |
1713 |
/// for the elements or the iterator should be an inserter iterator.
|
1714 |
1714 |
#ifdef DOXYGEN
|
1715 |
1715 |
template <typename It, typename Ke>
|
1716 |
1716 |
#else
|
1717 |
1717 |
template <typename It,
|
1718 |
1718 |
typename Ke=typename _maps_bits::IteratorTraits<It>::Value>
|
1719 |
1719 |
#endif
|
1720 |
|
class StoreBoolMap {
|
|
1720 |
class LoggerBoolMap {
|
1721 |
1721 |
public:
|
1722 |
1722 |
typedef It Iterator;
|
1723 |
1723 |
|
1724 |
1724 |
typedef Ke Key;
|
1725 |
1725 |
typedef bool Value;
|
1726 |
1726 |
|
1727 |
1727 |
/// Constructor
|
1728 |
|
StoreBoolMap(Iterator it)
|
|
1728 |
LoggerBoolMap(Iterator it)
|
1729 |
1729 |
: _begin(it), _end(it) {}
|
1730 |
1730 |
|
1731 |
1731 |
/// Gives back the given iterator set for the first key
|
1732 |
1732 |
Iterator begin() const {
|
1733 |
1733 |
return _begin;
|
1734 |
1734 |
}
|
1735 |
1735 |
|
1736 |
1736 |
/// Gives back the the 'after the last' iterator
|
1737 |
1737 |
Iterator end() const {
|
1738 |
1738 |
return _end;
|
1739 |
1739 |
}
|
1740 |
1740 |
|
1741 |
1741 |
/// The set function of the map
|
1742 |
1742 |
void set(const Key& key, Value value) {
|
1743 |
1743 |
if (value) {
|
1744 |
1744 |
*_end++ = key;
|
1745 |
1745 |
}
|
1746 |
1746 |
}
|
1747 |
1747 |
|
1748 |
1748 |
private:
|
1749 |
1749 |
Iterator _begin;
|
1750 |
1750 |
Iterator _end;
|
1751 |
1751 |
};
|
1752 |
1752 |
|
1753 |
|
/// Returns a \ref StoreBoolMap class
|
|
1753 |
/// Returns a \ref LoggerBoolMap class
|
1754 |
1754 |
|
1755 |
|
/// This function just returns a \ref StoreBoolMap class.
|
|
1755 |
/// This function just returns a \ref LoggerBoolMap class.
|
1756 |
1756 |
///
|
1757 |
1757 |
/// The most important usage of it is storing certain nodes or arcs
|
1758 |
1758 |
/// that were marked \c true by an algorithm.
|
1759 |
1759 |
/// For example it makes easier to store the nodes in the processing
|
1760 |
1760 |
/// order of Dfs algorithm, as the following examples show.
|
1761 |
1761 |
/// \code
|
1762 |
1762 |
/// std::vector<Node> v;
|
1763 |
|
/// dfs(g,s).processedMap(storeBoolMap(std::back_inserter(v))).run();
|
|
1763 |
/// dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
|
1764 |
1764 |
/// \endcode
|
1765 |
1765 |
/// \code
|
1766 |
1766 |
/// std::vector<Node> v(countNodes(g));
|
1767 |
|
/// dfs(g,s).processedMap(storeBoolMap(v.begin())).run();
|
|
1767 |
/// dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
|
1768 |
1768 |
/// \endcode
|
1769 |
1769 |
///
|
1770 |
1770 |
/// \note The container of the iterator must contain enough space
|
1771 |
1771 |
/// for the elements or the iterator should be an inserter iterator.
|
1772 |
1772 |
///
|
1773 |
|
/// \note StoreBoolMap is just \ref concepts::WriteMap "writable", so
|
|
1773 |
/// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
|
1774 |
1774 |
/// it cannot be used when a readable map is needed, for example as
|
1775 |
|
/// \c ReachedMap for Bfs, Dfs and Dijkstra algorithms.
|
|
1775 |
/// \c ReachedMap for \ref Bfs, \ref Dfs and \ref Dijkstra algorithms.
|
1776 |
1776 |
///
|
1777 |
|
/// \relates StoreBoolMap
|
|
1777 |
/// \relates LoggerBoolMap
|
1778 |
1778 |
template<typename Iterator>
|
1779 |
|
inline StoreBoolMap<Iterator> storeBoolMap(Iterator it) {
|
1780 |
|
return StoreBoolMap<Iterator>(it);
|
|
1779 |
inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
|
|
1780 |
return LoggerBoolMap<Iterator>(it);
|
1781 |
1781 |
}
|
1782 |
1782 |
|
1783 |
1783 |
/// @}
|
1784 |
1784 |
}
|
1785 |
1785 |
|
1786 |
1786 |
#endif // LEMON_MAPS_H
|