Chris@16: Chris@16: // (C) Copyright Francois Faure, iMAGIS-GRAVIR / UJF, 2001. Chris@16: // 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: // Revision History: Chris@16: // 03 May 2001 Jeremy Siek Chris@16: // Generalized the property map iterator and moved that Chris@16: // part to boost/property_map.hpp. Also modified to Chris@16: // differentiate between const/mutable graphs and Chris@16: // added a workaround to avoid partial specialization. Chris@16: Chris@16: // 02 May 2001 Francois Faure Chris@16: // Initial version. Chris@16: Chris@16: #ifndef BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP Chris@16: #define BOOST_GRAPH_PROPERTY_ITER_RANGE_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: // graph property iterator range Chris@16: Chris@16: template Chris@16: class graph_property_iter_range { Chris@16: typedef typename property_map::type map_type; Chris@16: typedef typename property_map::const_type Chris@16: const_map_type; Chris@16: typedef typename property_kind::type Kind; Chris@16: typedef typename mpl::if_c::value, Chris@16: typename graph_traits::vertex_iterator, Chris@16: typename graph_traits::edge_iterator>::type iter; Chris@16: public: Chris@16: typedef typename property_map_iterator_generator::type Chris@16: iterator; Chris@16: typedef typename property_map_iterator_generator Chris@16: ::type const_iterator; Chris@16: typedef std::pair type; Chris@16: typedef std::pair const_type; Chris@16: }; Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: typename graph_property_iter_range::type Chris@16: get_property_iter_range_kind(Graph& graph, const Tag& tag, Chris@16: const vertex_property_tag& ) Chris@16: { Chris@16: typedef typename graph_property_iter_range::iterator iter; Chris@16: return std::make_pair(iter(vertices(graph).first, get(tag, graph)), Chris@16: iter(vertices(graph).second, get(tag, graph))); Chris@16: } Chris@16: Chris@16: template Chris@16: typename graph_property_iter_range::const_type Chris@16: get_property_iter_range_kind(const Graph& graph, const Tag& tag, Chris@16: const vertex_property_tag& ) Chris@16: { Chris@16: typedef typename graph_property_iter_range Chris@16: ::const_iterator iter; Chris@16: return std::make_pair(iter(vertices(graph).first, get(tag, graph)), Chris@16: iter(vertices(graph).second, get(tag, graph))); Chris@16: } Chris@16: Chris@16: Chris@16: template Chris@16: typename graph_property_iter_range::type Chris@16: get_property_iter_range_kind(Graph& graph, const Tag& tag, Chris@16: const edge_property_tag& ) Chris@16: { Chris@16: typedef typename graph_property_iter_range::iterator iter; Chris@16: return std::make_pair(iter(edges(graph).first, get(tag, graph)), Chris@16: iter(edges(graph).second, get(tag, graph))); Chris@16: } Chris@16: Chris@16: template Chris@16: typename graph_property_iter_range::const_type Chris@16: get_property_iter_range_kind(const Graph& graph, const Tag& tag, Chris@16: const edge_property_tag& ) Chris@16: { Chris@16: typedef typename graph_property_iter_range Chris@16: ::const_iterator iter; Chris@16: return std::make_pair(iter(edges(graph).first, get(tag, graph)), Chris@16: iter(edges(graph).second, get(tag, graph))); Chris@16: } Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: //====================================================================== Chris@16: // get an iterator range of properties Chris@16: Chris@16: template Chris@16: typename graph_property_iter_range::type Chris@16: get_property_iter_range(Graph& graph, const Tag& tag) Chris@16: { Chris@16: typedef typename property_kind::type Kind; Chris@16: return detail::get_property_iter_range_kind(graph, tag, Kind()); Chris@16: } Chris@16: Chris@16: template Chris@16: typename graph_property_iter_range::const_type Chris@16: get_property_iter_range(const Graph& graph, const Tag& tag) Chris@16: { Chris@16: typedef typename property_kind::type Kind; Chris@16: return detail::get_property_iter_range_kind(graph, tag, Kind()); Chris@16: } Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: #endif // BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP