use p3_matrix::dense::RowMajorMatrixView;
pub trait WindowAccess<T> {
fn current_slice(&self) -> &[T];
fn next_slice(&self) -> &[T];
#[inline]
fn current(&self, i: usize) -> Option<T>
where
T: Clone,
{
self.current_slice().get(i).cloned()
}
#[inline]
fn next(&self, i: usize) -> Option<T>
where
T: Clone,
{
self.next_slice().get(i).cloned()
}
}
#[derive(Debug, Clone, Copy)]
pub struct RowWindow<'a, T> {
current: &'a [T],
next: &'a [T],
}
impl<'a, T> RowWindow<'a, T> {
#[inline]
pub fn from_view(view: &RowMajorMatrixView<'a, T>) -> Self {
let width = view.width;
assert_eq!(
view.values.len(),
2 * width,
"RowWindow::from_view: expected 2 rows (2*{width} elements), got {}",
view.values.len()
);
let (current, next) = view.values.split_at(width);
Self { current, next }
}
#[inline]
pub fn from_two_rows(current: &'a [T], next: &'a [T]) -> Self {
debug_assert_eq!(
current.len(),
next.len(),
"RowWindow::from_two_rows: row lengths differ ({} vs {})",
current.len(),
next.len()
);
Self { current, next }
}
}
impl<T> WindowAccess<T> for RowWindow<'_, T> {
#[inline]
fn current_slice(&self) -> &[T] {
self.current
}
#[inline]
fn next_slice(&self) -> &[T] {
self.next
}
}