Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/graph/property_iter_range.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
15:663ca0da4350 | 16:2665513ce2d3 |
---|---|
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 |