use crate::buf::Buf;
use crate::endian::ByteOrder;
use crate::error::Error;
use crate::pointer::{Pointee, Ref, Size};
use crate::traits::ZeroCopy;
pub trait Load {
type Target: ?Sized;
fn load<'buf>(&self, buf: &'buf Buf) -> Result<&'buf Self::Target, Error>;
}
pub trait LoadMut: Load {
fn load_mut<'buf>(&self, buf: &'buf mut Buf) -> Result<&'buf mut Self::Target, Error>;
}
impl<P, O: Size, E: ByteOrder> Load for Ref<P, O, E>
where
P: ZeroCopy,
{
type Target = P;
#[inline]
fn load<'buf>(&self, buf: &'buf Buf) -> Result<&'buf Self::Target, Error> {
buf.load_sized(*self)
}
}
impl<T, O: Size, E: ByteOrder> Load for Ref<[T], O, E>
where
[T]: Pointee<O, Packed = O, Metadata = usize>,
T: ZeroCopy,
{
type Target = [T];
#[inline]
fn load<'buf>(&self, buf: &'buf Buf) -> Result<&'buf Self::Target, Error> {
buf.load_unsized(*self)
}
}
impl<O: Size, E: ByteOrder> Load for Ref<str, O, E> {
type Target = str;
#[inline]
fn load<'buf>(&self, buf: &'buf Buf) -> Result<&'buf Self::Target, Error> {
buf.load_unsized(*self)
}
}
impl<P, O: Size, E: ByteOrder> LoadMut for Ref<P, O, E>
where
P: ZeroCopy,
{
#[inline]
fn load_mut<'buf>(&self, buf: &'buf mut Buf) -> Result<&'buf mut Self::Target, Error> {
buf.load_sized_mut(*self)
}
}
impl<T, O: Size, E: ByteOrder> LoadMut for Ref<[T], O, E>
where
[T]: Pointee<O, Packed = O, Metadata = usize>,
T: ZeroCopy,
{
#[inline]
fn load_mut<'buf>(&self, buf: &'buf mut Buf) -> Result<&'buf mut Self::Target, Error> {
buf.load_unsized_mut(*self)
}
}
impl<O: Size, E: ByteOrder> LoadMut for Ref<str, O, E> {
#[inline]
fn load_mut<'buf>(&self, buf: &'buf mut Buf) -> Result<&'buf mut Self::Target, Error> {
buf.load_unsized_mut(*self)
}
}