use crate::buf::{IoBuf, VectoredBufIterator, VectoredSlice};
pub trait IoVectoredBuf: 'static {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]>;
fn total_len(&self) -> usize {
self.iter_slice().map(<[u8]>::len).sum()
}
fn owned_iter(self) -> Result<VectoredBufIterator<Self>, Self>
where
Self: Sized,
{
VectoredBufIterator::new(self)
}
fn slice(self, start: usize) -> VectoredSlice<Self>
where
Self: Sized,
{
VectoredSlice::from_initialized(self, start)
}
}
impl<B: IoBuf> IoVectoredBuf for [B] {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
self.iter().map(IoBuf::as_init)
}
}
impl<V: IoVectoredBuf + ?Sized> IoVectoredBuf for Box<V> {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
(**self).iter_slice()
}
}
impl<V: IoVectoredBuf + ?Sized> IoVectoredBuf for &'static V {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
(**self).iter_slice()
}
}
impl<V: IoVectoredBuf + ?Sized> IoVectoredBuf for &'static mut V {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
(**self).iter_slice()
}
}
impl<B: IoBuf, const N: usize> IoVectoredBuf for [B; N] {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
self.iter().map(IoBuf::as_init)
}
}
impl<B: IoBuf> IoVectoredBuf for Vec<B> {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
self.iter().map(IoBuf::as_init)
}
}
impl IoVectoredBuf for () {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
std::iter::empty()
}
}
impl<B: IoBuf, REST: IoVectoredBuf> IoVectoredBuf for (B, REST) {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
std::iter::once(self.0.as_init()).chain(self.1.iter_slice())
}
}
impl<B: IoBuf> IoVectoredBuf for (B,) {
fn iter_slice(&self) -> impl Iterator<Item = &[u8]> {
std::iter::once(self.0.as_init())
}
}