singe-cublas 0.1.0-alpha.5

Safe Rust wrappers for the NVIDIA cuBLAS dense linear algebra library (with cuBLASLt).
Documentation
use crate::error::{Error, Result};

pub fn required_vector_len(n: usize, inc: usize) -> Result<usize> {
    debug_assert_ne!(inc, 0);
    n.checked_sub(1)
        .and_then(|count| count.checked_mul(inc))
        .and_then(|count| count.checked_add(1))
        .ok_or(Error::OutOfRange {
            name: "vector length".into(),
        })
}

pub fn required_matrix_len(leading_dimension: usize, cols: usize) -> Result<usize> {
    leading_dimension
        .checked_mul(cols)
        .ok_or(Error::OutOfRange {
            name: "matrix length".into(),
        })
}

pub fn to_i32(value: impl TryInto<i32>, name: &str) -> Result<i32> {
    value
        .try_into()
        .map_err(|_| Error::OutOfRange { name: name.into() })
}

pub fn to_u64(value: impl TryInto<u64>, name: &str) -> Result<u64> {
    value
        .try_into()
        .map_err(|_| Error::OutOfRange { name: name.into() })
}

pub fn to_usize(value: impl TryInto<usize>, name: &str) -> Result<usize> {
    value
        .try_into()
        .map_err(|_| Error::OutOfRange { name: name.into() })
}

pub fn ensure_exact_size(actual: usize, expected: usize) -> Result<()> {
    if actual != expected {
        return Err(Error::AttributeSizeMismatch { expected, actual });
    }
    Ok(())
}