1 // Copyright 2004 The Trustees of Indiana University.
3 // Use, modification and distribution is subject to the Boost Software
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 // Authors: Douglas Gregor
10 #ifndef BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
11 #define BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
13 #include <boost/graph/graph_traits.hpp>
19 template<typename Graph
, typename VertexIterator
, typename EdgeIterator
>
20 class vertex_and_edge_range
22 typedef graph_traits
<Graph
> traits_type
;
25 typedef typename
traits_type::directed_category directed_category
;
26 typedef typename
traits_type::edge_parallel_category
27 edge_parallel_category
;
28 struct traversal_category
29 : public virtual vertex_list_graph_tag
,
30 public virtual edge_list_graph_tag
{ };
32 typedef std::size_t vertices_size_type
;
33 typedef VertexIterator vertex_iterator
;
34 typedef typename
std::iterator_traits
<VertexIterator
>::value_type
37 typedef EdgeIterator edge_iterator
;
38 typedef typename
std::iterator_traits
<EdgeIterator
>::value_type
41 typedef std::size_t edges_size_type
;
43 typedef void adjacency_iterator
;
44 typedef void out_edge_iterator
;
45 typedef void in_edge_iterator
;
46 typedef void degree_size_type
;
48 static vertex_descriptor
null_vertex()
49 { return traits_type::null_vertex(); }
51 vertex_and_edge_range(const Graph
& g
,
52 VertexIterator first_v
, VertexIterator last_v
,
54 EdgeIterator first_e
, EdgeIterator last_e
,
57 first_vertex(first_v
), last_vertex(last_v
), m_num_vertices(n
),
58 first_edge(first_e
), last_edge(last_e
), m_num_edges(m
)
62 vertex_and_edge_range(const Graph
& g
,
63 VertexIterator first_v
, VertexIterator last_v
,
64 EdgeIterator first_e
, EdgeIterator last_e
)
66 first_vertex(first_v
), last_vertex(last_v
),
67 first_edge(first_e
), last_edge(last_e
)
69 m_num_vertices
= std::distance(first_v
, last_v
);
70 m_num_edges
= std::distance(first_e
, last_e
);
74 vertex_iterator first_vertex
;
75 vertex_iterator last_vertex
;
76 vertices_size_type m_num_vertices
;
77 edge_iterator first_edge
;
78 edge_iterator last_edge
;
79 edges_size_type m_num_edges
;
82 template<typename Graph
, typename VertexIterator
, typename EdgeIterator
>
83 inline std::pair
<VertexIterator
, VertexIterator
>
84 vertices(const vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>& g
)
85 { return std::make_pair(g
.first_vertex
, g
.last_vertex
); }
87 template<typename Graph
, typename VertexIterator
, typename EdgeIterator
>
88 inline typename vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>
90 num_vertices(const vertex_and_edge_range
<Graph
, VertexIterator
,
92 { return g
.m_num_vertices
; }
94 template<typename Graph
, typename VertexIterator
, typename EdgeIterator
>
95 inline std::pair
<EdgeIterator
, EdgeIterator
>
96 edges(const vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>& g
)
97 { return std::make_pair(g
.first_edge
, g
.last_edge
); }
99 template<typename Graph
, typename VertexIterator
, typename EdgeIterator
>
100 inline typename vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>
102 num_edges(const vertex_and_edge_range
<Graph
, VertexIterator
,
104 { return g
.m_num_edges
; }
106 template<typename Graph
, typename VertexIterator
, typename EdgeIterator
>
107 inline typename vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>
109 source(typename vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>
111 const vertex_and_edge_range
<Graph
, VertexIterator
,
113 { return source(e
, *g
.g
); }
115 template<typename Graph
, typename VertexIterator
, typename EdgeIterator
>
116 inline typename vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>
118 target(typename vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>
120 const vertex_and_edge_range
<Graph
, VertexIterator
,
122 { return target(e
, *g
.g
); }
124 template<typename Graph
, typename VertexIterator
, typename EdgeIterator
>
125 inline vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>
126 make_vertex_and_edge_range(const Graph
& g
,
127 VertexIterator first_v
, VertexIterator last_v
,
128 EdgeIterator first_e
, EdgeIterator last_e
)
130 typedef vertex_and_edge_range
<Graph
, VertexIterator
, EdgeIterator
>
132 return result_type(g
, first_v
, last_v
, first_e
, last_e
);
135 } // end namespace graph
137 using graph::vertex_and_edge_range
;
138 using graph::make_vertex_and_edge_range
;
140 } // end namespace boost
141 #endif // BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP