use crate::effect::EffectHandler;
use crate::loader::CodeImage;
use crate::session::SessionId;
use crate::vm::{ObsEvent, RunStatus, StepResult, VMError, VM};
pub trait VMBackend {
fn load_choreography(&mut self, image: &CodeImage) -> Result<SessionId, VMError>;
fn step_round(&mut self, handler: &dyn EffectHandler, n: usize) -> Result<StepResult, VMError>;
fn run(&mut self, handler: &dyn EffectHandler, max_rounds: usize)
-> Result<RunStatus, VMError>;
#[must_use]
fn trace(&self) -> Vec<ObsEvent>;
}
impl VMBackend for VM {
fn load_choreography(&mut self, image: &CodeImage) -> Result<SessionId, VMError> {
self.load_choreography(image)
}
fn step_round(&mut self, handler: &dyn EffectHandler, n: usize) -> Result<StepResult, VMError> {
self.step_round(handler, n)
}
fn run(
&mut self,
handler: &dyn EffectHandler,
max_rounds: usize,
) -> Result<RunStatus, VMError> {
self.run_concurrent(handler, max_rounds, 1)
}
fn trace(&self) -> Vec<ObsEvent> {
self.trace().to_vec()
}
}
#[cfg(feature = "multi-thread")]
use crate::threaded::ThreadedVM;
#[cfg(feature = "multi-thread")]
impl VMBackend for ThreadedVM {
fn load_choreography(&mut self, image: &CodeImage) -> Result<SessionId, VMError> {
self.load_choreography(image)
}
fn step_round(&mut self, handler: &dyn EffectHandler, n: usize) -> Result<StepResult, VMError> {
self.step_round(handler, n)
}
fn run(
&mut self,
handler: &dyn EffectHandler,
max_rounds: usize,
) -> Result<RunStatus, VMError> {
self.run(handler, max_rounds)
}
fn trace(&self) -> Vec<ObsEvent> {
self.trace().to_vec()
}
}