Skip to content

Commit 8f1bc01

Browse files
committed
[vector] Replace with slice.get_indices
1 parent 80787e8 commit 8f1bc01

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

include/eigenpy/std-vector.hpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -111,20 +111,22 @@ struct overload_base_get_item_for_std_vector
111111
boost::python::slice slice) {
112112

113113
namespace bp = boost::python;
114-
Py_ssize_t start, stop, step, slicelen;
115-
const Py_ssize_t n = static_cast<Py_ssize_t>(container.get().size());
116-
117-
if (PySlice_GetIndicesEx(slice.ptr(), n, &start, &stop, &step, &slicelen) != 0)
118-
bp::throw_error_already_set();
119114

120115
bp::list out;
121-
for (Py_ssize_t k = 0; k < slicelen; ++k) {
122-
Py_ssize_t idx = start + k * step;
123-
124-
// return a reference (not a copy), like your int-getitem
116+
try {
117+
auto rng = slice.get_indices(container.get().begin(), container.get().end());
118+
// rng.start, rng.stop are iterators; rng.step is int; [start, stop] is closed
125119
typename bp::to_python_indirect<value_type&,
126120
bp::detail::make_reference_holder> convert;
127-
out.append(bp::object(bp::handle<>(convert(container.get()[std::size_t(idx)]))));
121+
// forward or backward
122+
for (typename Container::iterator it = rng.start;; std::advance(it, rng.step)) {
123+
out.append(bp::object(bp::handle<>(convert(*it))));
124+
if (it == rng.stop) break; // closed interval, include stop
125+
}
126+
} catch (const std::invalid_argument&) {
127+
// Boost.Python specifies empty ranges throw invalid_argument.
128+
// Return [] (matches Python's behavior for empty slices).
129+
return bp::list();
128130
}
129131
return out;
130132
}

0 commit comments

Comments
 (0)