python3_sys/
tupleobject.rs

1use libc::c_int;
2
3use crate::object::*;
4use crate::pyport::Py_ssize_t;
5
6#[repr(C)]
7#[cfg(not(Py_LIMITED_API))]
8pub struct PyTupleObject {
9    pub ob_base: PyVarObject,
10    pub ob_item: [*mut PyObject; 1],
11}
12
13#[cfg_attr(windows, link(name = "pythonXY"))]
14extern "C" {
15    pub static mut PyTuple_Type: PyTypeObject;
16    pub static mut PyTupleIter_Type: PyTypeObject;
17}
18
19#[inline(always)]
20pub unsafe fn PyTuple_Check(op: *mut PyObject) -> c_int {
21    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS)
22}
23
24#[inline(always)]
25pub unsafe fn PyTuple_CheckExact(op: *mut PyObject) -> c_int {
26    (Py_TYPE(op) == &mut PyTuple_Type) as c_int
27}
28
29#[cfg_attr(windows, link(name = "pythonXY"))]
30extern "C" {
31    pub fn PyTuple_New(size: Py_ssize_t) -> *mut PyObject;
32    pub fn PyTuple_Size(arg1: *mut PyObject) -> Py_ssize_t;
33    pub fn PyTuple_GetItem(arg1: *mut PyObject, arg2: Py_ssize_t) -> *mut PyObject;
34    pub fn PyTuple_SetItem(arg1: *mut PyObject, arg2: Py_ssize_t, arg3: *mut PyObject) -> c_int;
35    pub fn PyTuple_GetSlice(
36        arg1: *mut PyObject,
37        arg2: Py_ssize_t,
38        arg3: Py_ssize_t,
39    ) -> *mut PyObject;
40    pub fn PyTuple_Pack(arg1: Py_ssize_t, ...) -> *mut PyObject;
41    #[cfg(not(Py_3_9))]
42    pub fn PyTuple_ClearFreeList() -> c_int;
43}
44
45// Macro, trading safety for speed
46#[inline(always)]
47#[cfg(not(Py_LIMITED_API))]
48pub unsafe fn PyTuple_GET_ITEM(op: *mut PyObject, i: Py_ssize_t) -> *mut PyObject {
49    *(*(op as *mut PyTupleObject))
50        .ob_item
51        .as_ptr()
52        .offset(i as isize)
53}
54
55#[inline(always)]
56#[cfg(not(Py_LIMITED_API))]
57pub unsafe fn PyTuple_GET_SIZE(op: *mut PyObject) -> Py_ssize_t {
58    debug_assert!(PyTuple_Check(op) != 0);
59    Py_SIZE(op)
60}
61
62/// Macro, *only* to be used to fill in brand new tuples
63#[inline(always)]
64#[cfg(not(Py_LIMITED_API))]
65pub unsafe fn PyTuple_SET_ITEM(op: *mut PyObject, i: Py_ssize_t, v: *mut PyObject) {
66    *(*(op as *mut PyTupleObject))
67        .ob_item
68        .as_mut_ptr()
69        .offset(i as isize) = v;
70}