use std::{marker::PhantomData, os::raw::c_void};
use crate::core::types::TypeId;
#[derive(Debug)]
pub struct DeviceSlice<'a> {
pub(crate) ptr: *mut c_void,
pub(crate) len: usize,
pub(crate) type_id: TypeId,
pub(crate) elem_size: usize,
pub(crate) _lifetime: PhantomData<&'a ()>,
}
unsafe impl Send for DeviceSlice<'_> {}
unsafe impl Sync for DeviceSlice<'_> {}
impl DeviceSlice<'_> {
pub fn len(&self) -> usize {
self.len
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
pub fn type_id(&self) -> TypeId {
self.type_id
}
pub fn as_ptr(&self) -> *const c_void {
self.ptr as *const c_void
}
pub fn as_mut_ptr(&mut self) -> *mut c_void {
self.ptr
}
pub fn elem_size(&self) -> usize {
self.elem_size
}
pub fn split_at(&self, mid: usize) -> (DeviceSlice<'_>, DeviceSlice<'_>) {
assert!(mid <= self.len, "split_at: mid ({mid}) > len ({})", self.len);
let right_ptr = if self.ptr.is_null() || self.elem_size == 0 {
self.ptr
} else {
unsafe { (self.ptr as *const u8).add(mid * self.elem_size) as *mut c_void }
};
(
DeviceSlice {
ptr: self.ptr,
len: mid,
type_id: self.type_id,
elem_size: self.elem_size,
_lifetime: PhantomData,
},
DeviceSlice {
ptr: right_ptr,
len: self.len - mid,
type_id: self.type_id,
elem_size: self.elem_size,
_lifetime: PhantomData,
},
)
}
}