pyo3_ffi/
setobject.rs

1use crate::object::*;
2#[cfg(not(any(Py_LIMITED_API, PyPy, GraalPy)))]
3use crate::pyport::Py_hash_t;
4use crate::pyport::Py_ssize_t;
5use std::os::raw::c_int;
6use std::ptr::addr_of_mut;
7
8pub const PySet_MINSIZE: usize = 8;
9
10#[cfg(not(any(Py_LIMITED_API, PyPy, GraalPy)))]
11#[repr(C)]
12#[derive(Debug)]
13pub struct setentry {
14    pub key: *mut PyObject,
15    pub hash: Py_hash_t,
16}
17
18#[cfg(not(any(Py_LIMITED_API, PyPy, GraalPy)))]
19#[repr(C)]
20#[derive(Debug)]
21pub struct PySetObject {
22    pub ob_base: PyObject,
23    pub fill: Py_ssize_t,
24    pub used: Py_ssize_t,
25    pub mask: Py_ssize_t,
26    pub table: *mut setentry,
27    pub hash: Py_hash_t,
28    pub finger: Py_ssize_t,
29    pub smalltable: [setentry; PySet_MINSIZE],
30    pub weakreflist: *mut PyObject,
31}
32
33// skipped
34#[inline]
35#[cfg(all(not(any(PyPy, GraalPy)), not(Py_LIMITED_API)))]
36pub unsafe fn PySet_GET_SIZE(so: *mut PyObject) -> Py_ssize_t {
37    debug_assert_eq!(PyAnySet_Check(so), 1);
38    let so = so.cast::<PySetObject>();
39    (*so).used
40}
41
42#[cfg(not(Py_LIMITED_API))]
43#[cfg_attr(windows, link(name = "pythonXY"))]
44extern "C" {
45    pub static mut _PySet_Dummy: *mut PyObject;
46}
47
48extern "C" {
49    #[cfg(not(Py_LIMITED_API))]
50    #[cfg_attr(PyPy, link_name = "_PyPySet_NextEntry")]
51    pub fn _PySet_NextEntry(
52        set: *mut PyObject,
53        pos: *mut Py_ssize_t,
54        key: *mut *mut PyObject,
55        hash: *mut super::Py_hash_t,
56    ) -> c_int;
57
58    // skipped non-limited _PySet_Update
59}
60
61#[cfg_attr(windows, link(name = "pythonXY"))]
62extern "C" {
63    #[cfg_attr(PyPy, link_name = "PyPySet_Type")]
64    pub static mut PySet_Type: PyTypeObject;
65    #[cfg_attr(PyPy, link_name = "PyPyFrozenSet_Type")]
66    pub static mut PyFrozenSet_Type: PyTypeObject;
67    pub static mut PySetIter_Type: PyTypeObject;
68}
69
70extern "C" {
71    #[cfg_attr(PyPy, link_name = "PyPySet_New")]
72    pub fn PySet_New(arg1: *mut PyObject) -> *mut PyObject;
73    #[cfg_attr(PyPy, link_name = "PyPyFrozenSet_New")]
74    pub fn PyFrozenSet_New(arg1: *mut PyObject) -> *mut PyObject;
75
76    #[cfg_attr(PyPy, link_name = "PyPySet_Add")]
77    pub fn PySet_Add(set: *mut PyObject, key: *mut PyObject) -> c_int;
78    #[cfg_attr(PyPy, link_name = "PyPySet_Clear")]
79    pub fn PySet_Clear(set: *mut PyObject) -> c_int;
80    #[cfg_attr(PyPy, link_name = "PyPySet_Contains")]
81    pub fn PySet_Contains(anyset: *mut PyObject, key: *mut PyObject) -> c_int;
82    #[cfg_attr(PyPy, link_name = "PyPySet_Discard")]
83    pub fn PySet_Discard(set: *mut PyObject, key: *mut PyObject) -> c_int;
84    #[cfg_attr(PyPy, link_name = "PyPySet_Pop")]
85    pub fn PySet_Pop(set: *mut PyObject) -> *mut PyObject;
86    #[cfg_attr(PyPy, link_name = "PyPySet_Size")]
87    pub fn PySet_Size(anyset: *mut PyObject) -> Py_ssize_t;
88
89    #[cfg(PyPy)]
90    #[link_name = "PyPyFrozenSet_CheckExact"]
91    pub fn PyFrozenSet_CheckExact(ob: *mut PyObject) -> c_int;
92}
93
94#[inline]
95#[cfg(not(any(PyPy, GraalPy)))]
96pub unsafe fn PyFrozenSet_CheckExact(ob: *mut PyObject) -> c_int {
97    (Py_TYPE(ob) == addr_of_mut!(PyFrozenSet_Type)) as c_int
98}
99
100extern "C" {
101    #[cfg(PyPy)]
102    #[link_name = "PyPyFrozenSet_Check"]
103    pub fn PyFrozenSet_Check(ob: *mut PyObject) -> c_int;
104}
105
106#[inline]
107#[cfg(not(PyPy))]
108pub unsafe fn PyFrozenSet_Check(ob: *mut PyObject) -> c_int {
109    (Py_TYPE(ob) == addr_of_mut!(PyFrozenSet_Type)
110        || PyType_IsSubtype(Py_TYPE(ob), addr_of_mut!(PyFrozenSet_Type)) != 0) as c_int
111}
112
113extern "C" {
114    #[cfg(PyPy)]
115    #[link_name = "PyPyAnySet_CheckExact"]
116    pub fn PyAnySet_CheckExact(ob: *mut PyObject) -> c_int;
117}
118
119#[inline]
120#[cfg(not(PyPy))]
121pub unsafe fn PyAnySet_CheckExact(ob: *mut PyObject) -> c_int {
122    (Py_TYPE(ob) == addr_of_mut!(PySet_Type) || Py_TYPE(ob) == addr_of_mut!(PyFrozenSet_Type))
123        as c_int
124}
125
126#[inline]
127pub unsafe fn PyAnySet_Check(ob: *mut PyObject) -> c_int {
128    (PyAnySet_CheckExact(ob) != 0
129        || PyType_IsSubtype(Py_TYPE(ob), addr_of_mut!(PySet_Type)) != 0
130        || PyType_IsSubtype(Py_TYPE(ob), addr_of_mut!(PyFrozenSet_Type)) != 0) as c_int
131}
132
133#[inline]
134#[cfg(Py_3_10)]
135pub unsafe fn PySet_CheckExact(op: *mut PyObject) -> c_int {
136    crate::Py_IS_TYPE(op, addr_of_mut!(PySet_Type))
137}
138
139extern "C" {
140    #[cfg(PyPy)]
141    #[link_name = "PyPySet_Check"]
142    pub fn PySet_Check(ob: *mut PyObject) -> c_int;
143}
144
145#[inline]
146#[cfg(not(PyPy))]
147pub unsafe fn PySet_Check(ob: *mut PyObject) -> c_int {
148    (Py_TYPE(ob) == addr_of_mut!(PySet_Type)
149        || PyType_IsSubtype(Py_TYPE(ob), addr_of_mut!(PySet_Type)) != 0) as c_int
150}