python27_sys/
listobject.rs

1use libc::c_int;
2
3use crate::object::*;
4use crate::pyport::Py_ssize_t;
5
6#[repr(C)]
7#[derive(Copy, Clone)]
8pub struct PyListObject {
9    #[cfg(py_sys_config = "Py_TRACE_REFS")]
10    pub _ob_next: *mut PyObject,
11    #[cfg(py_sys_config = "Py_TRACE_REFS")]
12    pub _ob_prev: *mut PyObject,
13    pub ob_refcnt: Py_ssize_t,
14    pub ob_type: *mut PyTypeObject,
15    pub ob_size: Py_ssize_t,
16    pub ob_item: *mut *mut PyObject,
17    pub allocated: Py_ssize_t,
18}
19
20#[cfg_attr(windows, link(name = "pythonXY"))]
21extern "C" {
22    pub static mut PyList_Type: PyTypeObject;
23}
24
25#[inline(always)]
26pub unsafe fn PyList_Check(op: *mut PyObject) -> c_int {
27    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS)
28}
29
30#[inline(always)]
31pub unsafe fn PyList_CheckExact(op: *mut PyObject) -> c_int {
32    let u: *mut PyTypeObject = &mut PyList_Type;
33    (Py_TYPE(op) == u) as c_int
34}
35
36// Macro, trading safety for speed
37#[inline(always)]
38pub unsafe fn PyList_GET_ITEM(op: *mut PyObject, i: Py_ssize_t) -> *mut PyObject {
39    *(*(op as *mut PyListObject)).ob_item.offset(i as isize)
40}
41
42#[inline(always)]
43pub unsafe fn PyList_GET_SIZE(op: *mut PyObject) -> Py_ssize_t {
44    Py_SIZE(op)
45}
46
47/// Macro, *only* to be used to fill in brand new lists
48#[inline(always)]
49pub unsafe fn PyList_SET_ITEM(op: *mut PyObject, i: Py_ssize_t, v: *mut PyObject) {
50    *(*(op as *mut PyListObject)).ob_item.offset(i as isize) = v;
51}
52
53#[cfg_attr(windows, link(name = "pythonXY"))]
54extern "C" {
55    pub fn PyList_New(size: Py_ssize_t) -> *mut PyObject;
56    pub fn PyList_Size(list: *mut PyObject) -> Py_ssize_t;
57    pub fn PyList_GetItem(list: *mut PyObject, index: Py_ssize_t) -> *mut PyObject;
58    pub fn PyList_SetItem(list: *mut PyObject, index: Py_ssize_t, item: *mut PyObject) -> c_int;
59    pub fn PyList_Insert(list: *mut PyObject, index: Py_ssize_t, item: *mut PyObject) -> c_int;
60    pub fn PyList_Append(list: *mut PyObject, item: *mut PyObject) -> c_int;
61    pub fn PyList_GetSlice(list: *mut PyObject, low: Py_ssize_t, high: Py_ssize_t)
62        -> *mut PyObject;
63    pub fn PyList_SetSlice(
64        list: *mut PyObject,
65        low: Py_ssize_t,
66        high: Py_ssize_t,
67        itemlist: *mut PyObject,
68    ) -> c_int;
69    pub fn PyList_Sort(list: *mut PyObject) -> c_int;
70    pub fn PyList_Reverse(list: *mut PyObject) -> c_int;
71    pub fn PyList_AsTuple(list: *mut PyObject) -> *mut PyObject;
72    ignore! {
73        fn _PyList_Extend(arg1: *mut PyListObject, arg2: *mut PyObject) -> *mut PyObject;
74    }
75}