macro_rules! from_rational {
(
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $( $from_b:expr ),+
) => {
$( from_rational![@ for: $for + $for_b, num: $num, den: $den, from: $from + $from_b]; )+
};
(@
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $from_b:expr
) => {
$crate::all::impl_from!(for: $for + $for_b, from: @$from+$from_b, arg:f, body: {
Self {
num: f.num.into(),
den: f.den.into(),
}
});
};
}
pub(crate) use from_rational;
macro_rules! from_integer {
(primint
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $( $from_b:expr ),+
) => {
$(
from_integer![@primint for: $for + $for_b, num: $num, den: $den,
from: $from + $from_b];
)+
};
(@primint
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $from_b:expr
) => {
devela::paste! {
$crate::all::impl_from!(for: $for + $for_b, from: $from+$from_b, arg:f, body: {
Self {
num: f.into(),
den: <[<$den$for_b>] as $crate::all::ConstOne>::ONE,
}
});
$crate::all::impl_from!(for: $for + $for_b, from: &$from+$from_b, arg:f, body: {
Self {
num: (*f).into(),
den: <[<$den$for_b>] as $crate::all::ConstOne>::ONE,
}
});
}
};
(non0
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $( $from_b:expr ),+
) => {
$(
from_integer![@non0 for: $for + $for_b, num: $num, den: $den,
from: $from + $from_b];
)+
};
(@non0
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $from_b:expr
) => {
devela::paste! {
$crate::all::impl_from!(for: $for + $for_b, from: @$from+$from_b, arg:f, body: {
Self {
num: f.get().into(),
den: <[<$den$for_b>] as $crate::all::ConstOne>::ONE,
}
});
}
};
}
pub(crate) use from_integer;
#[cfg(feature = "try_from")]
macro_rules! try_from_rational {
(
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $( $from_b:expr ),+
) => {
$(
try_from_rational![@ for: $for + $for_b, num: $num, den: $den,
from: $from + $from_b];
)+
};
(@
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $from_b:expr
) => {
$crate::all::impl_from!(try for: $for + $for_b, from: @$from+$from_b, arg:f, body: {
Ok(Self {
num: f.num.try_into()?,
den: f.den.try_into()?,
})
});
};
}
#[cfg(not(feature = "try_from"))]
macro_rules! try_from_rational {
($($tt:tt)*) => {};
}
pub(crate) use try_from_rational;
#[cfg(feature = "try_from")]
macro_rules! try_from_integer {
(primint
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $( $from_b:expr ),+
) => {
$(
try_from_integer![@primint for: $for + $for_b, num: $num, den: $den,
from: $from + $from_b];
)+
};
(@primint
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $from_b:expr
) => {
devela::paste! {
$crate::all::impl_from!(try for: $for + $for_b, from: $from+$from_b, arg:f, body: {
Ok(Self {
num: f.try_into()?,
den: <[<$den$for_b>] as $crate::all::ConstOne>::ONE,
})
});
$crate::all::impl_from!(try for: $for + $for_b, from: &$from+$from_b, arg:f, body: {
Ok(Self {
num: (*f).try_into()?,
den: <[<$den$for_b>] as $crate::all::ConstOne>::ONE,
})
});
}
};
(non0
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $( $from_b:expr ),+
) => {
$(
try_from_integer![@non0 for: $for + $for_b, num: $num, den: $den,
from: $from + $from_b];
)+
};
(@non0
for: $for:ident + $for_b:expr,
num: $num:ident, den: $den:ident,
from: $from:ident + $from_b:expr
) => {
devela::paste! {
$crate::all::impl_from!(try for: $for + $for_b, from: @$from+$from_b, arg:f, body: {
Ok(Self {
num: f.get().try_into()?,
den: <[<$den$for_b>] as $crate::all::ConstOne>::ONE,
})
});
}
};
}
#[cfg(not(feature = "try_from"))]
macro_rules! try_from_integer {
($($tt:tt)*) => {};
}
pub(crate) use try_from_integer;