driver: allow preserving the Stimuli as a concrete List

This commit is contained in:
2022-08-12 18:03:10 -07:00
parent 40449c4165
commit 858e787c19
3 changed files with 87 additions and 22 deletions

View File

@@ -7,6 +7,7 @@ use crate::render::{self, MultiRenderer, Renderer};
use crate::sim::AbstractSim;
use crate::sim::units::{Frame, Time};
use crate::stim::AbstractStimulus;
use coremem_cross::compound::list;
use log::{info, trace};
use serde::{Deserialize, Serialize};
@@ -33,8 +34,8 @@ pub struct Driver<S, Stim=DynStimuli> {
/// generic stimuli collection which monomorphizes everything by boxing it.
pub type DynStimuli = Vec<Box<dyn AbstractStimulus>>;
impl<S: AbstractSim, Stim: Default> Driver<S, Stim> {
pub fn new(mut state: S) -> Self {
impl<S: AbstractSim, Stim> Driver<S, Stim> {
pub fn new_with_stim(mut state: S, stimuli: Stim) -> Self {
let diag = SyncDiagnostics::new();
state.use_diagnostics(diag.clone());
Self {
@@ -48,7 +49,7 @@ impl<S: AbstractSim, Stim: Default> Driver<S, Stim> {
Arc::new(meas::Energy::world()),
Arc::new(meas::Power::world()),
],
stimuli: Default::default(),
stimuli,
sim_end_time: None,
diag,
last_diag_time: Instant::now(),
@@ -60,12 +61,39 @@ impl<S: AbstractSim, Stim: Default> Driver<S, Stim> {
}
}
impl<S> Driver<S, DynStimuli> {
impl<S: AbstractSim> Driver<S, DynStimuli> {
pub fn new(state: S) -> Self {
Self::new_with_stim(state, DynStimuli::default())
}
pub fn add_stimulus<Stim: AbstractStimulus + 'static>(&mut self, s: Stim) {
self.stimuli.push(Box::new(s))
}
}
impl<S: AbstractSim> Driver<S, list::Empty> {
pub fn new_unboxed_stim(state: S) -> Self {
Self::new_with_stim(state, list::Empty::default())
}
}
impl<S: AbstractSim, Stim> Driver<S, Stim> {
pub fn with_stimulus<E>(self, s: E) -> Driver<S, Stim::Result>
where Stim: list::Prependable<E>
{
Driver {
state: self.state,
renderer: self.renderer,
render_pool: self.render_pool,
render_channel: self.render_channel,
measurements: self.measurements,
stimuli: self.stimuli.prepend(s),
sim_end_time: self.sim_end_time,
diag: self.diag,
last_diag_time: self.last_diag_time,
}
}
}
impl<S: AbstractSim, Stim> Driver<S, Stim> {
pub fn fill_region<Reg: Region, M: Into<S::Material> + Clone>(&mut self, region: &Reg, mat: M) {
self.state.fill_region(region, mat);