Chris@16: // Copyright 2004 The Trustees of Indiana University. Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // Authors: Douglas Gregor Chris@16: // Andrew Lumsdaine Chris@16: Chris@16: #ifndef BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP Chris@16: #define BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace graph { Chris@16: template Chris@16: class vertex_and_edge_range Chris@16: { Chris@16: typedef graph_traits traits_type; Chris@16: Chris@16: public: Chris@16: typedef typename traits_type::directed_category directed_category; Chris@16: typedef typename traits_type::edge_parallel_category Chris@16: edge_parallel_category; Chris@16: struct traversal_category Chris@16: : public virtual vertex_list_graph_tag, Chris@16: public virtual edge_list_graph_tag { }; Chris@16: Chris@16: typedef std::size_t vertices_size_type; Chris@16: typedef VertexIterator vertex_iterator; Chris@16: typedef typename std::iterator_traits::value_type Chris@16: vertex_descriptor; Chris@16: Chris@16: typedef EdgeIterator edge_iterator; Chris@16: typedef typename std::iterator_traits::value_type Chris@16: edge_descriptor; Chris@16: Chris@16: typedef std::size_t edges_size_type; Chris@16: Chris@16: typedef void adjacency_iterator; Chris@16: typedef void out_edge_iterator; Chris@16: typedef void in_edge_iterator; Chris@16: typedef void degree_size_type; Chris@16: Chris@16: static vertex_descriptor null_vertex() Chris@16: { return traits_type::null_vertex(); } Chris@16: Chris@16: vertex_and_edge_range(const Graph& g, Chris@16: VertexIterator first_v, VertexIterator last_v, Chris@16: vertices_size_type n, Chris@16: EdgeIterator first_e, EdgeIterator last_e, Chris@16: edges_size_type m) Chris@16: : g(&g), Chris@16: first_vertex(first_v), last_vertex(last_v), m_num_vertices(n), Chris@16: first_edge(first_e), last_edge(last_e), m_num_edges(m) Chris@16: { Chris@16: } Chris@16: Chris@16: vertex_and_edge_range(const Graph& g, Chris@16: VertexIterator first_v, VertexIterator last_v, Chris@16: EdgeIterator first_e, EdgeIterator last_e) Chris@16: : g(&g), Chris@16: first_vertex(first_v), last_vertex(last_v), Chris@16: first_edge(first_e), last_edge(last_e) Chris@16: { Chris@16: m_num_vertices = std::distance(first_v, last_v); Chris@16: m_num_edges = std::distance(first_e, last_e); Chris@16: } Chris@16: Chris@16: const Graph* g; Chris@16: vertex_iterator first_vertex; Chris@16: vertex_iterator last_vertex; Chris@16: vertices_size_type m_num_vertices; Chris@16: edge_iterator first_edge; Chris@16: edge_iterator last_edge; Chris@16: edges_size_type m_num_edges; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline std::pair Chris@16: vertices(const vertex_and_edge_range& g) Chris@16: { return std::make_pair(g.first_vertex, g.last_vertex); } Chris@16: Chris@16: template Chris@16: inline typename vertex_and_edge_range Chris@16: ::vertices_size_type Chris@16: num_vertices(const vertex_and_edge_range& g) Chris@16: { return g.m_num_vertices; } Chris@16: Chris@16: template Chris@16: inline std::pair Chris@16: edges(const vertex_and_edge_range& g) Chris@16: { return std::make_pair(g.first_edge, g.last_edge); } Chris@16: Chris@16: template Chris@16: inline typename vertex_and_edge_range Chris@16: ::edges_size_type Chris@16: num_edges(const vertex_and_edge_range& g) Chris@16: { return g.m_num_edges; } Chris@16: Chris@16: template Chris@16: inline typename vertex_and_edge_range Chris@16: ::vertex_descriptor Chris@16: source(typename vertex_and_edge_range Chris@16: ::edge_descriptor e, Chris@16: const vertex_and_edge_range& g) Chris@16: { return source(e, *g.g); } Chris@16: Chris@16: template Chris@16: inline typename vertex_and_edge_range Chris@16: ::vertex_descriptor Chris@16: target(typename vertex_and_edge_range Chris@16: ::edge_descriptor e, Chris@16: const vertex_and_edge_range& g) Chris@16: { return target(e, *g.g); } Chris@16: Chris@16: template Chris@16: inline vertex_and_edge_range Chris@16: make_vertex_and_edge_range(const Graph& g, Chris@16: VertexIterator first_v, VertexIterator last_v, Chris@16: EdgeIterator first_e, EdgeIterator last_e) Chris@16: { Chris@16: typedef vertex_and_edge_range Chris@16: result_type; Chris@16: return result_type(g, first_v, last_v, first_e, last_e); Chris@16: } Chris@16: Chris@16: } // end namespace graph Chris@16: Chris@16: using graph::vertex_and_edge_range; Chris@16: using graph::make_vertex_and_edge_range; Chris@16: Chris@16: } // end namespace boost Chris@16: #endif // BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP