use replace_drop::{ReplaceDrop, ReplaceDropImpl};
struct Inner;
impl Drop for Inner {
fn drop(&mut self) {
println!("Inner!");
}
}
struct Outer(Inner);
impl Drop for Outer {
fn drop(&mut self) {
println!("Outer!");
}
}
unsafe impl ReplaceDropImpl for Inner {
unsafe fn drop(&mut self) {
println!("Inner 2!");
}
}
unsafe impl ReplaceDropImpl for Outer {
unsafe fn drop(&mut self) {
println!("Outer 2!");
std::ptr::drop_in_place(&mut self.0 as *mut _);
ReplaceDropImpl::drop(&mut self.0);
std::ptr::drop_in_place(self as *mut _);
}
}
fn main() {
let _ = ReplaceDrop::new(Outer(Inner));
}