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 #ifndef BOOST_PROPERTY_MAP_ITERATOR_HPP
8 #define BOOST_PROPERTY_MAP_ITERATOR_HPP
10 #include <boost/property_map.hpp>
11 #include <boost/iterator_adaptors.hpp>
15 //======================================================================
16 // property iterator, generalized from ideas by François Faure
20 template <class LvaluePropertyMap>
21 struct lvalue_pmap_iter_policies : public default_iterator_policies
23 lvalue_pmap_iter_policies() { }
24 lvalue_pmap_iter_policies(LvaluePropertyMap m) : m_map(m) {}
27 typename Iter::reference
28 dereference(const Iter& i) const
30 return m_map[*i.base()];
33 LvaluePropertyMap m_map;
36 template <class ReadablePropertyMap>
37 struct readable_pmap_iter_policies : public default_iterator_policies
39 readable_pmap_iter_policies() { }
40 readable_pmap_iter_policies(ReadablePropertyMap m) : m_map(m) {}
43 typename Iter::reference
44 dereference(const Iter& i) const
46 return get(m_map, *i.base());
49 ReadablePropertyMap m_map;
52 template <class PMapCategory>
53 struct choose_pmap_iter {
54 template <class PMap, class Iter>
56 typedef typename property_traits<PMap>::value_type value;
57 typedef iterator_adaptor<Iter,
58 readable_pmap_iter_policies<PMap>, value, value,
59 value*, std::input_iterator_tag> type;
64 struct choose_pmap_iter<lvalue_property_map_tag> {
65 template <class PMap, class Iter>
67 typedef typename property_traits<PMap>::value_type value;
68 typedef typename property_traits<PMap>::reference ref;
69 typedef iterator_adaptor<Iter,
70 lvalue_pmap_iter_policies<PMap>,
77 template <class PropertyMap, class Iterator>
78 class property_map_iterator_generator {
80 typedef typename property_traits<PropertyMap>::category Cat;
81 typedef typename detail::choose_pmap_iter<Cat>::
82 template bind_<PropertyMap, Iterator>::type type;
85 template <class PropertyMap, class Iterator>
86 typename property_map_iterator_generator<PropertyMap, Iterator>::type
87 make_property_map_iterator(PropertyMap pmap, Iterator iter)
89 typedef typename property_map_iterator_generator<PropertyMap,
91 return Iter(iter, pmap);
96 #endif // BOOST_PROPERTY_MAP_ITERATOR_HPP