macro_rules! impl_volume_binop {
($self:ident, $release_unchecked:ident, $checked:ident, $checked_fn:ident,
$unchecked:ident, $unchecked_fn:ident,
$checked_op:expr, $unchecked_op:expr, $error:ty,
$gen_param_name:tt, $gen_param_type:tt) => {
impl<$gen_param_name: $gen_param_type>
$release_unchecked<
$self<$gen_param_name>,
$self<$gen_param_name>,
Result<$self<$gen_param_name>, $error>,
> for $self<$gen_param_name>
{
}
impl<$gen_param_name: $gen_param_type>
$release_unchecked<
$self<$gen_param_name>,
$self<$gen_param_name>,
Result<$self<$gen_param_name>, $error>,
> for &$self<$gen_param_name>
{
}
impl<$gen_param_name: $gen_param_type>
$checked<$self<$gen_param_name>, Result<$self<$gen_param_name>, $error>>
for $self<$gen_param_name>
{
fn $checked_fn(
self,
rhs: impl Borrow<$self<$gen_param_name>>,
) -> Result<$self<$gen_param_name>, $error> {
let rhs = *rhs.borrow();
$checked_op(self, rhs)
}
}
impl<$gen_param_name: $gen_param_type>
$checked<$self<$gen_param_name>, Result<$self<$gen_param_name>, $error>>
for &$self<$gen_param_name>
{
fn $checked_fn(
self,
rhs: impl Borrow<$self<$gen_param_name>>,
) -> Result<$self<$gen_param_name>, $error> {
(*self).$checked_fn(rhs)
}
}
impl<$gen_param_name: $gen_param_type>
$unchecked<$self<$gen_param_name>, $self<$gen_param_name>> for $self<$gen_param_name>
{
fn $unchecked_fn(
self,
rhs: impl Borrow<$self<$gen_param_name>>,
) -> $self<$gen_param_name> {
let rhs = *rhs.borrow();
$unchecked_op(self, rhs)
}
}
impl<$gen_param_name: $gen_param_type>
$unchecked<$self<$gen_param_name>, $self<$gen_param_name>> for &$self<$gen_param_name>
{
fn $unchecked_fn(
self,
rhs: impl Borrow<$self<$gen_param_name>>,
) -> $self<$gen_param_name> {
(*self).$unchecked_fn(rhs)
}
}
};
}