use core::marker::PhantomData;
use crate::pointer::{DefaultSize, Size};
use crate::traits::UnsizedZeroCopy;
use crate::ZeroCopy;
#[derive(Debug, ZeroCopy)]
#[repr(C)]
#[zero_copy(crate)]
pub struct Unsized<T: ?Sized + UnsizedZeroCopy, O: Size = DefaultSize> {
offset: O,
size: O,
#[zero_copy(ignore)]
_marker: PhantomData<T>,
}
impl<T: ?Sized, O: Size> Unsized<T, O>
where
T: UnsizedZeroCopy,
{
pub fn new(offset: usize, size: usize) -> Self {
let Some(offset) = O::from_usize(offset) else {
panic!(
"Unsized offset {offset} not in the legal range of 0-{}",
O::MAX
);
};
let Some(size) = O::from_usize(size) else {
panic!("Unsized size {size} not in the legal range of 0-{}", O::MAX);
};
Self {
offset,
size,
_marker: PhantomData,
}
}
#[inline]
pub fn offset(&self) -> usize {
self.offset.as_usize()
}
#[inline]
pub fn size(&self) -> usize {
self.size.as_usize()
}
}
impl<T: ?Sized + UnsizedZeroCopy, O: Size> Clone for Unsized<T, O> {
fn clone(&self) -> Self {
*self
}
}
impl<T: ?Sized + UnsizedZeroCopy, O: Size> Copy for Unsized<T, O> {}