| 1998 | }; |
| 1999 | |
| 2000 | class slice : public object { |
| 2001 | public: |
| 2002 | PYBIND11_OBJECT(slice, object, PySlice_Check) |
| 2003 | slice(handle start, handle stop, handle step) |
| 2004 | : object(PySlice_New(start.ptr(), stop.ptr(), step.ptr()), stolen_t{}) { |
| 2005 | if (!m_ptr) { |
| 2006 | pybind11_fail("Could not allocate slice object!"); |
| 2007 | } |
| 2008 | } |
| 2009 | slice() : slice(none(), none(), none()) {} |
| 2010 | |
| 2011 | #ifdef PYBIND11_HAS_OPTIONAL |
| 2012 | slice(std::optional<ssize_t> start, std::optional<ssize_t> stop, std::optional<ssize_t> step) |
| 2013 | : slice(index_to_object(start), index_to_object(stop), index_to_object(step)) {} |
| 2014 | #else |
| 2015 | slice(ssize_t start_, ssize_t stop_, ssize_t step_) |
| 2016 | : slice(int_(start_), int_(stop_), int_(step_)) {} |
| 2017 | #endif |
| 2018 | |
| 2019 | bool |
| 2020 | compute(size_t length, size_t *start, size_t *stop, size_t *step, size_t *slicelength) const { |
| 2021 | return PySlice_GetIndicesEx((PYBIND11_SLICE_OBJECT *) m_ptr, |
| 2022 | (ssize_t) length, |
| 2023 | (ssize_t *) start, |
| 2024 | (ssize_t *) stop, |
| 2025 | (ssize_t *) step, |
| 2026 | (ssize_t *) slicelength) |
| 2027 | == 0; |
| 2028 | } |
| 2029 | bool compute( |
| 2030 | ssize_t length, ssize_t *start, ssize_t *stop, ssize_t *step, ssize_t *slicelength) const { |
| 2031 | return PySlice_GetIndicesEx( |
| 2032 | (PYBIND11_SLICE_OBJECT *) m_ptr, length, start, stop, step, slicelength) |
| 2033 | == 0; |
| 2034 | } |
| 2035 | |
| 2036 | private: |
| 2037 | template <typename T> |
| 2038 | static object index_to_object(T index) { |
| 2039 | return index ? object(int_(*index)) : object(none()); |
| 2040 | } |
| 2041 | }; |
| 2042 | |
| 2043 | class capsule : public object { |
| 2044 | public: |
no outgoing calls