use std::ptr::NonNull;
use crate::function::Configuration;
use crate::function::memo::Memo;
pub(super) struct DeletedEntries<C: Configuration> {
memos: boxcar::Vec<SharedBox<Memo<'static, C>>>,
}
#[allow(clippy::undocumented_unsafe_blocks)] unsafe impl<T: Send> Send for SharedBox<T> {}
#[allow(clippy::undocumented_unsafe_blocks)] unsafe impl<T: Sync> Sync for SharedBox<T> {}
impl<C: Configuration> Default for DeletedEntries<C> {
fn default() -> Self {
Self {
memos: Default::default(),
}
}
}
impl<C: Configuration> DeletedEntries<C> {
pub(super) unsafe fn push(&self, memo: NonNull<Memo<'_, C>>) {
let memo =
unsafe { std::mem::transmute::<NonNull<Memo<'_, C>>, NonNull<Memo<'static, C>>>(memo) };
self.memos.push(SharedBox(memo));
}
pub(super) fn clear(&mut self) {
self.memos.clear();
}
}
struct SharedBox<T>(NonNull<T>);
impl<T> Drop for SharedBox<T> {
fn drop(&mut self) {
unsafe { drop(Box::from_raw(self.0.as_ptr())) };
}
}