use crate::{Error, eval::Tape};
pub trait BulkEvaluator: Default {
type Data: From<f32> + Copy + Clone;
type Tape: Tape<Storage = Self::TapeStorage>;
type TapeStorage;
fn eval<V: std::ops::Deref<Target = [Self::Data]>>(
&mut self,
tape: &Self::Tape,
vars: &[V],
) -> Result<BulkOutput<'_, Self::Data>, Error>;
fn new() -> Self {
Self::default()
}
}
pub struct BulkOutput<'a, T> {
data: &'a Vec<Vec<T>>,
len: usize,
}
impl<'a, T> BulkOutput<'a, T> {
pub fn new(data: &'a Vec<Vec<T>>, len: usize) -> Self {
Self { data, len }
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
}
impl<'a, T> std::ops::Index<usize> for BulkOutput<'a, T> {
type Output = [T];
fn index(&self, i: usize) -> &'a Self::Output {
&self.data[i][0..self.len]
}
}
impl<'a, T> BulkOutput<'a, T> {
pub(crate) fn borrow(&self, i: usize) -> &'a [T] {
&self.data[i][0..self.len]
}
}