use auto_impl::auto_impl;
use crate::time::{Duration, Offset, Service};
#[auto_impl(&, Box, Rc)]
pub trait RequestBound {
fn service_needed(&self, delta: Duration) -> Service {
self.job_cost_iter(delta).sum()
}
fn service_needed_by_n_jobs(&self, delta: Duration, max_jobs: usize) -> Service {
itertools::sorted(self.job_cost_iter(delta))
.rev()
.take(max_jobs)
.sum()
}
fn least_wcet_in_interval(&self, delta: Duration) -> Service;
fn steps_iter<'a>(&'a self) -> Box<dyn Iterator<Item = Duration> + 'a>;
fn job_cost_iter<'a>(&'a self, delta: Duration) -> Box<dyn Iterator<Item = Service> + 'a>;
}
#[auto_impl(&, Box, Rc)]
pub trait AggregateRequestBound: RequestBound {
fn service_needed_by_n_jobs_per_component(&self, delta: Duration, max_jobs: usize) -> Service;
}
pub fn step_offsets(rb: &'_ (impl RequestBound + ?Sized)) -> impl Iterator<Item = Offset> + '_ {
rb.steps_iter().map(Offset::closed_from_time_zero)
}
mod aggregate;
mod rbf;
mod slice;
pub use aggregate::Aggregate;
pub use rbf::RBF;
pub use slice::Slice;