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#[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
42extern "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 }
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}