use std::iter;
use super::{divide_with_ceil, ArrivalBound, Periodic};
use crate::time::Duration;
#[derive(Copy, Clone, Debug)]
pub struct Sporadic {
pub min_inter_arrival: Duration,
pub jitter: Duration,
}
impl Sporadic {
pub fn new(min_inter_arrival: Duration, jitter: Duration) -> Sporadic {
Sporadic {
min_inter_arrival,
jitter,
}
}
pub fn new_zero_jitter(min_inter_arrival: Duration) -> Sporadic {
Sporadic {
min_inter_arrival,
jitter: Duration::zero(),
}
}
}
impl ArrivalBound for Sporadic {
fn number_arrivals(&self, delta: Duration) -> usize {
if delta.is_non_zero() {
divide_with_ceil(delta + self.jitter, self.min_inter_arrival) as usize
} else {
0
}
}
fn steps_iter<'a>(&'a self) -> Box<dyn Iterator<Item = Duration> + 'a> {
Box::new(
iter::once(Duration::from(1)).chain(
(1..)
.filter(move |j| self.min_inter_arrival * *j > self.jitter)
.map(move |j| self.min_inter_arrival * j + Duration::epsilon() - self.jitter),
),
)
}
fn clone_with_jitter(&self, added_jitter: Duration) -> Box<dyn ArrivalBound> {
let mut ab = Box::new(*self);
ab.jitter += added_jitter;
ab
}
}
impl From<Periodic> for Sporadic {
fn from(p: Periodic) -> Self {
Sporadic::new_zero_jitter(p.period)
}
}