blob: 9f1c54f044604df07db8a4ff23ad14d221c72444 [file] [log] [blame]
// 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