use crate::{GcRefCell, Trace, Tracer, WeakGc, pointers::RawWeakMap};
pub(crate) struct WeakMapBox<K: Trace + ?Sized + 'static, V: Trace + Sized + 'static> {
pub(crate) map: WeakGc<GcRefCell<RawWeakMap<K, V>>>,
}
pub(crate) trait ErasedWeakMapBox {
fn clear_dead_entries(&self);
fn is_live(&self) -> bool;
unsafe fn trace(&self, tracer: &mut Tracer);
}
impl<K: Trace + ?Sized, V: Trace + Clone> ErasedWeakMapBox for WeakMapBox<K, V> {
fn clear_dead_entries(&self) {
if let Some(map) = self.map.upgrade()
&& let Ok(mut map) = map.try_borrow_mut()
{
map.clear_expired();
}
}
fn is_live(&self) -> bool {
self.map.upgrade().is_some()
}
unsafe fn trace(&self, tracer: &mut Tracer) {
if self.map.upgrade().is_some() {
unsafe { self.map.trace(tracer) }
}
}
}