sandpit 0.5.2

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

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 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);
    }
}