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 |
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 |
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 |
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 |
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 |
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 |
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 | |