use alloc::rc::Rc;
use alloc::sync::Arc;
use alloc::vec::Vec;
use alloc::boxed::Box;
use alloc::string::String;
use crate::prelude::*;
use zerogc_derive::unsafe_gc_impl;
unsafe_gc_impl! {
target => Vec<T>,
params => [T],
null_trace => { where T: NullTrace },
NEEDS_TRACE => T::NEEDS_TRACE,
NEEDS_DROP => true, visit => |self, visitor| {
visitor.#visit_func::<[T]>(#b**self as #b [T])
}
}
unsafe_gc_impl! {
target => Box<T>,
params => [T],
null_trace => { where T: NullTrace },
NEEDS_TRACE => T::NEEDS_TRACE,
NEEDS_DROP => true, visit => |self, visitor| {
visitor.#visit_func::<T>(#b **self)
}
}
unsafe_gc_impl! {
target => Rc<T>,
params => [T: TraceImmutable],
null_trace => { where T: NullTrace },
NEEDS_TRACE => T::NEEDS_TRACE,
NEEDS_DROP => true, visit => |self, visitor| {
visitor.visit_immutable::<T>(&**self)
}
}
unsafe_gc_impl! {
target => Arc<T>,
params => [T: TraceImmutable],
null_trace => { where T: NullTrace },
NEEDS_TRACE => T::NEEDS_TRACE,
NEEDS_DROP => true, visit => |self, visitor| {
visitor.visit_immutable::<T>(&**self)
}
}
unsafe_trace_primitive!(String);