You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
113 lines
3.8 KiB
113 lines
3.8 KiB
// (C) Copyright Jeremy Siek, 2001. |
|
// Distributed under the Boost Software License, Version 1.0. (See |
|
// accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
// See http://www.boost.org/libs/property_map for documentation. |
|
|
|
#ifndef BOOST_PROPERTY_MAP_ITERATOR_HPP |
|
#define BOOST_PROPERTY_MAP_ITERATOR_HPP |
|
|
|
#include <boost/property_map/property_map.hpp> |
|
#include <boost/iterator/iterator_adaptor.hpp> |
|
#include <boost/mpl/if.hpp> |
|
#include <boost/type_traits/is_same.hpp> |
|
|
|
namespace boost { |
|
|
|
//====================================================================== |
|
// property iterator, generalized from ideas by Francois Faure |
|
|
|
namespace detail { |
|
|
|
template <class Iterator, class LvaluePropertyMap> |
|
class lvalue_pmap_iter |
|
: public iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >, |
|
Iterator, |
|
typename property_traits<LvaluePropertyMap>::value_type, |
|
use_default, |
|
typename property_traits<LvaluePropertyMap>::reference> |
|
{ |
|
friend class boost::iterator_core_access; |
|
|
|
typedef iterator_adaptor< lvalue_pmap_iter< Iterator, LvaluePropertyMap >, |
|
Iterator, |
|
typename property_traits<LvaluePropertyMap>::value_type, |
|
use_default, |
|
typename property_traits<LvaluePropertyMap>::reference> super_t; |
|
|
|
public: |
|
lvalue_pmap_iter() { } |
|
lvalue_pmap_iter(Iterator const& it, |
|
LvaluePropertyMap m) |
|
: super_t(it), |
|
m_map(m) {} |
|
|
|
private: |
|
typename super_t::reference |
|
dereference() const |
|
{ |
|
return m_map[*(this->base_reference())]; |
|
} |
|
|
|
LvaluePropertyMap m_map; |
|
}; |
|
|
|
template <class Iterator, class ReadablePropertyMap> |
|
class readable_pmap_iter : |
|
public iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >, |
|
Iterator, |
|
typename property_traits<ReadablePropertyMap>::value_type, |
|
use_default, |
|
typename property_traits<ReadablePropertyMap>::value_type> |
|
|
|
|
|
{ |
|
friend class boost::iterator_core_access; |
|
|
|
typedef iterator_adaptor< readable_pmap_iter< Iterator, ReadablePropertyMap >, |
|
Iterator, |
|
typename property_traits<ReadablePropertyMap>::value_type, |
|
use_default, |
|
typename property_traits<ReadablePropertyMap>::value_type> super_t; |
|
|
|
public: |
|
readable_pmap_iter() { } |
|
readable_pmap_iter(Iterator const& it, |
|
ReadablePropertyMap m) |
|
: super_t(it), |
|
m_map(m) {} |
|
|
|
private: |
|
typename super_t::reference |
|
dereference() const |
|
{ |
|
return get(m_map, *(this->base_reference())); |
|
} |
|
|
|
ReadablePropertyMap m_map; |
|
}; |
|
|
|
|
|
} // namespace detail |
|
|
|
template <class PropertyMap, class Iterator> |
|
struct property_map_iterator_generator : |
|
mpl::if_< is_same< typename property_traits<PropertyMap>::category, lvalue_property_map_tag>, |
|
detail::lvalue_pmap_iter<Iterator, PropertyMap>, |
|
detail::readable_pmap_iter<Iterator, PropertyMap> > |
|
{}; |
|
|
|
template <class PropertyMap, class Iterator> |
|
typename property_map_iterator_generator<PropertyMap, Iterator>::type |
|
make_property_map_iterator(PropertyMap pmap, Iterator iter) |
|
{ |
|
typedef typename property_map_iterator_generator<PropertyMap, |
|
Iterator>::type Iter; |
|
return Iter(iter, pmap); |
|
} |
|
|
|
} // namespace boost |
|
|
|
#endif // BOOST_PROPERTY_MAP_ITERATOR_HPP |
|
|
|
|