Chris@16
|
1 // Copyright 2004 The Trustees of Indiana University.
|
Chris@16
|
2
|
Chris@16
|
3 // Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
5 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6
|
Chris@16
|
7 // Authors: Douglas Gregor
|
Chris@16
|
8 // Andrew Lumsdaine
|
Chris@16
|
9
|
Chris@16
|
10 #ifndef BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
|
Chris@16
|
11 #define BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/graph/graph_traits.hpp>
|
Chris@16
|
14 #include <iterator>
|
Chris@16
|
15
|
Chris@16
|
16 namespace boost {
|
Chris@16
|
17
|
Chris@16
|
18 namespace graph {
|
Chris@16
|
19 template<typename Graph, typename VertexIterator, typename EdgeIterator>
|
Chris@16
|
20 class vertex_and_edge_range
|
Chris@16
|
21 {
|
Chris@16
|
22 typedef graph_traits<Graph> traits_type;
|
Chris@16
|
23
|
Chris@16
|
24 public:
|
Chris@16
|
25 typedef typename traits_type::directed_category directed_category;
|
Chris@16
|
26 typedef typename traits_type::edge_parallel_category
|
Chris@16
|
27 edge_parallel_category;
|
Chris@16
|
28 struct traversal_category
|
Chris@16
|
29 : public virtual vertex_list_graph_tag,
|
Chris@16
|
30 public virtual edge_list_graph_tag { };
|
Chris@16
|
31
|
Chris@16
|
32 typedef std::size_t vertices_size_type;
|
Chris@16
|
33 typedef VertexIterator vertex_iterator;
|
Chris@16
|
34 typedef typename std::iterator_traits<VertexIterator>::value_type
|
Chris@16
|
35 vertex_descriptor;
|
Chris@16
|
36
|
Chris@16
|
37 typedef EdgeIterator edge_iterator;
|
Chris@16
|
38 typedef typename std::iterator_traits<EdgeIterator>::value_type
|
Chris@16
|
39 edge_descriptor;
|
Chris@16
|
40
|
Chris@16
|
41 typedef std::size_t edges_size_type;
|
Chris@16
|
42
|
Chris@16
|
43 typedef void adjacency_iterator;
|
Chris@16
|
44 typedef void out_edge_iterator;
|
Chris@16
|
45 typedef void in_edge_iterator;
|
Chris@16
|
46 typedef void degree_size_type;
|
Chris@16
|
47
|
Chris@16
|
48 static vertex_descriptor null_vertex()
|
Chris@16
|
49 { return traits_type::null_vertex(); }
|
Chris@16
|
50
|
Chris@16
|
51 vertex_and_edge_range(const Graph& g,
|
Chris@16
|
52 VertexIterator first_v, VertexIterator last_v,
|
Chris@16
|
53 vertices_size_type n,
|
Chris@16
|
54 EdgeIterator first_e, EdgeIterator last_e,
|
Chris@16
|
55 edges_size_type m)
|
Chris@16
|
56 : g(&g),
|
Chris@16
|
57 first_vertex(first_v), last_vertex(last_v), m_num_vertices(n),
|
Chris@16
|
58 first_edge(first_e), last_edge(last_e), m_num_edges(m)
|
Chris@16
|
59 {
|
Chris@16
|
60 }
|
Chris@16
|
61
|
Chris@16
|
62 vertex_and_edge_range(const Graph& g,
|
Chris@16
|
63 VertexIterator first_v, VertexIterator last_v,
|
Chris@16
|
64 EdgeIterator first_e, EdgeIterator last_e)
|
Chris@16
|
65 : g(&g),
|
Chris@16
|
66 first_vertex(first_v), last_vertex(last_v),
|
Chris@16
|
67 first_edge(first_e), last_edge(last_e)
|
Chris@16
|
68 {
|
Chris@16
|
69 m_num_vertices = std::distance(first_v, last_v);
|
Chris@16
|
70 m_num_edges = std::distance(first_e, last_e);
|
Chris@16
|
71 }
|
Chris@16
|
72
|
Chris@16
|
73 const Graph* g;
|
Chris@16
|
74 vertex_iterator first_vertex;
|
Chris@16
|
75 vertex_iterator last_vertex;
|
Chris@16
|
76 vertices_size_type m_num_vertices;
|
Chris@16
|
77 edge_iterator first_edge;
|
Chris@16
|
78 edge_iterator last_edge;
|
Chris@16
|
79 edges_size_type m_num_edges;
|
Chris@16
|
80 };
|
Chris@16
|
81
|
Chris@16
|
82 template<typename Graph, typename VertexIterator, typename EdgeIterator>
|
Chris@16
|
83 inline std::pair<VertexIterator, VertexIterator>
|
Chris@16
|
84 vertices(const vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>& g)
|
Chris@16
|
85 { return std::make_pair(g.first_vertex, g.last_vertex); }
|
Chris@16
|
86
|
Chris@16
|
87 template<typename Graph, typename VertexIterator, typename EdgeIterator>
|
Chris@16
|
88 inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
|
Chris@16
|
89 ::vertices_size_type
|
Chris@16
|
90 num_vertices(const vertex_and_edge_range<Graph, VertexIterator,
|
Chris@16
|
91 EdgeIterator>& g)
|
Chris@16
|
92 { return g.m_num_vertices; }
|
Chris@16
|
93
|
Chris@16
|
94 template<typename Graph, typename VertexIterator, typename EdgeIterator>
|
Chris@16
|
95 inline std::pair<EdgeIterator, EdgeIterator>
|
Chris@16
|
96 edges(const vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>& g)
|
Chris@16
|
97 { return std::make_pair(g.first_edge, g.last_edge); }
|
Chris@16
|
98
|
Chris@16
|
99 template<typename Graph, typename VertexIterator, typename EdgeIterator>
|
Chris@16
|
100 inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
|
Chris@16
|
101 ::edges_size_type
|
Chris@16
|
102 num_edges(const vertex_and_edge_range<Graph, VertexIterator,
|
Chris@16
|
103 EdgeIterator>& g)
|
Chris@16
|
104 { return g.m_num_edges; }
|
Chris@16
|
105
|
Chris@16
|
106 template<typename Graph, typename VertexIterator, typename EdgeIterator>
|
Chris@16
|
107 inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
|
Chris@16
|
108 ::vertex_descriptor
|
Chris@16
|
109 source(typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
|
Chris@16
|
110 ::edge_descriptor e,
|
Chris@16
|
111 const vertex_and_edge_range<Graph, VertexIterator,
|
Chris@16
|
112 EdgeIterator>& g)
|
Chris@16
|
113 { return source(e, *g.g); }
|
Chris@16
|
114
|
Chris@16
|
115 template<typename Graph, typename VertexIterator, typename EdgeIterator>
|
Chris@16
|
116 inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
|
Chris@16
|
117 ::vertex_descriptor
|
Chris@16
|
118 target(typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
|
Chris@16
|
119 ::edge_descriptor e,
|
Chris@16
|
120 const vertex_and_edge_range<Graph, VertexIterator,
|
Chris@16
|
121 EdgeIterator>& g)
|
Chris@16
|
122 { return target(e, *g.g); }
|
Chris@16
|
123
|
Chris@16
|
124 template<typename Graph, typename VertexIterator, typename EdgeIterator>
|
Chris@16
|
125 inline vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
|
Chris@16
|
126 make_vertex_and_edge_range(const Graph& g,
|
Chris@16
|
127 VertexIterator first_v, VertexIterator last_v,
|
Chris@16
|
128 EdgeIterator first_e, EdgeIterator last_e)
|
Chris@16
|
129 {
|
Chris@16
|
130 typedef vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
|
Chris@16
|
131 result_type;
|
Chris@16
|
132 return result_type(g, first_v, last_v, first_e, last_e);
|
Chris@16
|
133 }
|
Chris@16
|
134
|
Chris@16
|
135 } // end namespace graph
|
Chris@16
|
136
|
Chris@16
|
137 using graph::vertex_and_edge_range;
|
Chris@16
|
138 using graph::make_vertex_and_edge_range;
|
Chris@16
|
139
|
Chris@16
|
140 } // end namespace boost
|
Chris@16
|
141 #endif // BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
|