#[macro_export]
macro_rules! same_variant_pair {
($lhs:expr, $rhs:expr, |$a:ident, $b:ident| $call:expr, $fallback:expr) => {
match ($lhs.dtype(), $rhs.dtype()) {
($crate::DType::F32, $crate::DType::F32) => {
match ($lhs.as_typed::<f32>(), $rhs.as_typed::<f32>()) {
(Some($a), Some($b)) => $call.map(Tensor::from_typed::<f32>),
_ => $fallback,
}
}
($crate::DType::F64, $crate::DType::F64) => {
match ($lhs.as_typed::<f64>(), $rhs.as_typed::<f64>()) {
(Some($a), Some($b)) => $call.map(Tensor::from_typed::<f64>),
_ => $fallback,
}
}
($crate::DType::C32, $crate::DType::C32) => {
match (
$lhs.as_typed::<$crate::Complex32>(),
$rhs.as_typed::<$crate::Complex32>(),
) {
(Some($a), Some($b)) => $call.map(Tensor::from_typed::<$crate::Complex32>),
_ => $fallback,
}
}
($crate::DType::C64, $crate::DType::C64) => {
match (
$lhs.as_typed::<$crate::Complex64>(),
$rhs.as_typed::<$crate::Complex64>(),
) {
(Some($a), Some($b)) => $call.map(Tensor::from_typed::<$crate::Complex64>),
_ => $fallback,
}
}
_ => $fallback,
}
};
}
#[macro_export]
macro_rules! same_variant_unary {
($input:expr, |$t:ident| $call:expr, |$value:ident| $wrap:expr, $fallback:expr) => {
match $input.dtype() {
$crate::DType::F32 => match $input.as_typed::<f32>() {
Some($t) => $call.map(|$value| $wrap),
None => $fallback,
},
$crate::DType::F64 => match $input.as_typed::<f64>() {
Some($t) => $call.map(|$value| $wrap),
None => $fallback,
},
$crate::DType::C32 => match $input.as_typed::<$crate::Complex32>() {
Some($t) => $call.map(|$value| $wrap),
None => $fallback,
},
$crate::DType::C64 => match $input.as_typed::<$crate::Complex64>() {
Some($t) => $call.map(|$value| $wrap),
None => $fallback,
},
_ => $fallback,
}
};
}