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