Skip to content

Commit 69cc44e

Browse files
authored
Merge branch 'main' into main
2 parents 3caece4 + 5b32e38 commit 69cc44e

File tree

1 file changed

+32
-122
lines changed

1 file changed

+32
-122
lines changed

opensfm/src/map/pybind_utils.h

Lines changed: 32 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,10 @@
1212
#define PYBIND11_NAMESPACE_END_ NAMESPACE_END
1313
#endif
1414

15-
1615
PYBIND11_NAMESPACE_BEGIN_(PYBIND11_NAMESPACE)
1716
PYBIND11_NAMESPACE_BEGIN_(detail)
1817

1918
// See https://github.com/pybind/pybind11/issues/637
20-
// Also fbsource/fbcode/caffe2/torch/csrc/jit/python/pybind.h
2119

2220
using ListCasterBase =
2321
pybind11::detail::list_caster<std::vector<map::Landmark *>,
@@ -52,66 +50,34 @@ struct sfm_iterator_state {
5250
};
5351
PYBIND11_NAMESPACE_END_(detail)
5452

55-
/// Makes an python iterator over the keys (`.first`) of a iterator over pairs
56-
/// from a first and past-the-end InputIterator.
57-
template <return_value_policy Policy = return_value_policy::reference_internal,
58-
typename Iterator, typename Sentinel,
59-
typename KeyType = decltype((*std::declval<Iterator>()).second),
60-
typename... Extra>
61-
iterator make_value_iterator(Iterator first, Sentinel last, Extra &&... extra) {
62-
typedef detail::sfm_iterator_state<Iterator, Sentinel, detail::RefIterator,
63-
Policy>
64-
state;
65-
66-
if (!detail::get_type_info(typeid(state), false)) {
67-
class_<state>(handle(), "iterator", pybind11::module_local())
68-
.def("__iter__", [](state &s) -> state & { return s; })
69-
.def("__next__",
70-
[](state &s) -> KeyType {
71-
if (!s.first_or_done) {
72-
++s.it;
73-
} else {
74-
s.first_or_done = false;
75-
}
76-
if (s.it == s.end) {
77-
s.first_or_done = true;
78-
throw stop_iteration();
79-
}
80-
return (*s.it).second;
81-
},
82-
std::forward<Extra>(extra)..., Policy);
83-
}
84-
85-
return cast(state{first, last, true});
86-
}
87-
8853
template <return_value_policy Policy = return_value_policy::reference_internal,
8954
typename Iterator, typename Sentinel,
9055
typename KeyType = decltype(&((*std::declval<Iterator>()).second)),
9156
typename... Extra>
9257
iterator make_ref_value_iterator(Iterator first, Sentinel last,
93-
Extra &&... extra) {
58+
Extra &&...extra) {
9459
typedef detail::sfm_iterator_state<Iterator, Sentinel,
9560
detail::RefValueIterator, Policy>
9661
state;
9762

9863
if (!detail::get_type_info(typeid(state), false)) {
9964
class_<state>(handle(), "ref_value_iterator", pybind11::module_local())
10065
.def("__iter__", [](state &s) -> state & { return s; })
101-
.def("__next__",
102-
[](state &s) -> KeyType {
103-
if (!s.first_or_done) {
104-
++s.it;
105-
} else {
106-
s.first_or_done = false;
107-
}
108-
if (s.it == s.end) {
109-
s.first_or_done = true;
110-
throw stop_iteration();
111-
}
112-
return &(s.it->second);
113-
},
114-
std::forward<Extra>(extra)..., Policy);
66+
.def(
67+
"__next__",
68+
[](state &s) -> KeyType {
69+
if (!s.first_or_done) {
70+
++s.it;
71+
} else {
72+
s.first_or_done = false;
73+
}
74+
if (s.it == s.end) {
75+
s.first_or_done = true;
76+
throw stop_iteration();
77+
}
78+
return &(s.it->second);
79+
},
80+
std::forward<Extra>(extra)..., Policy);
11581
}
11682

11783
return cast(state{first, last, true});
@@ -123,88 +89,32 @@ template <
12389
typename KeyType =
12490
pybind11::tuple, // decltype(&((*std::declval<Iterator>()).second)),
12591
typename... Extra>
126-
iterator make_ref_iterator(Iterator first, Sentinel last, Extra &&... extra) {
92+
iterator make_ref_iterator(Iterator first, Sentinel last, Extra &&...extra) {
12793
typedef detail::sfm_iterator_state<Iterator, Sentinel, detail::ValueIterator,
12894
Policy>
12995
state;
13096

13197
if (!detail::get_type_info(typeid(state), false)) {
13298
class_<state>(handle(), "ref_iterator", pybind11::module_local())
13399
.def("__iter__", [](state &s) -> state & { return s; })
134-
.def("__next__",
135-
[](state &s) -> KeyType {
136-
if (!s.first_or_done) {
137-
++s.it;
138-
} else {
139-
s.first_or_done = false;
140-
}
141-
if (s.it == s.end) {
142-
s.first_or_done = true;
143-
throw stop_iteration();
144-
}
145-
return pybind11::make_tuple(s.it->first, &(s.it->second));
146-
},
147-
std::forward<Extra>(extra)..., Policy);
148-
}
149-
150-
return cast(state{first, last, true});
151-
}
152-
153-
/// Makes a python iterator from a first and past-the-end C++ InputIterator.
154-
template <return_value_policy Policy = return_value_policy::reference_internal,
155-
typename Iterator, typename Sentinel,
156-
typename ValueType = decltype(std::declval<Iterator>()),
157-
typename... Extra>
158-
iterator make_ptr_iterator(Iterator first, Sentinel last, Extra &&... extra) {
159-
typedef detail::iterator_state<Iterator, Sentinel, false, Policy> state;
160-
161-
if (!detail::get_type_info(typeid(state), false)) {
162-
class_<state>(handle(), "iterator", pybind11::module_local())
163-
.def("__iter__", [](state &s) -> state & { return s; })
164-
.def("__next__",
165-
[](state &s) -> ValueType {
166-
if (!s.first_or_done) {
167-
++s.it;
168-
} else {
169-
s.first_or_done = false;
170-
}
171-
if (s.it == s.end) {
172-
s.first_or_done = true;
173-
throw stop_iteration();
174-
}
175-
return s.it;
176-
},
177-
std::forward<Extra>(extra)..., Policy);
100+
.def(
101+
"__next__",
102+
[](state &s) -> KeyType {
103+
if (!s.first_or_done) {
104+
++s.it;
105+
} else {
106+
s.first_or_done = false;
107+
}
108+
if (s.it == s.end) {
109+
s.first_or_done = true;
110+
throw stop_iteration();
111+
}
112+
return pybind11::make_tuple(s.it->first, &(s.it->second));
113+
},
114+
std::forward<Extra>(extra)..., Policy);
178115
}
179116

180117
return cast(state{first, last, true});
181118
}
182119

183-
/// Makes an iterator over the keys (`.first`) of a stl map-like container
184-
/// supporting `std::begin()`/`std::end()`
185-
template <return_value_policy Policy = return_value_policy::reference_internal,
186-
typename Type, typename... Extra>
187-
iterator make_value_iterator(Type &value, Extra &&... extra) {
188-
return make_value_iterator<Policy>(std::begin(value), std::end(value),
189-
extra...);
190-
}
191-
template <return_value_policy Policy = return_value_policy::reference_internal,
192-
typename Type, typename... Extra>
193-
iterator make_unique_ptr_value_iterator(Type &value, Extra &&... extra) {
194-
return make_unique_ptr_value_iterator<Policy>(std::begin(value),
195-
std::end(value), extra...);
196-
}
197-
template <return_value_policy Policy = return_value_policy::reference_internal,
198-
typename Type, typename... Extra>
199-
iterator make_unique_ptr_iterator(Type &value, Extra &&... extra) {
200-
return make_unique_ptr_iterator<Policy>(std::begin(value), std::end(value),
201-
extra...);
202-
}
203-
204-
template <return_value_policy Policy = return_value_policy::reference_internal,
205-
typename Type, typename... Extra>
206-
iterator make_ref_value_iterator(Type &value, Extra &&... extra) {
207-
return make_ref_value_iterator<Policy>(std::begin(value), std::end(value),
208-
extra...);
209-
}
210120
PYBIND11_NAMESPACE_END_(PYBIND11_NAMESPACE)

0 commit comments

Comments
 (0)