Skip to main content

pyo3_ffi/cpython/
setobject.rs

1#[cfg(Py_GIL_DISABLED)]
2use crate::pyatomic::_Py_atomic_load_ssize_relaxed;
3#[cfg(not(any(PyPy, GraalPy)))]
4use crate::{PyAnySet_Check, PyObject, Py_hash_t, Py_ssize_t};
5
6pub const PySet_MINSIZE: usize = 8;
7
8#[cfg(not(any(PyPy, GraalPy)))]
9#[repr(C)]
10#[derive(Debug)]
11pub struct setentry {
12    pub key: *mut PyObject,
13    pub hash: Py_hash_t,
14}
15
16#[cfg(not(any(PyPy, GraalPy)))]
17#[repr(C)]
18#[derive(Debug)]
19pub struct PySetObject {
20    pub ob_base: PyObject,
21    pub fill: Py_ssize_t,
22    pub used: Py_ssize_t,
23    pub mask: Py_ssize_t,
24    pub table: *mut setentry,
25    pub hash: Py_hash_t,
26    pub finger: Py_ssize_t,
27    pub smalltable: [setentry; PySet_MINSIZE],
28    pub weakreflist: *mut PyObject,
29}
30
31#[inline]
32#[cfg(not(any(PyPy, GraalPy)))]
33pub(crate) unsafe fn _PySet_CAST(so: *mut PyObject) -> *mut PySetObject {
34    debug_assert_eq!(PyAnySet_Check(so), 1);
35    so.cast()
36}
37
38#[inline]
39#[cfg(not(any(PyPy, GraalPy)))]
40pub unsafe fn PySet_GET_SIZE(so: *mut PyObject) -> Py_ssize_t {
41    let so = _PySet_CAST(so);
42    #[cfg(Py_GIL_DISABLED)]
43    {
44        _Py_atomic_load_ssize_relaxed(&raw const (*so).used)
45    }
46    #[cfg(not(Py_GIL_DISABLED))]
47    {
48        (*so).used
49    }
50}
⚠️ Internal Docs ⚠️ Not Public API 👉 Official Docs Here