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" {
struct _Py_atomic_address { void *value; };
PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current;
};
}
#endif
#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();
}
template <typename Iterator> struct iterator_state { Iterator it, end; };
template <typename Iterator> struct iterator_state {
Iterator it, end;
bool first;
};
NAMESPACE_END(detail)
@ -1044,13 +1047,17 @@ iterator make_iterator(Iterator first, Iterator last, Extra &&... extra) {
class_<state>(handle(), "")
.def("__iter__", [](state &s) -> state& { return s; })
.def("__next__", [](state &s) -> ValueType {
if (!s.first)
++s.it;
else
s.first = false;
if (s.it == s.end)
throw stop_iteration();
return *s.it++;
return *s.it;
}, 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) {