pub trait TPointer<T>
{
#[inline(always)]
fn read(self) -> T;
#[inline(always)]
fn copyAssumingOverlap(self, destination: *mut T, count: usize);
#[inline(always)]
fn copyAssumingNoOverlap(self, destination: *mut T, count: usize);
}
impl<T> TPointer<T> for *const T
{
#[inline(always)]
fn read(self) -> T
{
debug_assert!(!self.is_null(), "self is a null pointer");
unsafe { read(self) }
}
#[inline(always)]
fn copyAssumingOverlap(self, destination: *mut T, count: usize)
{
debug_assert!(!self.is_null(), "self is a null pointer");
debug_assert!(!destination.is_null(), "destination is a null pointer");
unsafe { copy(self, destination, count) }
}
#[inline(always)]
fn copyAssumingNoOverlap(self, destination: *mut T, count: usize)
{
debug_assert!(!self.is_null(), "self is a null pointer");
unsafe { copy_nonoverlapping(self, destination, count) }
}
}
impl<T> TPointer<T> for *mut T
{
#[inline(always)]
fn read(self) -> T
{
debug_assert!(!self.is_null(), "self is a null pointer");
unsafe { read(self) }
}
#[inline(always)]
fn copyAssumingOverlap(self, destination: *mut T, count: usize)
{
debug_assert!(!self.is_null(), "self is a null pointer");
debug_assert!(!destination.is_null(), "destination is a null pointer");
unsafe { copy(self, destination, count) }
}
#[inline(always)]
fn copyAssumingNoOverlap(self, destination: *mut T, count: usize)
{
debug_assert!(!self.is_null(), "self is a null pointer");
debug_assert!(!destination.is_null(), "destination is a null pointer");
unsafe { copy_nonoverlapping(self, destination, count) }
}
}