use crate::ffi::{self, Py_ssize_t, PY_SSIZE_T_MAX};
macro_rules! pyo3_exception {
($doc: expr, $name: ident, $base: ty) => {
#[doc = $doc]
#[repr(transparent)]
pub struct $name($crate::PyAny);
$crate::impl_exception_boilerplate!($name);
$crate::create_exception_type_object!(pyo3_runtime, $name, $base, Some($doc));
};
}
pub(crate) fn get_ssize_index(index: usize) -> Py_ssize_t {
index.min(PY_SSIZE_T_MAX as usize) as Py_ssize_t
}
pub(crate) fn clear_eq(f: Option<ffi::inquiry>, g: ffi::inquiry) -> bool {
#[cfg(fn_ptr_eq)]
#[expect(clippy::incompatible_msrv, reason = "guarded by cfg(fn_ptr_eq)")]
{
let Some(f) = f else { return false };
std::ptr::fn_addr_eq(f, g)
}
#[cfg(not(fn_ptr_eq))]
{
f == Some(g)
}
}
pub(crate) fn traverse_eq(f: Option<ffi::traverseproc>, g: ffi::traverseproc) -> bool {
#[cfg(fn_ptr_eq)]
#[expect(clippy::incompatible_msrv, reason = "guarded by cfg(fn_ptr_eq)")]
{
let Some(f) = f else { return false };
std::ptr::fn_addr_eq(f, g)
}
#[cfg(not(fn_ptr_eq))]
{
f == Some(g)
}
}