use crate::effect::EffectHandler;
use crate::loader::CodeImage;
use crate::session::SessionId;
use crate::threaded::ThreadedVM;
use crate::vm::{ObsEvent, RunStatus, StepResult, VMConfig, VMError};
pub struct NativeThreadedDriver {
vm: ThreadedVM,
}
impl NativeThreadedDriver {
#[must_use]
pub fn with_workers(config: VMConfig, workers: usize) -> Self {
Self {
vm: ThreadedVM::with_workers(config, workers),
}
}
#[must_use]
pub fn auto(config: VMConfig) -> Self {
Self {
vm: ThreadedVM::auto(config),
}
}
#[must_use]
pub fn with_vm(vm: ThreadedVM) -> Self {
Self { vm }
}
#[must_use]
pub fn vm(&self) -> &ThreadedVM {
&self.vm
}
pub fn load_choreography(&mut self, image: &CodeImage) -> Result<SessionId, VMError> {
self.vm.load_choreography(image)
}
pub fn step_round(
&mut self,
handler: &dyn EffectHandler,
n: usize,
) -> Result<StepResult, VMError> {
self.vm.step_round(handler, n)
}
pub fn run(
&mut self,
handler: &dyn EffectHandler,
max_rounds: usize,
) -> Result<RunStatus, VMError> {
self.vm.run(handler, max_rounds)
}
#[must_use]
pub fn trace(&self) -> &[ObsEvent] {
self.vm.trace()
}
}