use crate::buf::Load;
use crate::endian::ByteOrder;
use crate::error::Error;
use crate::pointer::{Ref, Size};
use crate::traits::ZeroCopy;
mod sealed {
use crate::endian::ByteOrder;
use crate::pointer::{Ref, Size};
use crate::slice::Packed;
use crate::traits::ZeroCopy;
pub trait Sealed {}
impl<T, E, O> Sealed for Ref<[T], E, O>
where
T: ZeroCopy,
E: ByteOrder,
O: Size,
{
}
impl<T, O, L, E> Sealed for Packed<[T], O, L, E>
where
O: Size,
L: Size,
E: ByteOrder,
{
}
}
pub trait Slice: self::sealed::Sealed + Copy + ZeroCopy + Load<Target = [Self::Item]> {
type Item;
type ItemRef: Load<Target = Self::Item>;
fn from_ref<E, O>(slice: Ref<[Self::Item], E, O>) -> Self
where
Self::Item: ZeroCopy,
E: ByteOrder,
O: Size;
fn try_from_ref<E, O>(slice: Ref<[Self::Item], E, O>) -> Result<Self, Error>
where
Self::Item: ZeroCopy,
E: ByteOrder,
O: Size;
fn with_metadata(offset: usize, len: usize) -> Self;
fn try_with_metadata(offset: usize, len: usize) -> Result<Self, Error>;
fn get(self, index: usize) -> Option<Self::ItemRef>;
fn split_at(self, at: usize) -> (Self, Self);
fn get_unchecked(self, index: usize) -> Self::ItemRef;
fn offset(self) -> usize;
fn len(self) -> usize;
fn is_empty(self) -> bool;
}
impl<T, A: ByteOrder, B: Size> Slice for Ref<[T], A, B>
where
T: ZeroCopy,
{
type Item = T;
type ItemRef = Ref<T, A, B>;
#[inline]
fn from_ref<E, O>(slice: Ref<[T], E, O>) -> Self
where
T: ZeroCopy,
E: ByteOrder,
O: Size,
{
Ref::with_metadata(slice.offset(), slice.len())
}
#[inline]
fn try_from_ref<E, O>(slice: Ref<[T], E, O>) -> Result<Self, Error>
where
T: ZeroCopy,
E: ByteOrder,
O: Size,
{
Ref::try_with_metadata(slice.offset(), slice.len())
}
#[inline]
fn with_metadata(offset: usize, len: usize) -> Self {
Ref::with_metadata(offset, len)
}
#[inline]
fn try_with_metadata(offset: usize, len: usize) -> Result<Self, Error> {
Ref::try_with_metadata(offset, len)
}
#[inline]
fn get(self, index: usize) -> Option<Self::ItemRef> {
Ref::get(self, index)
}
#[inline]
fn split_at(self, at: usize) -> (Self, Self) {
Ref::split_at(self, at)
}
#[inline]
fn get_unchecked(self, index: usize) -> Self::ItemRef {
Ref::get_unchecked(self, index)
}
#[inline]
fn offset(self) -> usize {
Ref::<[T], _, _>::offset(self)
}
#[inline]
fn len(self) -> usize {
Ref::<[T], _, _>::len(self)
}
#[inline]
fn is_empty(self) -> bool {
Ref::<[T], _, _>::is_empty(self)
}
}