Chris@16: // (C) Copyright Jeremy Siek, 2001. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/property_map for documentation. Chris@16: Chris@16: #ifndef BOOST_PROPERTY_MAP_ITERATOR_HPP Chris@16: #define BOOST_PROPERTY_MAP_ITERATOR_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: //====================================================================== Chris@16: // property iterator, generalized from ideas by Francois Faure Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: class lvalue_pmap_iter Chris@16: : public iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >, Chris@16: Iterator, Chris@16: typename property_traits::value_type, Chris@16: use_default, Chris@16: typename property_traits::reference> Chris@16: { Chris@16: friend class boost::iterator_core_access; Chris@16: Chris@16: typedef iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >, Chris@16: Iterator, Chris@16: typename property_traits::value_type, Chris@16: use_default, Chris@16: typename property_traits::reference> super_t; Chris@16: Chris@16: public: Chris@16: lvalue_pmap_iter() { } Chris@16: lvalue_pmap_iter(Iterator const& it, Chris@16: LvaluePropertyMap m) Chris@16: : super_t(it), Chris@16: m_map(m) {} Chris@16: Chris@16: private: Chris@16: typename super_t::reference Chris@16: dereference() const Chris@16: { Chris@16: return m_map[*(this->base_reference())]; Chris@16: } Chris@16: Chris@16: LvaluePropertyMap m_map; Chris@16: }; Chris@16: Chris@16: template Chris@16: class readable_pmap_iter : Chris@16: public iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >, Chris@16: Iterator, Chris@16: typename property_traits::value_type, Chris@16: use_default, Chris@16: typename property_traits::value_type> Chris@16: Chris@16: Chris@16: { Chris@16: friend class boost::iterator_core_access; Chris@16: Chris@16: typedef iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >, Chris@16: Iterator, Chris@16: typename property_traits::value_type, Chris@16: use_default, Chris@16: typename property_traits::value_type> super_t; Chris@16: Chris@16: public: Chris@16: readable_pmap_iter() { } Chris@16: readable_pmap_iter(Iterator const& it, Chris@16: ReadablePropertyMap m) Chris@16: : super_t(it), Chris@16: m_map(m) {} Chris@16: Chris@16: private: Chris@16: typename super_t::reference Chris@16: dereference() const Chris@16: { Chris@16: return get(m_map, *(this->base_reference())); Chris@16: } Chris@16: Chris@16: ReadablePropertyMap m_map; Chris@16: }; Chris@16: Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: template Chris@16: struct property_map_iterator_generator : Chris@16: mpl::if_< is_same< typename property_traits::category, lvalue_property_map_tag>, Chris@16: detail::lvalue_pmap_iter, Chris@16: detail::readable_pmap_iter > Chris@16: {}; Chris@16: Chris@16: template Chris@16: typename property_map_iterator_generator::type Chris@16: make_property_map_iterator(PropertyMap pmap, Iterator iter) Chris@16: { Chris@16: typedef typename property_map_iterator_generator::type Iter; Chris@16: return Iter(iter, pmap); Chris@16: } Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_PROPERTY_MAP_ITERATOR_HPP Chris@16: