use crate::buf::{Buf, Load};
use crate::endian::ByteOrder;
use crate::error::Error;
use crate::pointer::{Pointee, Ref, Size};
pub trait Visit {
type Target: ?Sized;
fn visit<V, O>(&self, buf: &Buf, visitor: V) -> Result<O, Error>
where
V: FnOnce(&Self::Target) -> O;
}
impl<T: ?Sized> Visit for &T {
type Target = T;
fn visit<V, O>(&self, _: &Buf, visitor: V) -> Result<O, Error>
where
V: FnOnce(&Self::Target) -> O,
{
Ok(visitor(*self))
}
}
impl<T: ?Sized, E: ByteOrder, O: Size> Visit for Ref<T, E, O>
where
T: Pointee,
Self: Load,
{
type Target = <Ref<T, E, O> as Load>::Target;
#[inline]
fn visit<V, U>(&self, buf: &Buf, visitor: V) -> Result<U, Error>
where
V: FnOnce(&Self::Target) -> U,
{
let value = buf.load(*self)?;
Ok(visitor(value))
}
}
impl Visit for str {
type Target = str;
#[inline]
fn visit<V, O>(&self, _: &Buf, visitor: V) -> Result<O, Error>
where
V: FnOnce(&Self::Target) -> O,
{
Ok(visitor(self))
}
}
impl<T> Visit for [T] {
type Target = [T];
#[inline]
fn visit<V, O>(&self, _: &Buf, visitor: V) -> Result<O, Error>
where
V: FnOnce(&Self::Target) -> O,
{
Ok(visitor(self))
}
}