Index: boost/property_map_iterator.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/property_map_iterator.hpp,v retrieving revision 1.4 diff -u -r1.4 property_map_iterator.hpp --- boost/property_map_iterator.hpp 27 Dec 2002 16:51:53 -0000 1.4 +++ boost/property_map_iterator.hpp 11 Dec 2003 18:27:14 -0000 @@ -10,89 +10,103 @@ #define BOOST_PROPERTY_MAP_ITERATOR_HPP #include -#include +#include +#include +#include namespace boost { - //====================================================================== - // property iterator, generalized from ideas by François Faure + //====================================================================== + // property iterator, generalized from ideas by François Faure - namespace detail { + namespace detail { - template - struct lvalue_pmap_iter_policies : public default_iterator_policies + template + class lvalue_pmap_iter + : public iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >, + Iterator, + typename property_traits::value_type, + use_default, + typename property_traits::reference> + { + friend class boost::iterator_core_access; + + typedef iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >, + Iterator, + typename property_traits::value_type, + use_default, + typename property_traits::reference> super_t; + + public: + lvalue_pmap_iter() { } + lvalue_pmap_iter(Iterator const& it, + LvaluePropertyMap m) + : super_t(it), + m_map(m) {} + + private: + typename lvalue_pmap_iter::reference + dereference() const + { + return m_map[*base_reference()]; + } + + LvaluePropertyMap m_map; + }; + + template + class readable_pmap_iter : + public iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >, + Iterator, + typename property_traits::value_type, + use_default, + typename property_traits::value_type> + + + { + friend class iterator_core_access; + + typedef iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >, + Iterator, + typename property_traits::value_type, + use_default, + typename property_traits::value_type> super_t; + + public: + readable_pmap_iter() { } + readable_pmap_iter(Iterator const& it, + ReadablePropertyMap m) + : super_t(it), + m_map(m) {} + + private: + typename readable_pmap_iter::reference + dereference() const + { + return get(m_map, *base_reference()); + } + + ReadablePropertyMap m_map; + }; + + + } // namespace detail + + + template + struct property_map_iterator_generator : + mpl::if_< is_same< typename property_traits::category, lvalue_property_map_tag>, + detail::lvalue_pmap_iter, + detail::readable_pmap_iter > + {}; + + template + typename property_map_iterator_generator::type + make_property_map_iterator(PropertyMap pmap, Iterator iter) { - lvalue_pmap_iter_policies() { } - lvalue_pmap_iter_policies(LvaluePropertyMap m) : m_map(m) {} - - template - typename Iter::reference - dereference(const Iter& i) const - { - return m_map[*i.base()]; - } - private: - LvaluePropertyMap m_map; - }; - - template - struct readable_pmap_iter_policies : public default_iterator_policies - { - readable_pmap_iter_policies() { } - readable_pmap_iter_policies(ReadablePropertyMap m) : m_map(m) {} - - template - typename Iter::reference - dereference(const Iter& i) const - { - return get(m_map, *i.base()); - } - private: - ReadablePropertyMap m_map; - }; - - template - struct choose_pmap_iter { - template - struct bind_ { - typedef typename property_traits::value_type value; - typedef iterator_adaptor, value, value, - value*, std::input_iterator_tag> type; - }; - }; - - template <> - struct choose_pmap_iter { - template - struct bind_ { - typedef typename property_traits::value_type value; - typedef typename property_traits::reference ref; - typedef iterator_adaptor, - value, ref> type; - }; - }; - - } // namespace detail - - template - class property_map_iterator_generator { - public: - typedef typename property_traits::category Cat; - typedef typename detail::choose_pmap_iter:: - template bind_::type type; - }; - - template - typename property_map_iterator_generator::type - make_property_map_iterator(PropertyMap pmap, Iterator iter) - { - typedef typename property_map_iterator_generator::type Iter; - return Iter(iter, pmap); - } - + typedef typename property_map_iterator_generator::type Iter; + return Iter(iter, pmap); + } } // namespace boost #endif // BOOST_PROPERTY_MAP_ITERATOR_HPP