mirror of
https://github.com/boostorg/graph.git
synced 2026-01-31 08:12:14 +00:00
Make vertices and edges support len()
[SVN r30189]
This commit is contained in:
@@ -441,6 +441,13 @@ basic_graph<DirectedS>::vertices() const
|
||||
return std::make_pair(vertices_begin(), vertices_end());
|
||||
}
|
||||
|
||||
template<typename DirectedS>
|
||||
simple_python_iterator<typename basic_graph<DirectedS>::vertex_iterator>
|
||||
basic_graph<DirectedS>::py_vertices() const
|
||||
{
|
||||
return simple_python_iterator<vertex_iterator>(vertices());
|
||||
}
|
||||
|
||||
template<typename DirectedS>
|
||||
typename basic_graph<DirectedS>::Edge
|
||||
basic_graph<DirectedS>::add_edge(Vertex u, Vertex v)
|
||||
@@ -507,6 +514,13 @@ basic_graph<DirectedS>::edges() const
|
||||
return std::make_pair(edges_begin(), edges_end());
|
||||
}
|
||||
|
||||
template<typename DirectedS>
|
||||
simple_python_iterator<typename basic_graph<DirectedS>::edge_iterator>
|
||||
basic_graph<DirectedS>::py_edges() const
|
||||
{
|
||||
return simple_python_iterator<edge_iterator>(edges());
|
||||
}
|
||||
|
||||
template<typename DirectedS>
|
||||
void basic_graph<DirectedS>::renumber_vertices()
|
||||
{
|
||||
@@ -565,11 +579,10 @@ void export_basic_graph(const char* name)
|
||||
.def("is_directed", &Graph::is_directed)
|
||||
// Vertex List Graph concept
|
||||
.def("num_vertices", &Graph::num_vertices)
|
||||
.add_property("vertices", range(&Graph::vertices_begin,
|
||||
&Graph::vertices_end))
|
||||
.add_property("vertices", &Graph::py_vertices)
|
||||
// Edge List Graph concept
|
||||
.def("num_edges", &Graph::num_edges)
|
||||
.add_property("edges", range(&Graph::edges_begin, &Graph::edges_end))
|
||||
.add_property("edges", &Graph::py_edges)
|
||||
// Mutable Graph concept
|
||||
.def("add_vertex", &Graph::add_vertex)
|
||||
.def("clear_vertex", &Graph::clear_vertex)
|
||||
@@ -623,6 +636,10 @@ void export_basic_graph(const char* name)
|
||||
.def(self != self);
|
||||
|
||||
// Iterators
|
||||
simple_python_iterator<typename Graph::vertex_iterator>
|
||||
::declare("vertex_iterator");
|
||||
simple_python_iterator<typename Graph::edge_iterator>
|
||||
::declare("edge_iterator");
|
||||
simple_python_iterator<typename Graph::out_edge_iterator>
|
||||
::declare("out_edge_iterator");
|
||||
simple_python_iterator<typename Graph::in_edge_iterator>
|
||||
|
||||
@@ -36,8 +36,11 @@ template<typename Iterator>
|
||||
class simple_python_iterator
|
||||
{
|
||||
public:
|
||||
typedef typename std::iterator_traits<Iterator>::difference_type
|
||||
difference_type;
|
||||
|
||||
simple_python_iterator(std::pair<Iterator, Iterator> p)
|
||||
: first(p.first), last(p.second) { }
|
||||
: orig_first(p.first), first(p.first), last(p.second), n(-1) { }
|
||||
|
||||
typename std::iterator_traits<Iterator>::value_type next()
|
||||
{
|
||||
@@ -47,6 +50,12 @@ public:
|
||||
return *first++;
|
||||
}
|
||||
|
||||
difference_type len()
|
||||
{
|
||||
if (n == -1) n = std::distance(first, last);
|
||||
return n;
|
||||
}
|
||||
|
||||
static void declare(const char* name)
|
||||
{
|
||||
using boost::python::class_;
|
||||
@@ -55,13 +64,16 @@ public:
|
||||
if (!type_already_registered<simple_python_iterator>())
|
||||
class_<simple_python_iterator<Iterator> >(name, no_init)
|
||||
.def("__iter__", identity_function())
|
||||
.def("__len__", &simple_python_iterator<Iterator>::len)
|
||||
.def("next", &simple_python_iterator<Iterator>::next)
|
||||
;
|
||||
}
|
||||
|
||||
private:
|
||||
Iterator orig_first;
|
||||
Iterator first;
|
||||
Iterator last;
|
||||
difference_type n;
|
||||
};
|
||||
|
||||
template<typename PropertyMap>
|
||||
@@ -243,6 +255,7 @@ class basic_graph
|
||||
void remove_vertex(Vertex vertex);
|
||||
std::size_t num_vertices() const;
|
||||
std::pair<vertex_iterator, vertex_iterator> vertices() const;
|
||||
simple_python_iterator<vertex_iterator> py_vertices() const;
|
||||
vertex_iterator vertices_begin() const;
|
||||
vertex_iterator vertices_end() const;
|
||||
|
||||
@@ -250,6 +263,7 @@ class basic_graph
|
||||
void remove_edge(Edge edge);
|
||||
std::size_t num_edges() const;
|
||||
std::pair<edge_iterator, edge_iterator> edges() const;
|
||||
simple_python_iterator<edge_iterator> py_edges() const;
|
||||
edge_iterator edges_begin() const;
|
||||
edge_iterator edges_end() const;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user