python27_sys/
tupleobject.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 PyTupleObject {
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 PyObject; 1],
17}
18
19#[cfg_attr(windows, link(name = "pythonXY"))]
20extern "C" {
21    pub static mut PyTuple_Type: PyTypeObject;
22}
23
24#[inline(always)]
25pub unsafe fn PyTuple_Check(op: *mut PyObject) -> c_int {
26    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS)
27}
28
29#[inline(always)]
30pub unsafe fn PyTuple_CheckExact(op: *mut PyObject) -> c_int {
31    let u: *mut PyTypeObject = &mut PyTuple_Type;
32    (Py_TYPE(op) == u) as c_int
33}
34
35// Macro, trading safety for speed
36#[inline(always)]
37pub unsafe fn PyTuple_GET_ITEM(op: *mut PyObject, i: Py_ssize_t) -> *mut PyObject {
38    *(*(op as *mut PyTupleObject))
39        .ob_item
40        .as_ptr()
41        .offset(i as isize)
42}
43
44#[inline(always)]
45pub unsafe fn PyTuple_GET_SIZE(op: *mut PyObject) -> Py_ssize_t {
46    Py_SIZE(op)
47}
48
49/// Macro, *only* to be used to fill in brand new tuples
50#[inline(always)]
51pub unsafe fn PyTuple_SET_ITEM(op: *mut PyObject, i: Py_ssize_t, v: *mut PyObject) {
52    *(*(op as *mut PyTupleObject))
53        .ob_item
54        .as_mut_ptr()
55        .offset(i as isize) = v;
56}
57
58#[cfg_attr(windows, link(name = "pythonXY"))]
59extern "C" {
60    pub fn PyTuple_New(size: Py_ssize_t) -> *mut PyObject;
61    pub fn PyTuple_Size(p: *mut PyObject) -> Py_ssize_t;
62    pub fn PyTuple_GetItem(p: *mut PyObject, pos: Py_ssize_t) -> *mut PyObject;
63    pub fn PyTuple_SetItem(p: *mut PyObject, pos: Py_ssize_t, o: *mut PyObject) -> c_int;
64    pub fn PyTuple_GetSlice(p: *mut PyObject, low: Py_ssize_t, high: Py_ssize_t) -> *mut PyObject;
65    pub fn _PyTuple_Resize(p: *mut *mut PyObject, newsize: Py_ssize_t) -> c_int;
66    pub fn PyTuple_Pack(n: Py_ssize_t, ...) -> *mut PyObject;
67    ignore! {
68        pub fn _PyTuple_MaybeUntrack(arg1: *mut PyObject);
69    }
70    pub fn PyTuple_ClearFreeList() -> c_int;
71}