use crate::simulation::specs::*;
use crate::simulation::point::Point;
use crate::simulation::internal::event_queue::*;
use crate::simulation::generator::Generator;
#[cfg(feature="cons_mode")]
use crate::simulation::comm::context::LogicalProcessContext;
#[cfg(feature="cons_mode")]
use crate::simulation::internal::input_message_queue::*;
#[cfg(feature="cons_mode")]
use crate::simulation::internal::output_message_queue::*;
#[cfg(feature="cons_mode")]
#[repr(C)]
pub struct Run<'a> {
#[doc(hidden)]
pub event_queue: *mut EventQueue,
pub specs: SpecsRepr,
pub run_index: usize,
pub run_count: usize,
pub generator: Generator,
#[doc(hidden)]
pub lp_context: &'a LogicalProcessContext,
#[doc(hidden)]
pub input_messages: *mut InputMessageQueue,
#[doc(hidden)]
pub output_messages: *mut OutputMessageQueue
}
#[cfg(feature="cons_mode")]
impl<'a> Drop for Run<'a> {
fn drop(&mut self) {
unsafe {
delete_extern_event_queue(self.event_queue);
delete_extern_input_message_queue(self.input_messages);
delete_extern_output_message_queue(self.output_messages);
}
}
}
#[cfg(feature="cons_mode")]
impl<'a> Run<'a> {
pub fn new(specs: Specs, ctx: &'a LogicalProcessContext) -> Run<'a> {
Self::by_index(specs, ctx, 0, 1)
}
pub fn by_index(specs: Specs, ctx: &'a LogicalProcessContext, run_index: usize, run_count: usize) -> Run<'a> {
let generator = Generator::new(&specs.generator_type);
let specs = specs.into();
let event_queue = unsafe {
create_extern_event_queue(&specs)
};
let input_messages = unsafe {
create_extern_input_message_queue()
};
let output_messages = unsafe {
create_extern_output_message_queue()
};
Run {
specs: specs,
event_queue: event_queue,
run_index: run_index,
run_count: run_count,
generator: generator,
lp_context: ctx,
input_messages: input_messages,
output_messages: output_messages
}
}
#[inline]
pub fn point_in_start_time(&self) -> Point {
let specs = &self.specs;
let t0 = specs.start_time;
Point {
run: self,
time: t0,
priority: 0,
minimal_priority: isize::MIN,
iteration: 0,
phase: 0
}
}
#[inline]
pub fn point_in_stop_time(&self) -> Point {
let specs = &self.specs;
let t0 = specs.start_time;
let t2 = specs.stop_time;
let dt = specs.dt;
let n2 = ((t2 - t0) / dt).floor() as usize;
Point {
run: self,
time: t2,
priority: 0,
minimal_priority: isize::MIN,
iteration: n2,
phase: 0
}
}
#[inline]
pub fn point_at(&self, t: f64, priority: isize, minimal_priority: isize) -> Point {
let specs = &self.specs;
let t0 = specs.start_time;
let dt = specs.dt;
let n2 = ((t - t0) / dt).floor() as usize;
Point {
run: self,
time: t,
priority: priority,
minimal_priority: minimal_priority,
iteration: n2,
phase: -1
}
}
}
#[cfg(any(feature="seq_mode", feature="wasm_mode"))]
#[repr(C)]
pub struct Run {
#[doc(hidden)]
pub event_queue: Box<EventQueue>,
pub specs: SpecsRepr,
pub run_index: usize,
pub run_count: usize,
pub generator: Generator
}
#[cfg(any(feature="seq_mode", feature="wasm_mode"))]
impl Run {
pub fn new(specs: Specs) -> Run {
Self::by_index(specs, 0, 1)
}
pub fn by_index(specs: Specs, run_index: usize, run_count: usize) -> Run {
let generator = Generator::new(&specs.generator_type);
let specs = specs.into();
let event_queue = Box::new(EventQueue::new(&specs));
Run {
specs: specs,
event_queue: event_queue,
run_index: run_index,
run_count: run_count,
generator: generator
}
}
#[inline]
pub fn point_in_start_time(&self) -> Point {
let specs = &self.specs;
let t0 = specs.start_time;
Point {
run: self,
time: t0,
priority: 0,
minimal_priority: isize::MIN,
iteration: 0,
phase: 0
}
}
#[inline]
pub fn point_in_stop_time(&self) -> Point {
let specs = &self.specs;
let t0 = specs.start_time;
let t2 = specs.stop_time;
let dt = specs.dt;
let n2 = ((t2 - t0) / dt).floor() as usize;
Point {
run: self,
time: t2,
priority: 0,
minimal_priority: isize::MIN,
iteration: n2,
phase: 0
}
}
#[inline]
pub fn point_at(&self, t: f64, priority: isize, minimal_priority: isize) -> Point {
let specs = &self.specs;
let t0 = specs.start_time;
let dt = specs.dt;
let n2 = ((t - t0) / dt).floor() as usize;
Point {
run: self,
time: t,
priority: priority,
minimal_priority: minimal_priority,
iteration: n2,
phase: -1
}
}
}