use core::marker::PhantomData;
use crate::buf::{Buf, BufMut};
use crate::error::Error;
use crate::ptr::Ptr;
use crate::ZeroCopy;
#[derive(Debug)]
#[repr(C)]
pub struct Slice<T: ?Sized> {
ptr: Ptr,
len: usize,
_marker: PhantomData<T>,
}
impl<T: ?Sized> Slice<T> {
pub fn new(ptr: Ptr, len: usize) -> Self {
Self {
ptr,
len,
_marker: PhantomData,
}
}
#[inline]
pub fn ptr(&self) -> Ptr {
self.ptr
}
#[inline]
pub fn len(&self) -> usize {
self.len
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
}
unsafe impl<T: ?Sized> ZeroCopy for Slice<T> {
fn write_to<B: ?Sized>(&self, buf: &mut B) -> Result<(), Error>
where
B: BufMut,
{
buf.write(&self.ptr)?;
buf.write(&self.len)?;
Ok(())
}
fn read_from(buf: &Buf) -> Result<&Self, Error> {
let mut v = buf.validate::<Self>()?;
v.field::<Ptr>()?;
v.field::<usize>()?;
v.end()?;
Ok(unsafe { buf.cast() })
}
unsafe fn validate_aligned(buf: &Buf) -> Result<(), Error> {
let mut v = buf.validate_aligned()?;
v.field::<Ptr>()?;
v.field::<usize>()?;
v.end()
}
}
impl<T: ?Sized> Clone for Slice<T> {
fn clone(&self) -> Self {
*self
}
}
impl<T: ?Sized> Copy for Slice<T> {}