use std::{mem::MaybeUninit, ops, pin};
use crate::base::marker::ThreadBound;
#[derive(Debug)]
#[repr(transparent)]
pub struct Occupied<'a, T> {
pub(super) value: &'a mut MaybeUninit<T>,
pub(super) bound: ThreadBound,
}
impl<'a, T> Occupied<'a, T> {
pub fn into_inner(self) -> T {
let this = std::mem::ManuallyDrop::new(self);
unsafe { this.value.assume_init_read() }
}
pub fn with_pin<R>(self, run: impl for<'p> FnOnce(pin::Pin<&'p mut T>) -> R) -> R {
run(unsafe { pin::Pin::new_unchecked(self.value.assume_init_mut()) })
}
}
impl<T> ops::Deref for Occupied<'_, T> {
type Target = T;
fn deref(&self) -> &T {
unsafe { self.value.assume_init_ref() }
}
}
impl<T> Drop for Occupied<'_, T> {
fn drop(&mut self) {
unsafe { self.value.assume_init_drop() };
}
}