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