Skip to main content

pyforge_ffi/
sliceobject.rs

1use crate::object::*;
2use crate::pyport::Py_ssize_t;
3use std::ffi::c_int;
4
5extern_libpython! {
6    static mut _Py_EllipsisObject: PyObject;
7}
8
9#[inline]
10pub unsafe fn Py_Ellipsis() -> *mut PyObject {
11    &raw mut _Py_EllipsisObject
12}
13
14#[cfg(not(Py_LIMITED_API))]
15#[repr(C)]
16pub struct PySliceObject {
17    pub ob_base: PyObject,
18    pub start: *mut PyObject,
19    pub stop: *mut PyObject,
20    pub step: *mut PyObject,
21}
22
23extern_libpython! {
24    pub static mut PySlice_Type: PyTypeObject;
25    pub static mut PyEllipsis_Type: PyTypeObject;
26}
27
28#[inline]
29pub unsafe fn PySlice_Check(op: *mut PyObject) -> c_int {
30    (Py_TYPE(op) == &raw mut PySlice_Type) as c_int
31}
32
33extern_libpython! {
34    pub fn PySlice_New(
35        start: *mut PyObject,
36        stop: *mut PyObject,
37        step: *mut PyObject,
38    ) -> *mut PyObject;
39
40    // skipped non-limited _PySlice_FromIndices
41    // skipped non-limited _PySlice_GetLongIndices
42
43    pub fn PySlice_GetIndices(
44        r: *mut PyObject,
45        length: Py_ssize_t,
46        start: *mut Py_ssize_t,
47        stop: *mut Py_ssize_t,
48        step: *mut Py_ssize_t,
49    ) -> c_int;
50}
51
52#[inline]
53pub unsafe fn PySlice_GetIndicesEx(
54    slice: *mut PyObject,
55    length: Py_ssize_t,
56    start: *mut Py_ssize_t,
57    stop: *mut Py_ssize_t,
58    step: *mut Py_ssize_t,
59    slicelength: *mut Py_ssize_t,
60) -> c_int {
61    if PySlice_Unpack(slice, start, stop, step) < 0 {
62        *slicelength = 0;
63        -1
64    } else {
65        *slicelength = PySlice_AdjustIndices(length, start, stop, *step);
66        0
67    }
68}
69
70extern_libpython! {
71    pub fn PySlice_Unpack(
72        slice: *mut PyObject,
73        start: *mut Py_ssize_t,
74        stop: *mut Py_ssize_t,
75        step: *mut Py_ssize_t,
76    ) -> c_int;
77
78    pub fn PySlice_AdjustIndices(
79        length: Py_ssize_t,
80        start: *mut Py_ssize_t,
81        stop: *mut Py_ssize_t,
82        step: Py_ssize_t,
83    ) -> Py_ssize_t;
84}