use crate::{Compact, Compactable, FieldDeref, FieldDerefMut};
#[doc(hidden)]
#[inline]
pub unsafe fn get_ref_helper<T, U>(
compact: &Compact<T>,
f: impl FnOnce(&T) -> Option<&U>,
) -> Option<<U as FieldDeref>::Target<'_>>
where
T: Compactable,
U: FieldDeref,
{
compact.map_ref(|tmp| f(tmp).map(|tmp| tmp.force_deref()))
}
#[doc(hidden)]
#[inline]
pub unsafe fn get_mut_helper<T, U>(
compact: &mut Compact<T>,
f: impl FnOnce(&mut T) -> Option<&mut U>,
) -> Option<<U as FieldDerefMut>::Target<'_>>
where
T: Compactable,
U: FieldDerefMut,
{
compact.map_mut(|tmp| f(tmp).map(|tmp| tmp.force_deref_mut()))
}
#[macro_export]
macro_rules! get_ref {
($compact:expr, $variant:path) => {
unsafe {
$crate::get_ref_helper(&$compact, |tmp| match tmp {
$variant(inner) => Some(inner),
_ => None,
})
}
};
}
#[macro_export]
macro_rules! get_mut {
($compact:expr, $variant:path) => {
unsafe {
$crate::get_mut_helper(&mut $compact, |tmp| match tmp {
$variant(inner) => Some(inner),
_ => None,
})
}
};
}