EVOLUTION-MANAGER
Edit File: vertex_and_edge_range.hpp
// 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