ossrv_pub/boost_apis/boost/property_map_iterator.hpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ossrv_pub/boost_apis/boost/property_map_iterator.hpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,113 @@
+// (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.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 François 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
+