From 826dfaddb6f855c452f4be04bf71beb1ce071008 Mon Sep 17 00:00:00 2001 From: Hans Dembinski Date: Mon, 13 Aug 2018 00:59:07 +0200 Subject: [PATCH] reverted removing generic_iterator --- src/python/axis.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/python/axis.cpp b/src/python/axis.cpp index 21eaf3b5..4d3ab020 100644 --- a/src/python/axis.cpp +++ b/src/python/axis.cpp @@ -37,6 +37,23 @@ bp::str generic_repr(const T& t) { return os.str().c_str(); } +struct generic_iterator { + generic_iterator(bp::object o) : iterable(o), size(bp::len(iterable)) {} + bp::object next() { + if (idx == size) { + PyErr_SetString(PyExc_StopIteration, "No more items."); + bp::throw_error_already_set(); + } + return iterable[idx++]; + } + generic_iterator& self() { return *this; } + bp::object iterable; + unsigned idx = 0; + unsigned size = 0; +}; + +generic_iterator make_generic_iterator(bp::object self) { return generic_iterator(self); } + template struct axis_value_view_to_python { static PyObject* convert(const bha::value_view& i) { @@ -192,7 +209,7 @@ struct axis_suite : public bp::def_visitor> { ":param integer i: bin index" "\n:returns: bin corresponding to index", bp::args("self", "i")); - cl.def("__iter__", bp::iterator()); + cl.def("__iter__", make_generic_iterator); cl.def("__repr__", generic_repr, ":returns: string representation of this axis", bp::arg("self")); cl.def(bp::self == bp::self); @@ -236,6 +253,12 @@ void register_axis_types() { using bp::arg; // resolve ambiguity docstring_options dopt(true, true, false); + class_("generic_iterator", init()) + .def("__iter__", &generic_iterator::self, return_internal_reference<>()) + .def("__next__", &generic_iterator::next) // Python3 + .def("next", &generic_iterator::next) // Python2 + ; + class_>("regular", "Axis for real-valued data and bins of equal width." "\nBinning is a O(1) operation.",