use crate::driver::sys; use super::core::{CudaSlice, CudaView, CudaViewMut}; pub trait DeviceSlice { fn len(&self) -> usize; fn num_bytes(&self) -> usize { self.len() * std::mem::size_of::() } fn is_empty(&self) -> bool { self.len() == 0 } } impl DeviceSlice for CudaSlice { fn len(&self) -> usize { self.len } } impl<'a, T> DeviceSlice for CudaView<'a, T> { fn len(&self) -> usize { self.len } } impl<'a, T> DeviceSlice for CudaViewMut<'a, T> { fn len(&self) -> usize { self.len } } /// Abstraction over [CudaSlice]/[CudaView] pub trait DevicePtr: DeviceSlice { fn device_ptr(&self) -> &sys::CUdeviceptr; } impl DevicePtr for CudaSlice { fn device_ptr(&self) -> &sys::CUdeviceptr { &self.cu_device_ptr } } impl<'a, T> DevicePtr for CudaView<'a, T> { fn device_ptr(&self) -> &sys::CUdeviceptr { &self.ptr } } impl<'a, T> DevicePtr for CudaViewMut<'a, T> { fn device_ptr(&self) -> &sys::CUdeviceptr { &self.ptr } } /// Abstraction over [CudaSlice]/[CudaViewMut] pub trait DevicePtrMut: DeviceSlice { fn device_ptr_mut(&mut self) -> &mut sys::CUdeviceptr; } impl DevicePtrMut for CudaSlice { fn device_ptr_mut(&mut self) -> &mut sys::CUdeviceptr { &mut self.cu_device_ptr } } impl<'a, T> DevicePtrMut for CudaViewMut<'a, T> { fn device_ptr_mut(&mut self) -> &mut sys::CUdeviceptr { &mut self.ptr } }