use crate::UnsafeStdManuallyDrop;
use crate::core::trig::TrigManuallyDrop;
use core::marker::PhantomData;
pub struct SafeManuallyDrop<T, Trig> where T: ?Sized, Trig: TrigManuallyDrop {
state: StateManuallyDrop,
_pp: PhantomData<Trig>,
value: UnsafeStdManuallyDrop<T>,
}
crate::__codegen! {
@use;
@impl SafeManuallyDrop {
is_safe: true,
is_always_compatible: false,
is_maybe_compatible: true,
is_repr_transparent: false,
fn {
new |value| {
Self {
value,
state: EMPTY_STATE,
_pp: PhantomData
}
}
as_unsafestd_manuallydrop |sself| {
&sself.value
}
as_mut_unsafestd_manuallydrop |sself| {
&mut sself.value
}
force_as_value |sself| {
&sself.value
}
force_as_mut_value |sself| {
&mut sself.value
}
}
}
}
impl<T, Trig> Drop for SafeManuallyDrop<T, Trig> where T: ?Sized, Trig: TrigManuallyDrop {
#[inline]
fn drop(&mut self) {
self.state.if_empty_then_run_trigfn::<Trig, _>(
"expected ManuallyDrop::drop(&mut value)",
|| unsafe {
UnsafeStdManuallyDrop::drop(&mut self.value);
}
);
}
}