use core::marker::PhantomData;
use crate::buf::{Buf, BufMut};
use crate::error::Error;
use crate::ptr::Ptr;
use crate::zero_copy::ZeroCopy;
#[derive(Debug)]
#[repr(C)]
pub struct Unsized<T: ?Sized> {
ptr: Ptr,
size: usize,
_marker: PhantomData<T>,
}
impl<T: ?Sized> Unsized<T> {
pub fn new(ptr: Ptr, len: usize) -> Self {
Self {
ptr,
size: len,
_marker: PhantomData,
}
}
#[inline]
pub fn ptr(&self) -> Ptr {
self.ptr
}
#[inline]
pub fn size(&self) -> usize {
self.size
}
}
unsafe impl<T: ?Sized> ZeroCopy for Unsized<T> {
fn write_to<B: ?Sized>(&self, buf: &mut B) -> Result<(), Error>
where
B: BufMut,
{
buf.write(&self.ptr)?;
buf.write(&self.size)?;
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 Unsized<T> {
fn clone(&self) -> Self {
*self
}
}
impl<T: ?Sized> Copy for Unsized<T> {}