use crate::plan::{Mutator, TransitiveClosure};
use crate::scheduler::gc_work::ProcessEdgesWork;
use crate::scheduler::GCWorker;
use crate::util::ObjectReference;
use crate::util::OpaquePointer;
use crate::vm::VMBinding;
pub trait Scanning<VM: VMBinding> {
const SCAN_MUTATORS_IN_SAFEPOINT: bool = true;
const SINGLE_THREAD_MUTATOR_SCANNING: bool = true;
fn scan_object<T: TransitiveClosure>(
trace: &mut T,
object: ObjectReference,
tls: OpaquePointer,
);
fn notify_initial_thread_scan_complete(partial_scan: bool, tls: OpaquePointer);
fn scan_objects<W: ProcessEdgesWork<VM = VM>>(
objects: &[ObjectReference],
worker: &mut GCWorker<VM>,
);
fn scan_thread_roots<W: ProcessEdgesWork<VM = VM>>();
fn scan_thread_root<W: ProcessEdgesWork<VM = VM>>(
mutator: &'static mut Mutator<VM>,
tls: OpaquePointer,
);
fn scan_vm_specific_roots<W: ProcessEdgesWork<VM = VM>>();
fn supports_return_barrier() -> bool;
}