macro_rules! make_thin_wrapper {
($name:ident, $t:ty, $dropfunc:expr) => {
#[repr(transparent)]
#[derive(Debug)]
pub struct $name(pub(crate) $t);
impl_wrapper!($name, $t, $dropfunc, 0);
};
}
macro_rules! impl_wrapper {
($name:ident, $t:ty, $dropfunc:expr, $rawfield:tt) => {
impl $name {
pub unsafe fn unwrap(self) -> $t {
let inner = self.$rawfield;
std::mem::forget(self);
inner
}
}
impl Drop for $name {
#[allow(unused_unsafe)]
fn drop(&mut self) {
unsafe {
($dropfunc)(self.$rawfield);
}
}
}
impl std::convert::AsRef<$t> for $name {
fn as_ref(&self) -> &$t {
&self.$rawfield
}
}
impl std::convert::AsMut<$t> for $name {
fn as_mut(&mut self) -> &mut $t {
&mut self.$rawfield
}
}
impl std::ops::Deref for $name {
type Target = $t;
#[inline]
fn deref(&self) -> &Self::Target {
&self.$rawfield
}
}
impl std::ops::DerefMut for $name {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.$rawfield
}
}
};
}