use std::mem::MaybeUninit;
use compio_buf::{BufResult, IoVectoredBufMut};
use crate::{AsyncBufRead, AsyncRead, IoResult};
pub struct Repeat(u8);
impl AsyncRead for Repeat {
async fn read<B: compio_buf::IoBufMut>(
&mut self,
mut buf: B,
) -> compio_buf::BufResult<usize, B> {
let slice = buf.as_uninit();
let len = slice.len();
slice.fill(MaybeUninit::new(self.0));
unsafe { buf.advance_to(len) };
BufResult(Ok(len), buf)
}
async fn read_vectored<V: IoVectoredBufMut>(&mut self, mut buf: V) -> BufResult<usize, V> {
let mut len: usize = 0;
for slice in buf.iter_uninit_slice() {
len = len
.checked_add(slice.len())
.expect("total vectored buffer length overflow");
slice.fill(MaybeUninit::new(self.0));
}
debug_assert_eq!(len, buf.total_capacity());
unsafe { buf.advance_vec_to(len) };
BufResult(Ok(len), buf)
}
}
impl AsyncBufRead for Repeat {
async fn fill_buf(&mut self) -> IoResult<&'_ [u8]> {
Ok(std::slice::from_ref(&self.0))
}
fn consume(&mut self, _: usize) {}
}
pub fn repeat(byte: u8) -> Repeat {
Repeat(byte)
}