comet/internal/
trace_trait.rs

1use crate::visitor::Visitor;
2
3pub type TraceCallback = extern "C" fn(*mut Visitor, *const u8);
4
5/// Trait specifying how the garbage collector processes an object of type `T`.
6pub trait TraceTrait: Sized {
7    /// Function invoking the tracing for an object of type `T`.
8    /// - `visitor`: The visitor to dispatch to.
9    fn trace(&self, vis: &mut Visitor) {
10        let _ = vis;
11    }
12    /// `trace_` method is used for C FFI safety. 
13    extern "C" fn trace_(vis: *mut Visitor, this: *const u8) {
14        unsafe {
15            (*this.cast::<Self>()).trace(&mut *vis);
16        }
17    }
18    /// Returns trace descriptor for type that implements this trait. Not recommended to override it. 
19    fn get_trace_descriptor(this: *const u8) -> TraceDescriptor {
20        TraceDescriptor {
21            base_object_payload: this,
22            callback: Self::trace_,
23        }
24    }
25}
26
27/// Describe how to trace an object.
28pub struct TraceDescriptor {
29    pub base_object_payload: *const u8,
30    pub callback: TraceCallback,
31}