driver: allow preserving the Stimuli as a concrete List
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user