1 // (C) Copyright Jeremy Siek, 2001. Permission to copy, use, modify,
2 // sell and distribute this software is granted provided this
3 // copyright notice appears in all copies. This software is provided
4 // "as is" without express or implied warranty, and with no claim as
5 // to its suitability for any purpose.
7 // See http://www.boost.org/libs/property_map for documentation.
9 #ifndef BOOST_PROPERTY_MAP_ITERATOR_HPP
10 #define BOOST_PROPERTY_MAP_ITERATOR_HPP
12 #include <boost/property_map.hpp>
13 #include <boost/iterator_adaptors.hpp>
17 //======================================================================
18 // property iterator, generalized from ideas by François Faure
22 template <class LvaluePropertyMap>
23 struct lvalue_pmap_iter_policies : public default_iterator_policies
25 lvalue_pmap_iter_policies() { }
26 lvalue_pmap_iter_policies(LvaluePropertyMap m) : m_map(m) {}
29 typename Iter::reference
30 dereference(const Iter& i) const
32 return m_map[*i.base()];
35 LvaluePropertyMap m_map;
38 template <class ReadablePropertyMap>
39 struct readable_pmap_iter_policies : public default_iterator_policies
41 readable_pmap_iter_policies() { }
42 readable_pmap_iter_policies(ReadablePropertyMap m) : m_map(m) {}
45 typename Iter::reference
46 dereference(const Iter& i) const
48 return get(m_map, *i.base());
51 ReadablePropertyMap m_map;
54 template <class PMapCategory>
55 struct choose_pmap_iter {
56 template <class PMap, class Iter>
58 typedef typename property_traits<PMap>::value_type value;
59 typedef iterator_adaptor<Iter,
60 readable_pmap_iter_policies<PMap>, value, value,
61 value*, std::input_iterator_tag> type;
66 struct choose_pmap_iter<lvalue_property_map_tag> {
67 template <class PMap, class Iter>
69 typedef typename property_traits<PMap>::value_type value;
70 typedef typename property_traits<PMap>::reference ref;
71 typedef iterator_adaptor<Iter,
72 lvalue_pmap_iter_policies<PMap>,
79 template <class PropertyMap, class Iterator>
80 class property_map_iterator_generator {
82 typedef typename property_traits<PropertyMap>::category Cat;
83 typedef typename detail::choose_pmap_iter<Cat>::
84 template bind_<PropertyMap, Iterator>::type type;
87 template <class PropertyMap, class Iterator>
88 typename property_map_iterator_generator<PropertyMap, Iterator>::type
89 make_property_map_iterator(PropertyMap pmap, Iterator iter)
91 typedef typename property_map_iterator_generator<PropertyMap,
93 return Iter(iter, pmap);
98 #endif // BOOST_PROPERTY_MAP_ITERATOR_HPP