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/iterator_adaptor.hpp>
14 #include <boost/mpl/if.hpp>
15 #include <boost/type_traits/is_same.hpp>
19 //======================================================================
20 // property iterator, generalized from ideas by François Faure
24 template <class Iterator, class LvaluePropertyMap>
25 class lvalue_pmap_iter
26 : public iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >,
28 typename property_traits<LvaluePropertyMap>::value_type,
30 typename property_traits<LvaluePropertyMap>::reference>
32 friend class boost::iterator_core_access;
34 typedef iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >,
36 typename property_traits<LvaluePropertyMap>::value_type,
38 typename property_traits<LvaluePropertyMap>::reference> super_t;
41 lvalue_pmap_iter() { }
42 lvalue_pmap_iter(Iterator const& it,
48 typename lvalue_pmap_iter::reference
51 return m_map[*(this->base_reference())];
54 LvaluePropertyMap m_map;
57 template <class Iterator, class ReadablePropertyMap>
58 class readable_pmap_iter :
59 public iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >,
61 typename property_traits<ReadablePropertyMap>::value_type,
63 typename property_traits<ReadablePropertyMap>::value_type>
67 friend class iterator_core_access;
69 typedef iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >,
71 typename property_traits<ReadablePropertyMap>::value_type,
73 typename property_traits<ReadablePropertyMap>::value_type> super_t;
76 readable_pmap_iter() { }
77 readable_pmap_iter(Iterator const& it,
78 ReadablePropertyMap m)
83 typename readable_pmap_iter::reference
86 return get(m_map, *(this->base_reference()));
89 ReadablePropertyMap m_map;
95 template <class PropertyMap, class Iterator>
96 struct property_map_iterator_generator :
97 mpl::if_< is_same< typename property_traits<PropertyMap>::category, lvalue_property_map_tag>,
98 detail::lvalue_pmap_iter<Iterator, PropertyMap>,
99 detail::readable_pmap_iter<Iterator, PropertyMap> >
102 template <class PropertyMap, class Iterator>
103 typename property_map_iterator_generator<PropertyMap, Iterator>::type
104 make_property_map_iterator(PropertyMap pmap, Iterator iter)
106 typedef typename property_map_iterator_generator<PropertyMap,
107 Iterator>::type Iter;
108 return Iter(iter, pmap);
113 #endif // BOOST_PROPERTY_MAP_ITERATOR_HPP