You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
141 lines
5.3 KiB
141 lines
5.3 KiB
// 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
|
|
|