#[macro_export]
macro_rules! gen_mut {
($m:ty => $code:expr) => {
match <$m as $crate::Mutability>::mutability() {
$crate::MutabilityEnum::Shared(proof) => {
macro_rules! into_gen {
() => {
|genref| $crate::GenRef::gen_from_shared(genref, proof)
};
(&gen $genref:expr) => {
$crate::GenRef::gen_from_shared(&$genref, proof)
};
($genref:expr) => {
$crate::GenRef::gen_from_shared($genref, proof)
};
}
macro_rules! from_gen {
() => {
|genref| $crate::GenRef::gen_into_shared(genref, proof)
};
($reference:expr) => {
$crate::GenRef::gen_into_shared($reference, proof)
};
}
#[allow(unused_macros)]
macro_rules! switch_shared_mut {
($shared:tt $mutable:tt) => {
$crate::__unwrap($shared);
};
($shared:expr, $mutable:expr) => {
$shared
};
}
$code
}
$crate::MutabilityEnum::Mutable(proof) => {
macro_rules! into_gen {
() => {
|genref| $crate::GenRef::gen_from_mut(genref, proof)
};
(&gen $genref:expr) => {
$crate::GenRef::gen_from_mut(&mut $genref, proof)
};
($genref:expr) => {
$crate::GenRef::gen_from_mut($genref, proof)
};
}
macro_rules! from_gen {
() => {
|genref| $crate::GenRef::gen_into_mut(genref, proof)
};
($reference:expr) => {
$crate::GenRef::gen_into_mut($reference, proof)
};
}
#[allow(unused_macros)]
macro_rules! switch_shared_mut {
($shared:tt $mutable:tt) => {
$crate::__unwrap!($mutable)
};
($shared:expr, $mutable:expr) => {
$mutable
};
}
$code
}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __unwrap{
( { $($items:tt)* } ) => {
$($items)*
}
}
#[macro_export]
macro_rules! field {
(&gen $genref:tt $($field:tt)+) => {
$crate::GenRef::map($genref, |r| & r $($field)+, |r| &mut r $($field)+)
};
}