12use std::{3 borrow::{Borrow, BorrowMut},4 hash::BuildHasherDefault,5 ops::{Deref, DerefMut},6};78use gcmodule::{Trace, Tracer};9use rustc_hash::{FxHashMap, FxHashSet};101112#[derive(Debug, Clone)]13pub struct TraceBox<T: ?Sized>(pub Box<T>);1415impl<T: ?Sized + Trace> Trace for TraceBox<T> {16 fn trace(&self, tracer: &mut Tracer) {17 self.0.trace(tracer)18 }1920 fn is_type_tracked() -> bool {21 return true;22 }23}242526impl<T: ?Sized> From<Box<T>> for TraceBox<T> {27 fn from(inner: Box<T>) -> Self {28 Self(inner)29 }30}3132impl<T: ?Sized> Deref for TraceBox<T> {33 type Target = T;3435 fn deref(&self) -> &Self::Target {36 &self.037 }38}39impl<T: Trace + ?Sized> DerefMut for TraceBox<T> {40 fn deref_mut(&mut self) -> &mut Self::Target {41 &mut self.042 }43}4445impl<T: ?Sized> Borrow<T> for TraceBox<T> {46 fn borrow(&self) -> &T {47 &*self.048 }49}5051impl<T: ?Sized> BorrowMut<T> for TraceBox<T> {52 fn borrow_mut(&mut self) -> &mut T {53 &mut *self.054 }55}5657impl<T: ?Sized> AsRef<T> for TraceBox<T> {58 fn as_ref(&self) -> &T {59 &*self.060 }61}6263impl<T: ?Sized> AsMut<T> for TraceBox<T> {64 fn as_mut(&mut self) -> &mut T {65 &mut *self.066 }67}6869#[derive(Clone)]70pub struct GcHashSet<V>(pub FxHashSet<V>);71impl<V> GcHashSet<V> {72 pub fn new() -> Self {73 Self(Default::default())74 }75 pub fn with_capacity(capacity: usize) -> Self {76 Self(FxHashSet::with_capacity_and_hasher(77 capacity,78 BuildHasherDefault::default(),79 ))80 }81}82impl<V> Trace for GcHashSet<V>83where84 V: Trace,85{86 fn trace(&self, tracer: &mut gcmodule::Tracer) {87 for v in &self.0 {88 v.trace(tracer);89 }90 }91}92impl<V> Deref for GcHashSet<V> {93 type Target = FxHashSet<V>;9495 fn deref(&self) -> &Self::Target {96 &self.097 }98}99impl<V> DerefMut for GcHashSet<V> {100 fn deref_mut(&mut self) -> &mut Self::Target {101 &mut self.0102 }103}104105#[derive(Clone)]106pub struct GcHashMap<K, V>(pub FxHashMap<K, V>);107impl<K, V> GcHashMap<K, V> {108 pub fn new() -> Self {109 Self(Default::default())110 }111 pub fn with_capacity(capacity: usize) -> Self {112 Self(FxHashMap::with_capacity_and_hasher(113 capacity,114 BuildHasherDefault::default(),115 ))116 }117}118impl<K, V> Trace for GcHashMap<K, V>119where120 K: Trace,121 V: Trace,122{123 fn trace(&self, tracer: &mut gcmodule::Tracer) {124 for (k, v) in &self.0 {125 k.trace(tracer);126 v.trace(tracer);127 }128 }129}130impl<K, V> Deref for GcHashMap<K, V> {131 type Target = FxHashMap<K, V>;132133 fn deref(&self) -> &Self::Target {134 &self.0135 }136}137impl<K, V> DerefMut for GcHashMap<K, V> {138 fn deref_mut(&mut self) -> &mut Self::Target {139 &mut self.0140 }141}