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::ffi::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// skipped _PySet_Dummy
43
44extern "C" {
45    #[cfg(not(Py_LIMITED_API))]
46    #[cfg_attr(PyPy, link_name = "_PyPySet_NextEntry")]
47    pub fn _PySet_NextEntry(
48        set: *mut PyObject,
49        pos: *mut Py_ssize_t,
50        key: *mut *mut PyObject,
51        hash: *mut super::Py_hash_t,
52    ) -> c_int;
53
54    // skipped non-limited _PySet_Update
55}
56
57#[cfg_attr(windows, link(name = "pythonXY"))]
58extern "C" {
59    #[cfg_attr(PyPy, link_name = "PyPySet_Type")]
60    pub static mut PySet_Type: PyTypeObject;
61    #[cfg_attr(PyPy, link_name = "PyPyFrozenSet_Type")]
62    pub static mut PyFrozenSet_Type: PyTypeObject;
63    pub static mut PySetIter_Type: PyTypeObject;
64}
65
66extern "C" {
67    #[cfg_attr(PyPy, link_name = "PyPySet_New")]
68    pub fn PySet_New(arg1: *mut PyObject) -> *mut PyObject;
69    #[cfg_attr(PyPy, link_name = "PyPyFrozenSet_New")]
70    pub fn PyFrozenSet_New(arg1: *mut PyObject) -> *mut PyObject;
71
72    #[cfg_attr(PyPy, link_name = "PyPySet_Add")]
73    pub fn PySet_Add(set: *mut PyObject, key: *mut PyObject) -> c_int;
74    #[cfg_attr(PyPy, link_name = "PyPySet_Clear")]
75    pub fn PySet_Clear(set: *mut PyObject) -> c_int;
76    #[cfg_attr(PyPy, link_name = "PyPySet_Contains")]
77    pub fn PySet_Contains(anyset: *mut PyObject, key: *mut PyObject) -> c_int;
78    #[cfg_attr(PyPy, link_name = "PyPySet_Discard")]
79    pub fn PySet_Discard(set: *mut PyObject, key: *mut PyObject) -> c_int;
80    #[cfg_attr(PyPy, link_name = "PyPySet_Pop")]
81    pub fn PySet_Pop(set: *mut PyObject) -> *mut PyObject;
82    #[cfg_attr(PyPy, link_name = "PyPySet_Size")]
83    pub fn PySet_Size(anyset: *mut PyObject) -> Py_ssize_t;
84
85    #[cfg(PyPy)]
86    #[link_name = "PyPyFrozenSet_CheckExact"]
87    pub fn PyFrozenSet_CheckExact(ob: *mut PyObject) -> c_int;
88}
89
90#[inline]
91#[cfg(not(any(PyPy, GraalPy)))]
92pub unsafe fn PyFrozenSet_CheckExact(ob: *mut PyObject) -> c_int {
93    (Py_TYPE(ob) == addr_of_mut!(PyFrozenSet_Type)) as c_int
94}
95
96extern "C" {
97    #[cfg(PyPy)]
98    #[link_name = "PyPyFrozenSet_Check"]
99    pub fn PyFrozenSet_Check(ob: *mut PyObject) -> c_int;
100}
101
102#[inline]
103#[cfg(not(PyPy))]
104pub unsafe fn PyFrozenSet_Check(ob: *mut PyObject) -> c_int {
105    (Py_TYPE(ob) == addr_of_mut!(PyFrozenSet_Type)
106        || PyType_IsSubtype(Py_TYPE(ob), addr_of_mut!(PyFrozenSet_Type)) != 0) as c_int
107}
108
109extern "C" {
110    #[cfg(PyPy)]
111    #[link_name = "PyPyAnySet_CheckExact"]
112    pub fn PyAnySet_CheckExact(ob: *mut PyObject) -> c_int;
113}
114
115#[inline]
116#[cfg(not(PyPy))]
117pub unsafe fn PyAnySet_CheckExact(ob: *mut PyObject) -> c_int {
118    (Py_TYPE(ob) == addr_of_mut!(PySet_Type) || Py_TYPE(ob) == addr_of_mut!(PyFrozenSet_Type))
119        as c_int
120}
121
122#[inline]
123pub unsafe fn PyAnySet_Check(ob: *mut PyObject) -> c_int {
124    (PyAnySet_CheckExact(ob) != 0
125        || PyType_IsSubtype(Py_TYPE(ob), addr_of_mut!(PySet_Type)) != 0
126        || PyType_IsSubtype(Py_TYPE(ob), addr_of_mut!(PyFrozenSet_Type)) != 0) as c_int
127}
128
129#[inline]
130#[cfg(Py_3_10)]
131pub unsafe fn PySet_CheckExact(op: *mut PyObject) -> c_int {
132    crate::Py_IS_TYPE(op, addr_of_mut!(PySet_Type))
133}
134
135extern "C" {
136    #[cfg(PyPy)]
137    #[link_name = "PyPySet_Check"]
138    pub fn PySet_Check(ob: *mut PyObject) -> c_int;
139}
140
141#[inline]
142#[cfg(not(PyPy))]
143pub unsafe fn PySet_Check(ob: *mut PyObject) -> c_int {
144    (Py_TYPE(ob) == addr_of_mut!(PySet_Type)
145        || PyType_IsSubtype(Py_TYPE(ob), addr_of_mut!(PySet_Type)) != 0) as c_int
146}