williamr@2: williamr@2: // (C) Copyright François Faure, iMAGIS-GRAVIR / UJF, 2001. williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // Revision History: williamr@2: // 03 May 2001 Jeremy Siek williamr@2: // Generalized the property map iterator and moved that williamr@2: // part to boost/property_map.hpp. Also modified to williamr@2: // differentiate between const/mutable graphs and williamr@2: // added a workaround to avoid partial specialization. williamr@2: williamr@2: // 02 May 2001 François Faure williamr@2: // Initial version. williamr@2: williamr@2: #ifndef BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP williamr@2: #define BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: //====================================================================== williamr@2: // graph property iterator range williamr@2: williamr@2: template williamr@2: class graph_property_iter_range { williamr@2: typedef typename property_map::type map_type; williamr@2: typedef typename property_map::const_type williamr@2: const_map_type; williamr@2: typedef typename property_kind::type Kind; williamr@2: typedef typename ct_if::value, williamr@2: typename graph_traits::vertex_iterator, williamr@2: typename graph_traits::edge_iterator>::type iter; williamr@2: public: williamr@2: typedef typename property_map_iterator_generator::type williamr@2: iterator; williamr@2: typedef typename property_map_iterator_generator williamr@2: ::type const_iterator; williamr@2: typedef std::pair type; williamr@2: typedef std::pair const_type; williamr@2: }; williamr@2: williamr@2: namespace detail { williamr@2: williamr@2: template williamr@2: typename graph_property_iter_range::type williamr@2: get_property_iter_range_kind(Graph& graph, const Tag& tag, williamr@2: const vertex_property_tag& ) williamr@2: { williamr@2: typedef typename graph_property_iter_range::iterator iter; williamr@2: return std::make_pair(iter(vertices(graph).first, get(tag, graph)), williamr@2: iter(vertices(graph).second, get(tag, graph))); williamr@2: } williamr@2: williamr@2: template williamr@2: typename graph_property_iter_range::const_type williamr@2: get_property_iter_range_kind(const Graph& graph, const Tag& tag, williamr@2: const vertex_property_tag& ) williamr@2: { williamr@2: typedef typename graph_property_iter_range williamr@2: ::const_iterator iter; williamr@2: return std::make_pair(iter(vertices(graph).first, get(tag, graph)), williamr@2: iter(vertices(graph).second, get(tag, graph))); williamr@2: } williamr@2: williamr@2: williamr@2: template williamr@2: typename graph_property_iter_range::type williamr@2: get_property_iter_range_kind(Graph& graph, const Tag& tag, williamr@2: const edge_property_tag& ) williamr@2: { williamr@2: typedef typename graph_property_iter_range::iterator iter; williamr@2: return std::make_pair(iter(edges(graph).first, get(tag, graph)), williamr@2: iter(edges(graph).second, get(tag, graph))); williamr@2: } williamr@2: williamr@2: template williamr@2: typename graph_property_iter_range::const_type williamr@2: get_property_iter_range_kind(const Graph& graph, const Tag& tag, williamr@2: const edge_property_tag& ) williamr@2: { williamr@2: typedef typename graph_property_iter_range williamr@2: ::const_iterator iter; williamr@2: return std::make_pair(iter(edges(graph).first, get(tag, graph)), williamr@2: iter(edges(graph).second, get(tag, graph))); williamr@2: } williamr@2: williamr@2: } // namespace detail williamr@2: williamr@2: //====================================================================== williamr@2: // get an iterator range of properties williamr@2: williamr@2: template williamr@2: typename graph_property_iter_range::type williamr@2: get_property_iter_range(Graph& graph, const Tag& tag) williamr@2: { williamr@2: typedef typename property_kind::type Kind; williamr@2: return detail::get_property_iter_range_kind(graph, tag, Kind()); williamr@2: } williamr@2: williamr@2: template williamr@2: typename graph_property_iter_range::const_type williamr@2: get_property_iter_range(const Graph& graph, const Tag& tag) williamr@2: { williamr@2: typedef typename property_kind::type Kind; williamr@2: return detail::get_property_iter_range_kind(graph, tag, Kind()); williamr@2: } williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: williamr@2: #endif // BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP