1use crate::object::*;
2use crate::pyport::Py_ssize_t;
3use core::ffi::c_int;
4
5#[cfg(not(RustPython))]
6extern_libpython! {
7 #[cfg_attr(PyPy, link_name = "PyPySet_Type")]
8 pub static mut PySet_Type: PyTypeObject;
9 #[cfg_attr(PyPy, link_name = "PyPyFrozenSet_Type")]
10 pub static mut PyFrozenSet_Type: PyTypeObject;
11 pub static mut PySetIter_Type: PyTypeObject;
12}
13
14extern_libpython! {
15 #[cfg_attr(PyPy, link_name = "PyPySet_New")]
16 pub fn PySet_New(arg1: *mut PyObject) -> *mut PyObject;
17 #[cfg_attr(PyPy, link_name = "PyPyFrozenSet_New")]
18 pub fn PyFrozenSet_New(arg1: *mut PyObject) -> *mut PyObject;
19
20 #[cfg_attr(PyPy, link_name = "PyPySet_Add")]
21 pub fn PySet_Add(set: *mut PyObject, key: *mut PyObject) -> c_int;
22 #[cfg_attr(PyPy, link_name = "PyPySet_Clear")]
23 pub fn PySet_Clear(set: *mut PyObject) -> c_int;
24 #[cfg_attr(PyPy, link_name = "PyPySet_Contains")]
25 pub fn PySet_Contains(anyset: *mut PyObject, key: *mut PyObject) -> c_int;
26 #[cfg_attr(PyPy, link_name = "PyPySet_Discard")]
27 pub fn PySet_Discard(set: *mut PyObject, key: *mut PyObject) -> c_int;
28 #[cfg_attr(PyPy, link_name = "PyPySet_Pop")]
29 pub fn PySet_Pop(set: *mut PyObject) -> *mut PyObject;
30 #[cfg_attr(PyPy, link_name = "PyPySet_Size")]
31 pub fn PySet_Size(anyset: *mut PyObject) -> Py_ssize_t;
32
33 #[cfg(any(PyPy, RustPython))]
34 #[cfg_attr(PyPy, link_name = "PyPyFrozenSet_CheckExact")]
35 pub fn PyFrozenSet_CheckExact(ob: *mut PyObject) -> c_int;
36
37 #[cfg(any(PyPy, RustPython))]
38 #[cfg_attr(PyPy, link_name = "PyPyFrozenSet_Check")]
39 pub fn PyFrozenSet_Check(ob: *mut PyObject) -> c_int;
40
41 #[cfg(any(PyPy, RustPython))]
42 #[cfg_attr(PyPy, link_name = "PyPyAnySet_CheckExact")]
43 pub fn PyAnySet_CheckExact(ob: *mut PyObject) -> c_int;
44
45 #[cfg(RustPython)]
46 pub fn PyAnySet_Check(ob: *mut PyObject) -> c_int;
47
48 #[cfg(RustPython)]
49 pub fn PySet_CheckExact(op: *mut PyObject) -> c_int;
50
51 #[cfg(any(PyPy, RustPython))]
52 #[cfg_attr(PyPy, link_name = "PyPySet_Check")]
53 pub fn PySet_Check(ob: *mut PyObject) -> c_int;
54}
55
56#[inline]
57#[cfg(not(any(PyPy, GraalPy, RustPython)))]
58pub unsafe fn PyFrozenSet_CheckExact(ob: *mut PyObject) -> c_int {
59 (Py_TYPE(ob) == &raw mut PyFrozenSet_Type) as c_int
60}
61
62#[inline]
63#[cfg(not(any(PyPy, RustPython)))]
64pub unsafe fn PyFrozenSet_Check(ob: *mut PyObject) -> c_int {
65 (Py_TYPE(ob) == &raw mut PyFrozenSet_Type
66 || PyType_IsSubtype(Py_TYPE(ob), &raw mut PyFrozenSet_Type) != 0) as c_int
67}
68
69#[inline]
70#[cfg(not(any(PyPy, RustPython)))]
71pub unsafe fn PyAnySet_CheckExact(ob: *mut PyObject) -> c_int {
72 (Py_TYPE(ob) == &raw mut PySet_Type || Py_TYPE(ob) == &raw mut PyFrozenSet_Type) as c_int
73}
74
75#[inline]
76#[cfg(not(RustPython))]
77pub unsafe fn PyAnySet_Check(ob: *mut PyObject) -> c_int {
78 (PyAnySet_CheckExact(ob) != 0
79 || PyType_IsSubtype(Py_TYPE(ob), &raw mut PySet_Type) != 0
80 || PyType_IsSubtype(Py_TYPE(ob), &raw mut PyFrozenSet_Type) != 0) as c_int
81}
82
83#[inline]
84#[cfg(all(Py_3_10, not(RustPython)))]
85pub unsafe fn PySet_CheckExact(op: *mut PyObject) -> c_int {
86 crate::Py_IS_TYPE(op, &raw mut PySet_Type)
87}
88
89#[inline]
90#[cfg(not(any(PyPy, RustPython)))]
91pub unsafe fn PySet_Check(ob: *mut PyObject) -> c_int {
92 (Py_TYPE(ob) == &raw mut PySet_Type || PyType_IsSubtype(Py_TYPE(ob), &raw mut PySet_Type) != 0)
93 as c_int
94}