diff --git a/opensfm/src/map/pybind_utils.h b/opensfm/src/map/pybind_utils.h index e7f402eed..bcb878176 100644 --- a/opensfm/src/map/pybind_utils.h +++ b/opensfm/src/map/pybind_utils.h @@ -12,12 +12,10 @@ #define PYBIND11_NAMESPACE_END_ NAMESPACE_END #endif - PYBIND11_NAMESPACE_BEGIN_(PYBIND11_NAMESPACE) PYBIND11_NAMESPACE_BEGIN_(detail) // See https://github.com/pybind/pybind11/issues/637 -// Also fbsource/fbcode/caffe2/torch/csrc/jit/python/pybind.h using ListCasterBase = pybind11::detail::list_caster, @@ -52,45 +50,12 @@ struct sfm_iterator_state { }; PYBIND11_NAMESPACE_END_(detail) -/// Makes an python iterator over the keys (`.first`) of a iterator over pairs -/// from a first and past-the-end InputIterator. -template ()).second), - typename... Extra> -iterator make_value_iterator(Iterator first, Sentinel last, Extra &&... extra) { - typedef detail::sfm_iterator_state - state; - - if (!detail::get_type_info(typeid(state), false)) { - class_(handle(), "iterator", pybind11::module_local()) - .def("__iter__", [](state &s) -> state & { return s; }) - .def("__next__", - [](state &s) -> KeyType { - if (!s.first_or_done) { - ++s.it; - } else { - s.first_or_done = false; - } - if (s.it == s.end) { - s.first_or_done = true; - throw stop_iteration(); - } - return (*s.it).second; - }, - std::forward(extra)..., Policy); - } - - return cast(state{first, last, true}); -} - template ()).second)), typename... Extra> iterator make_ref_value_iterator(Iterator first, Sentinel last, - Extra &&... extra) { + Extra &&...extra) { typedef detail::sfm_iterator_state state; @@ -98,20 +63,21 @@ iterator make_ref_value_iterator(Iterator first, Sentinel last, if (!detail::get_type_info(typeid(state), false)) { class_(handle(), "ref_value_iterator", pybind11::module_local()) .def("__iter__", [](state &s) -> state & { return s; }) - .def("__next__", - [](state &s) -> KeyType { - if (!s.first_or_done) { - ++s.it; - } else { - s.first_or_done = false; - } - if (s.it == s.end) { - s.first_or_done = true; - throw stop_iteration(); - } - return &(s.it->second); - }, - std::forward(extra)..., Policy); + .def( + "__next__", + [](state &s) -> KeyType { + if (!s.first_or_done) { + ++s.it; + } else { + s.first_or_done = false; + } + if (s.it == s.end) { + s.first_or_done = true; + throw stop_iteration(); + } + return &(s.it->second); + }, + std::forward(extra)..., Policy); } return cast(state{first, last, true}); @@ -123,7 +89,7 @@ template < typename KeyType = pybind11::tuple, // decltype(&((*std::declval()).second)), typename... Extra> -iterator make_ref_iterator(Iterator first, Sentinel last, Extra &&... extra) { +iterator make_ref_iterator(Iterator first, Sentinel last, Extra &&...extra) { typedef detail::sfm_iterator_state state; @@ -131,80 +97,24 @@ iterator make_ref_iterator(Iterator first, Sentinel last, Extra &&... extra) { if (!detail::get_type_info(typeid(state), false)) { class_(handle(), "ref_iterator", pybind11::module_local()) .def("__iter__", [](state &s) -> state & { return s; }) - .def("__next__", - [](state &s) -> KeyType { - if (!s.first_or_done) { - ++s.it; - } else { - s.first_or_done = false; - } - if (s.it == s.end) { - s.first_or_done = true; - throw stop_iteration(); - } - return pybind11::make_tuple(s.it->first, &(s.it->second)); - }, - std::forward(extra)..., Policy); - } - - return cast(state{first, last, true}); -} - -/// Makes a python iterator from a first and past-the-end C++ InputIterator. -template ()), - typename... Extra> -iterator make_ptr_iterator(Iterator first, Sentinel last, Extra &&... extra) { - typedef detail::iterator_state state; - - if (!detail::get_type_info(typeid(state), false)) { - class_(handle(), "iterator", pybind11::module_local()) - .def("__iter__", [](state &s) -> state & { return s; }) - .def("__next__", - [](state &s) -> ValueType { - if (!s.first_or_done) { - ++s.it; - } else { - s.first_or_done = false; - } - if (s.it == s.end) { - s.first_or_done = true; - throw stop_iteration(); - } - return s.it; - }, - std::forward(extra)..., Policy); + .def( + "__next__", + [](state &s) -> KeyType { + if (!s.first_or_done) { + ++s.it; + } else { + s.first_or_done = false; + } + if (s.it == s.end) { + s.first_or_done = true; + throw stop_iteration(); + } + return pybind11::make_tuple(s.it->first, &(s.it->second)); + }, + std::forward(extra)..., Policy); } return cast(state{first, last, true}); } -/// Makes an iterator over the keys (`.first`) of a stl map-like container -/// supporting `std::begin()`/`std::end()` -template -iterator make_value_iterator(Type &value, Extra &&... extra) { - return make_value_iterator(std::begin(value), std::end(value), - extra...); -} -template -iterator make_unique_ptr_value_iterator(Type &value, Extra &&... extra) { - return make_unique_ptr_value_iterator(std::begin(value), - std::end(value), extra...); -} -template -iterator make_unique_ptr_iterator(Type &value, Extra &&... extra) { - return make_unique_ptr_iterator(std::begin(value), std::end(value), - extra...); -} - -template -iterator make_ref_value_iterator(Type &value, Extra &&... extra) { - return make_ref_value_iterator(std::begin(value), std::end(value), - extra...); -} PYBIND11_NAMESPACE_END_(PYBIND11_NAMESPACE)