mirror of
https://github.com/pybind/pybind11.git
synced 2025-01-31 15:20:34 +00:00
allow iterators with different RV policies (fixes #388)
This commit is contained in:
parent
fe34241e50
commit
146397ecf4
@ -1123,7 +1123,7 @@ PYBIND11_NOINLINE inline void keep_alive_impl(int Nurse, int Patient, handle arg
|
|||||||
keep_alive_impl(nurse, patient);
|
keep_alive_impl(nurse, patient);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Iterator, typename Sentinel, bool KeyIterator = false>
|
template <typename Iterator, typename Sentinel, bool KeyIterator, typename... Extra>
|
||||||
struct iterator_state {
|
struct iterator_state {
|
||||||
Iterator it;
|
Iterator it;
|
||||||
Sentinel end;
|
Sentinel end;
|
||||||
@ -1139,10 +1139,10 @@ template <typename Iterator,
|
|||||||
typename ValueType = decltype(*std::declval<Iterator>()),
|
typename ValueType = decltype(*std::declval<Iterator>()),
|
||||||
typename... Extra>
|
typename... Extra>
|
||||||
iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
|
iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
|
||||||
typedef detail::iterator_state<Iterator, Sentinel> state;
|
typedef detail::iterator_state<Iterator, Sentinel, false, Extra...> state;
|
||||||
|
|
||||||
if (!detail::get_type_info(typeid(state))) {
|
if (!detail::get_type_info(typeid(state))) {
|
||||||
class_<state>(handle(), "")
|
class_<state>(handle(), "iterator")
|
||||||
.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)
|
if (!s.first)
|
||||||
@ -1157,15 +1157,16 @@ iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
|
|||||||
|
|
||||||
return (iterator) cast(state { first, last, true });
|
return (iterator) cast(state { first, last, true });
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Iterator,
|
template <typename Iterator,
|
||||||
typename Sentinel,
|
typename Sentinel,
|
||||||
typename KeyType = decltype((*std::declval<Iterator>()).first),
|
typename KeyType = decltype((*std::declval<Iterator>()).first),
|
||||||
typename... Extra>
|
typename... Extra>
|
||||||
iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
|
iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
|
||||||
typedef detail::iterator_state<Iterator, Sentinel, true> state;
|
typedef detail::iterator_state<Iterator, Sentinel, true, Extra...> state;
|
||||||
|
|
||||||
if (!detail::get_type_info(typeid(state))) {
|
if (!detail::get_type_info(typeid(state))) {
|
||||||
class_<state>(handle(), "")
|
class_<state>(handle(), "iterator")
|
||||||
.def("__iter__", [](state &s) -> state& { return s; })
|
.def("__iter__", [](state &s) -> state& { return s; })
|
||||||
.def("__next__", [](state &s) -> KeyType {
|
.def("__next__", [](state &s) -> KeyType {
|
||||||
if (!s.first)
|
if (!s.first)
|
||||||
|
Loading…
Reference in New Issue
Block a user