1 2 // (C) Copyright Francois Faure, iMAGIS-GRAVIR / UJF, 2001. 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See 5 // accompanying file LICENSE_1_0.txt or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 // 8 // Revision History: 9 // 03 May 2001 Jeremy Siek 10 // Generalized the property map iterator and moved that 11 // part to boost/property_map.hpp. Also modified to 12 // differentiate between const/mutable graphs and 13 // added a workaround to avoid partial specialization. 14 15 // 02 May 2001 Francois Faure 16 // Initial version. 17 18 #ifndef BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP 19 #define BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP 20 21 #include <boost/property_map/property_map_iterator.hpp> 22 #include <boost/graph/properties.hpp> 23 #include <boost/mpl/if.hpp> 24 #include <boost/type_traits/same_traits.hpp> 25 26 namespace boost { 27 28 //====================================================================== 29 // graph property iterator range 30 31 template <class Graph, class PropertyTag> 32 class graph_property_iter_range { 33 typedef typename property_map<Graph, PropertyTag>::type map_type; 34 typedef typename property_map<Graph, PropertyTag>::const_type 35 const_map_type; 36 typedef typename property_kind<PropertyTag>::type Kind; 37 typedef typename mpl::if_c<is_same<Kind, vertex_property_tag>::value, 38 typename graph_traits<Graph>::vertex_iterator, 39 typename graph_traits<Graph>::edge_iterator>::type iter; 40 public: 41 typedef typename property_map_iterator_generator<map_type, iter>::type 42 iterator; 43 typedef typename property_map_iterator_generator<const_map_type, iter> 44 ::type const_iterator; 45 typedef std::pair<iterator, iterator> type; 46 typedef std::pair<const_iterator, const_iterator> const_type; 47 }; 48 49 namespace detail { 50 51 template<class Graph,class Tag> 52 typename graph_property_iter_range<Graph,Tag>::type get_property_iter_range_kind(Graph & graph,const Tag & tag,const vertex_property_tag &)53 get_property_iter_range_kind(Graph& graph, const Tag& tag, 54 const vertex_property_tag& ) 55 { 56 typedef typename graph_property_iter_range<Graph,Tag>::iterator iter; 57 return std::make_pair(iter(vertices(graph).first, get(tag, graph)), 58 iter(vertices(graph).second, get(tag, graph))); 59 } 60 61 template<class Graph,class Tag> 62 typename graph_property_iter_range<Graph,Tag>::const_type get_property_iter_range_kind(const Graph & graph,const Tag & tag,const vertex_property_tag &)63 get_property_iter_range_kind(const Graph& graph, const Tag& tag, 64 const vertex_property_tag& ) 65 { 66 typedef typename graph_property_iter_range<Graph,Tag> 67 ::const_iterator iter; 68 return std::make_pair(iter(vertices(graph).first, get(tag, graph)), 69 iter(vertices(graph).second, get(tag, graph))); 70 } 71 72 73 template<class Graph,class Tag> 74 typename graph_property_iter_range<Graph,Tag>::type get_property_iter_range_kind(Graph & graph,const Tag & tag,const edge_property_tag &)75 get_property_iter_range_kind(Graph& graph, const Tag& tag, 76 const edge_property_tag& ) 77 { 78 typedef typename graph_property_iter_range<Graph,Tag>::iterator iter; 79 return std::make_pair(iter(edges(graph).first, get(tag, graph)), 80 iter(edges(graph).second, get(tag, graph))); 81 } 82 83 template<class Graph,class Tag> 84 typename graph_property_iter_range<Graph,Tag>::const_type get_property_iter_range_kind(const Graph & graph,const Tag & tag,const edge_property_tag &)85 get_property_iter_range_kind(const Graph& graph, const Tag& tag, 86 const edge_property_tag& ) 87 { 88 typedef typename graph_property_iter_range<Graph,Tag> 89 ::const_iterator iter; 90 return std::make_pair(iter(edges(graph).first, get(tag, graph)), 91 iter(edges(graph).second, get(tag, graph))); 92 } 93 94 } // namespace detail 95 96 //====================================================================== 97 // get an iterator range of properties 98 99 template<class Graph, class Tag> 100 typename graph_property_iter_range<Graph, Tag>::type get_property_iter_range(Graph & graph,const Tag & tag)101 get_property_iter_range(Graph& graph, const Tag& tag) 102 { 103 typedef typename property_kind<Tag>::type Kind; 104 return detail::get_property_iter_range_kind(graph, tag, Kind()); 105 } 106 107 template<class Graph, class Tag> 108 typename graph_property_iter_range<Graph, Tag>::const_type get_property_iter_range(const Graph & graph,const Tag & tag)109 get_property_iter_range(const Graph& graph, const Tag& tag) 110 { 111 typedef typename property_kind<Tag>::type Kind; 112 return detail::get_property_iter_range_kind(graph, tag, Kind()); 113 } 114 115 } // namespace boost 116 117 118 #endif // BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP 119