@@ -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