#[inline]
pub(super) fn checked_strided_span(nrows: usize, ncols: usize, lda: usize) -> Option<usize> {
match nrows {
0 => Some(0),
n => (n - 1).checked_mul(lda)?.checked_add(ncols),
}
}
#[inline]
pub(super) fn checked_area(rows: usize, cols: usize) -> Option<usize> {
rows.checked_mul(cols)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn strided_span_matches_unchecked_for_valid_dims() {
assert_eq!(checked_strided_span(4, 6, 6), Some(3 * 6 + 6));
assert_eq!(checked_strided_span(4, 6, 10), Some(3 * 10 + 6));
assert_eq!(checked_strided_span(1, 6, 10), Some(6));
assert_eq!(checked_strided_span(0, 6, 10), Some(0));
}
#[test]
fn strided_span_rejects_overflow() {
assert_eq!(checked_strided_span(2, 6, usize::MAX), None);
assert_eq!(checked_strided_span(usize::MAX, 1, 2), None);
}
#[test]
fn area_matches_and_rejects_overflow() {
assert_eq!(checked_area(3, 4), Some(12));
assert_eq!(checked_area(0, usize::MAX), Some(0));
assert_eq!(checked_area(usize::MAX, 2), None);
assert_eq!(checked_area(1 << 40, 1 << 40), None);
}
}