#[macro_export]
macro_rules! transparent_newtype {
{
$( #[ $attr:meta ] )*
$vis:vis
struct
$newtype:ident
$(< $($generic:ident),+ $(,)? >)?
($inner:ty);
} => {
$( #[$attr] )*
#[repr(transparent)]
$vis struct $newtype $(< $($generic),* >)? ($inner);
// safety: `$newtype` is `#[repr(transparent)]` referring to `$inner`
unsafe impl $(< $($generic),* >)? $crate::AsRepr<$inner>
for $newtype $(< $($generic),* >)? { }
unsafe impl $(< $($generic),* >)? $crate::AsRepr<&$inner>
for &$newtype $(< $($generic),* >)? { }
unsafe impl $(< $($generic),* >)? $crate::AsRepr<&mut $inner>
for &mut $newtype $(< $($generic),* >)? { }
unsafe impl $(< $($generic),* >)?
$crate::AsRepr<core::pin::Pin<&$inner>>
for core::pin::Pin<&$newtype $(< $($generic),* >)?> { }
unsafe impl $(< $($generic),* >)?
$crate::AsRepr<core::pin::Pin<&mut $inner>>
for core::pin::Pin<&mut $newtype $(< $($generic),* >)?> { }
};
}
#[macro_export]
macro_rules! as_repr_cascading {
($outer:ty as $inner:ty; $($repr:ty),* $(,)?) => {
$(
unsafe impl $crate::AsRepr<$repr> for $outer
where
Self: $crate::AsRepr<$inner>,
$inner: $crate::AsRepr<$repr>,
{ }
)*
};
}