Merge pull request #247 from aldanor/iterators

Use prefix increment in make_iterator
This commit is contained in:
Wenzel Jakob 2016-06-21 15:43:01 +02:00 committed by GitHub
commit 407c292080
2 changed files with 11 additions and 4 deletions

View File

@ -116,7 +116,7 @@
extern "C" { extern "C" {
struct _Py_atomic_address { void *value; }; struct _Py_atomic_address { void *value; };
PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current; PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current;
}; }
#endif #endif
#define PYBIND11_TRY_NEXT_OVERLOAD ((PyObject *) 1) // special failure return code #define PYBIND11_TRY_NEXT_OVERLOAD ((PyObject *) 1) // special failure return code

View File

@ -1028,7 +1028,10 @@ PYBIND11_NOINLINE inline void keep_alive_impl(int Nurse, int Patient, handle arg
(void) wr.release(); (void) wr.release();
} }
template <typename Iterator> struct iterator_state { Iterator it, end; }; template <typename Iterator> struct iterator_state {
Iterator it, end;
bool first;
};
NAMESPACE_END(detail) NAMESPACE_END(detail)
@ -1044,13 +1047,17 @@ iterator make_iterator(Iterator first, Iterator last, Extra &&... extra) {
class_<state>(handle(), "") class_<state>(handle(), "")
.def("__iter__", [](state &s) -> state& { return s; }) .def("__iter__", [](state &s) -> state& { return s; })
.def("__next__", [](state &s) -> ValueType { .def("__next__", [](state &s) -> ValueType {
if (!s.first)
++s.it;
else
s.first = false;
if (s.it == s.end) if (s.it == s.end)
throw stop_iteration(); throw stop_iteration();
return *s.it++; return *s.it;
}, return_value_policy::reference_internal, std::forward<Extra>(extra)...); }, return_value_policy::reference_internal, std::forward<Extra>(extra)...);
} }
return (iterator) cast(state { first, last }); return (iterator) cast(state { first, last, true });
} }
template <typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) { template <typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) {