use std::io::{
BufRead,
Read,
Result,
Seek,
SeekFrom,
};
pub struct CountingReader<R> {
inner: R,
bytes_read: u64,
}
impl<R> CountingReader<R> {
#[inline]
pub fn new(inner: R) -> Self {
Self { inner, bytes_read: 0 }
}
#[inline]
pub fn bytes_read(&self) -> u64 {
self.bytes_read
}
#[inline]
pub fn get_ref(&self) -> &R {
&self.inner
}
#[inline]
pub fn get_mut(&mut self) -> &mut R {
&mut self.inner
}
#[inline]
pub fn into_inner(self) -> R {
self.inner
}
}
impl<R> Read for CountingReader<R>
where
R: Read,
{
fn read(&mut self, buffer: &mut [u8]) -> Result<usize> {
let count = self.inner.read(buffer)?;
self.bytes_read = self.bytes_read.saturating_add(count as u64);
Ok(count)
}
}
impl<R> BufRead for CountingReader<R>
where
R: BufRead,
{
#[inline]
fn fill_buf(&mut self) -> Result<&[u8]> {
self.inner.fill_buf()
}
#[inline]
fn consume(&mut self, amount: usize) {
self.bytes_read = self.bytes_read.saturating_add(amount as u64);
self.inner.consume(amount);
}
}
impl<R> Seek for CountingReader<R>
where
R: Seek,
{
#[inline]
fn seek(&mut self, position: SeekFrom) -> Result<u64> {
self.inner.seek(position)
}
}