use crate::{imports, sealed};
pub trait DropGuard: sealed::Sealed {
#[doc(hidden)] fn from_id(id: usize) -> Self;
#[doc(hidden)] fn as_id(&self) -> usize;
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct Forget(usize);
impl sealed::Sealed for Forget {}
impl DropGuard for Forget {
fn from_id(id: usize) -> Self {
Self(id)
}
fn as_id(&self) -> usize {
self.0
}
}
#[derive(Debug)]
#[repr(C)]
pub struct Register(usize);
impl sealed::Sealed for Register {}
impl DropGuard for Register {
fn from_id(id: usize) -> Self {
Self(id)
}
fn as_id(&self) -> usize {
self.0
}
}
impl Drop for Register {
#[inline(always)]
fn drop(&mut self) {
unsafe { imports::drop_externref(self.0) };
}
}