pyo3_ffi/cpython/
setobject.rs1#[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}