use crate::algebra::prelude::*;
#[derive(Default, Clone, Debug)]
pub struct BridgeScratch {
buf: Vec<f64>,
}
impl BridgeScratch {
#[inline]
pub fn new() -> Self {
Self { buf: Vec::new() }
}
#[inline]
fn ensure(&mut self, want: usize) {
if self.buf.len() < want {
self.buf.resize(want, 0.0);
}
}
#[inline]
pub fn with_pair<F, Rv>(&mut self, n: usize, f: F) -> Rv
where
F: FnOnce(&mut [f64], &mut [f64]) -> Rv,
{
self.ensure(2 * n);
let (xr, rest) = self.buf.split_at_mut(n);
let (yr, _) = rest.split_at_mut(n);
f(xr, yr)
}
#[inline]
pub fn with_one<F, Rv>(&mut self, n: usize, f: F) -> Rv
where
F: FnOnce(&mut [f64]) -> Rv,
{
self.ensure(n);
f(&mut self.buf[..n])
}
}
#[inline]
pub fn copy_scalar_to_real_in<T: KrystScalar<Real = f64>>(x: &[T], xr: &mut [f64]) {
debug_assert_eq!(x.len(), xr.len());
for (dst, &src) in xr.iter_mut().zip(x.iter()) {
*dst = src.real();
}
}
#[inline]
pub fn copy_real_into_scalar<T: KrystScalar<Real = f64>>(yr: &[f64], y: &mut [T]) {
debug_assert_eq!(yr.len(), y.len());
for (dst, &src) in y.iter_mut().zip(yr.iter()) {
*dst = T::from_real(src);
}
}