diff --git a/src/python/basic_graph.cpp b/src/python/basic_graph.cpp index d07e0829..5970d609 100644 --- a/src/python/basic_graph.cpp +++ b/src/python/basic_graph.cpp @@ -441,6 +441,13 @@ basic_graph::vertices() const return std::make_pair(vertices_begin(), vertices_end()); } +template +simple_python_iterator::vertex_iterator> +basic_graph::py_vertices() const +{ + return simple_python_iterator(vertices()); +} + template typename basic_graph::Edge basic_graph::add_edge(Vertex u, Vertex v) @@ -507,6 +514,13 @@ basic_graph::edges() const return std::make_pair(edges_begin(), edges_end()); } +template +simple_python_iterator::edge_iterator> +basic_graph::py_edges() const +{ + return simple_python_iterator(edges()); +} + template void basic_graph::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 + ::declare("vertex_iterator"); + simple_python_iterator + ::declare("edge_iterator"); simple_python_iterator ::declare("out_edge_iterator"); simple_python_iterator diff --git a/src/python/basic_graph.hpp b/src/python/basic_graph.hpp index 6e833b7f..ad522111 100644 --- a/src/python/basic_graph.hpp +++ b/src/python/basic_graph.hpp @@ -36,8 +36,11 @@ template class simple_python_iterator { public: + typedef typename std::iterator_traits::difference_type + difference_type; + simple_python_iterator(std::pair p) - : first(p.first), last(p.second) { } + : orig_first(p.first), first(p.first), last(p.second), n(-1) { } typename std::iterator_traits::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()) class_ >(name, no_init) .def("__iter__", identity_function()) + .def("__len__", &simple_python_iterator::len) .def("next", &simple_python_iterator::next) ; } private: + Iterator orig_first; Iterator first; Iterator last; + difference_type n; }; template @@ -243,6 +255,7 @@ class basic_graph void remove_vertex(Vertex vertex); std::size_t num_vertices() const; std::pair vertices() const; + simple_python_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 edges() const; + simple_python_iterator py_edges() const; edge_iterator edges_begin() const; edge_iterator edges_end() const;