python3_sys/
tupleobject.rs1use 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#[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#[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}