era_cudart 0.154.8

CUDA bindings for ZKsync
use std::marker::PhantomData;
use std::ptr::NonNull;
use std::slice;

use crate::slice::{CudaSlice, CudaSliceMut};

#[derive(Debug)]
pub(crate) struct AllocationData<T> {
    pub ptr: NonNull<T>,
    pub len: usize,
    _owns_t: PhantomData<T>,
}

impl<T> AllocationData<T> {
    pub fn new(ptr: NonNull<T>, len: usize) -> Self {
        Self {
            ptr,
            len,
            _owns_t: PhantomData,
        }
    }

    pub unsafe fn new_unchecked(ptr: *mut T, len: usize) -> Self {
        Self {
            ptr: NonNull::new_unchecked(ptr),
            len,
            _owns_t: PhantomData,
        }
    }
}

unsafe impl<T> Send for AllocationData<T> where Vec<T>: Send {}

unsafe impl<T> Sync for AllocationData<T> where Vec<T>: Sync {}

impl<T> CudaSlice<T> for AllocationData<T> {
    unsafe fn as_slice(&self) -> &[T] {
        slice::from_raw_parts(self.ptr.as_ptr(), self.len)
    }
}

impl<T> CudaSliceMut<T> for AllocationData<T> {
    unsafe fn as_mut_slice(&mut self) -> &mut [T] {
        slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len)
    }
}