use std::num::NonZeroUsize;
use crate::{BatchDecision, BatchPolicy, BatchQuery, ExecError, Pool, WorkspaceProvider};
pub struct Exec<'a> {
token: strided_exec::Exec<'a>,
workspace: Option<&'a dyn WorkspaceProvider>,
policy: BatchPolicy,
}
impl std::fmt::Debug for Exec<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Exec")
.field("token", &self.token)
.field("workspace", &self.workspace.is_some())
.field("policy", &self.policy)
.finish()
}
}
impl<'a> Exec<'a> {
pub const fn serial() -> Exec<'static> {
Exec {
token: strided_exec::Exec::serial(),
workspace: None,
policy: crate::batch::DEFAULT_BATCH_POLICY,
}
}
pub fn serial_with_workspace(workspace: &'a dyn WorkspaceProvider) -> Self {
Exec {
token: strided_exec::Exec::serial(),
workspace: Some(workspace),
policy: crate::batch::DEFAULT_BATCH_POLICY,
}
}
pub fn new(pool: &'a Pool<'_>, budget: usize) -> Result<Self, ExecError> {
Ok(Exec {
token: strided_exec::Exec::new(pool.inner(), budget)?,
workspace: Some(pool.workspace()),
policy: BatchPolicy::default(),
})
}
pub fn from_token(
token: strided_exec::Exec<'a>,
workspace: Option<&'a dyn WorkspaceProvider>,
policy: BatchPolicy,
) -> Self {
Exec {
token,
workspace,
policy,
}
}
pub fn token(&mut self) -> strided_exec::Exec<'_> {
self.token.reborrow()
}
pub fn into_token(self) -> strided_exec::Exec<'a> {
self.token
}
pub fn reborrow(&mut self) -> Exec<'_> {
Exec {
token: self.token.reborrow(),
workspace: self.workspace,
policy: self.policy,
}
}
#[must_use]
pub fn limit(self, max: NonZeroUsize) -> Self {
Exec {
token: self.token.limit(max),
workspace: self.workspace,
policy: self.policy,
}
}
pub fn batch_policy(&self) -> &BatchPolicy {
&self.policy
}
#[must_use]
pub fn with_batch_policy(mut self, policy: BatchPolicy) -> Self {
self.policy = policy;
self
}
pub fn batch_decision(&self, query: &BatchQuery) -> BatchDecision {
crate::batch::batch_decision(&self.policy, self.token.budget(), query)
}
pub fn budget(&self) -> usize {
self.token.budget().get()
}
pub fn workspace(&self) -> Option<&'a dyn WorkspaceProvider> {
self.workspace
}
pub fn width_for(&self, serial_ns: f64, policy: &crate::WidthPolicy) -> usize {
crate::width::width_for(serial_ns, policy, self.budget())
}
}