#[macro_export]
macro_rules! impl_compare {
($name: ident) => {
#[$crate::pyo3::pymethods]
impl $name {
#![allow(clippy::use_self)]
pub fn __richcmp__(&self, object: &Self, cmp: $crate::pyo3::basic::CompareOp) -> bool {
let result = ::std::cmp::PartialOrd::partial_cmp(self, object);
match cmp {
$crate::pyo3::basic::CompareOp::Lt => {
matches!(result, Some(::std::cmp::Ordering::Less))
}
$crate::pyo3::basic::CompareOp::Le => {
!matches!(result, Some(::std::cmp::Ordering::Greater))
}
$crate::pyo3::basic::CompareOp::Eq => {
matches!(result, Some(::std::cmp::Ordering::Equal))
}
$crate::pyo3::basic::CompareOp::Ne => {
!matches!(result, Some(::std::cmp::Ordering::Equal))
}
$crate::pyo3::basic::CompareOp::Gt => {
matches!(result, Some(::std::cmp::Ordering::Greater))
}
$crate::pyo3::basic::CompareOp::Ge => {
!matches!(result, Some(::std::cmp::Ordering::Less))
}
}
}
}
};
}
#[macro_export]
macro_rules! impl_hash {
($name: ident) => {
#[$crate::pyo3::pymethods]
impl $name {
pub fn __hash__(&self) -> isize {
let mut hasher = ::std::collections::hash_map::DefaultHasher::new();
::std::hash::Hash::hash($crate::PyWrapper::as_inner(self), &mut hasher);
let bytes = ::std::hash::Hasher::finish(&hasher).to_ne_bytes();
isize::from_ne_bytes(bytes)
}
}
};
}
#[macro_export]
macro_rules! impl_repr {
($name: ident) => {
#[$crate::pyo3::pymethods]
impl $name {
pub fn __repr__(&self) -> String {
format!("{:?}", $crate::PyWrapper::as_inner(self))
}
}
};
}
#[macro_export]
macro_rules! impl_str {
($name: ident) => {
#[$crate::pyo3::pymethods]
impl $name {
pub fn __str__(&self) -> String {
format!("{}", $crate::PyWrapper::as_inner(self))
}
}
};
}
#[macro_export]
macro_rules! impl_from_str {
($name: ident, $error: ty) => {
impl ::std::str::FromStr for $name {
type Err = $error;
fn from_str(input: &str) -> Result<Self, Self::Err> {
<<Self as $crate::PyWrapper>::Inner as ::std::str::FromStr>::from_str(input)
.map(Self::from)
.map_err(
<$error as From<
<<Self as $crate::PyWrapper>::Inner as ::std::str::FromStr>::Err,
>>::from,
)
}
}
};
}
#[macro_export]
macro_rules! impl_parse {
($name: ident) => {
#[$crate::pyo3::pymethods]
impl $name {
#[staticmethod]
pub fn parse(input: &str) -> $crate::pyo3::PyResult<Self> {
<Self as std::str::FromStr>::from_str(input)
.map(Self::from)
.map_err($crate::ToPythonError::to_py_err)
}
}
};
}
#[macro_export]
macro_rules! impl_as_mut_for_wrapper {
($py_type: ident) => {
impl AsMut<<$py_type as $crate::PyWrapper>::Inner> for $py_type {
fn as_mut(&mut self) -> &mut <$py_type as $crate::PyWrapper>::Inner {
&mut self.0
}
}
};
}