sandpit 0.5.3

A concurrent garbage collected arena
Documentation
use super::trace::Trace;
use super::tracer::Tracer;
use crate::pointee::Thin;
use core::ptr::NonNull;
use std::hash::Hash;

unsafe impl Send for TraceJob {}
unsafe impl Sync for TraceJob {}

#[derive(Clone)]
pub struct TraceJob {
    ptr: NonNull<Thin<()>>,
    dyn_trace: fn(NonNull<Thin<()>>, &mut Tracer),
}

impl PartialEq for TraceJob {
    fn eq(&self, other: &Self) -> bool {
        self.ptr == other.ptr
    }
}

impl Eq for TraceJob {}

impl Hash for TraceJob {
    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
        self.ptr.hash(state)
    }
}

impl TraceJob {
    pub fn new<T: Trace + ?Sized>(ptr: NonNull<Thin<T>>) -> Self {
        Self {
            ptr: ptr.cast(),
            dyn_trace: T::dyn_trace,
        }
    }

    pub fn trace(&self, tracer: &mut Tracer) {
        (self.dyn_trace)(self.ptr, tracer);
    }
}