cudarc/cusparse/
result.rs

1use std::mem::MaybeUninit;
2
3use super::sys;
4
5/// Wrapper around [sys::CUresult]. See
6/// nvidia's [CUresult docs](https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__TYPES.html#group__CUDA__TYPES_1gc6c391505e117393cc2558fff6bfc2e9)
7#[derive(Clone, Copy, PartialEq, Eq, Debug)]
8pub struct CusparseError(pub sys::cusparseStatus_t);
9
10impl sys::cusparseStatus_t {
11    #[inline]
12    pub fn result(self) -> Result<(), CusparseError> {
13        match self {
14            sys::cusparseStatus_t::CUSPARSE_STATUS_SUCCESS => Ok(()),
15            _ => Err(CusparseError(self)),
16        }
17    }
18}
19
20/// See [cuda docs](https://docs.nvidia.com/cuda/cusparse/#cusparsecreate)
21pub fn create() -> Result<sys::cusparseHandle_t, CusparseError> {
22    let mut handle = MaybeUninit::uninit();
23    unsafe {
24        sys::cusparseCreate(handle.as_mut_ptr()).result()?;
25        Ok(handle.assume_init())
26    }
27}
28
29/// See [cuda docs](https://docs.nvidia.com/cuda/cusparse/#cusparsedestroy)
30/// # Safety
31/// Ensure `handle` has not been freed already
32pub unsafe fn destroy(handle: sys::cusparseHandle_t) -> Result<(), CusparseError> {
33    sys::cusparseDestroy(handle).result()
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn test_create_and_destroy() -> Result<(), CusparseError> {
42        let handle = create()?;
43        unsafe { destroy(handle) }?;
44        Ok(())
45    }
46}