use crate::{DspError, DspResult};
pub const MAX_DEVICE_ELEMENTS: usize = u32::MAX as usize;
pub fn device_elements(what: &str, dims: &[usize]) -> DspResult<usize> {
let total = dims.iter().try_fold(1usize, |acc, &d| acc.checked_mul(d));
match total {
Some(n) if n <= MAX_DEVICE_ELEMENTS => Ok(n),
_ => Err(DspError::InvalidConfig(format!(
"{what} {dims:?} needs more than {MAX_DEVICE_ELEMENTS} elements in one device buffer \
(kernels use 32-bit indices): use smaller batches"
))),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn counts_and_refuses_oversized_buffers() {
assert_eq!(device_elements("window", &[384, 60_000]).unwrap(), 384 * 60_000);
assert!(device_elements("window", &[384, 12_000_000]).is_err());
assert!(device_elements("window", &[usize::MAX, 2]).is_err(), "overflow is refused too");
}
}