Skip to content

Commit 023c1af

Browse files
committed
Add Size trait
1 parent 213eec9 commit 023c1af

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

src/adapter.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ where
9393
}
9494
}
9595

96+
impl<T> crate::Size for Adapter<T>
97+
where
98+
T: crate::Size + ?Sized,
99+
{
100+
#[inline]
101+
fn size(&self) -> io::Result<u64> {
102+
self.inner.size()
103+
}
104+
}
105+
96106
impl<T> io::Read for Adapter<T>
97107
where
98108
T: ReadAt + ?Sized,

src/file.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,12 @@ impl WriteAt for RandomAccessFile {
361361
}
362362
}
363363

364+
impl crate::Size for RandomAccessFile {
365+
fn size(&self) -> io::Result<u64> {
366+
self.with_file(|f| f.metadata().map(|m| m.len()))
367+
}
368+
}
369+
364370
impl From<File> for RandomAccessFile {
365371
/// Creates a new `RandomAccessFile` from an open [`File`].
366372
#[inline]
@@ -565,6 +571,13 @@ impl WriteAt for SyncFile {
565571
}
566572
}
567573

574+
impl crate::Size for SyncFile {
575+
#[inline]
576+
fn size(&self) -> io::Result<u64> {
577+
self.0.size()
578+
}
579+
}
580+
568581
impl io::Read for SyncFile {
569582
#[inline]
570583
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {

src/lib.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,85 @@ impl WriteAt for io::Sink {
510510
}
511511
}
512512

513+
/// The `Size` trait allows for getting the size of a stream.
514+
pub trait Size {
515+
/// Returns the size of the stream.
516+
fn size(&self) -> io::Result<u64>;
517+
}
518+
519+
impl Size for [u8] {
520+
#[inline]
521+
fn size(&self) -> io::Result<u64> {
522+
Ok(self.len() as u64)
523+
}
524+
}
525+
526+
impl<const N: usize> Size for [u8; N] {
527+
#[inline]
528+
fn size(&self) -> io::Result<u64> {
529+
Ok(self.len() as u64)
530+
}
531+
}
532+
533+
impl Size for Vec<u8> {
534+
#[inline]
535+
fn size(&self) -> io::Result<u64> {
536+
Ok(self.len() as u64)
537+
}
538+
}
539+
540+
impl Size for std::borrow::Cow<'_, [u8]> {
541+
#[inline]
542+
fn size(&self) -> io::Result<u64> {
543+
Ok(self.len() as u64)
544+
}
545+
}
546+
547+
impl<T> Size for io::Cursor<T>
548+
where
549+
T: AsRef<[u8]>,
550+
{
551+
#[inline]
552+
fn size(&self) -> io::Result<u64> {
553+
Ok(self.get_ref().as_ref().len() as u64)
554+
}
555+
}
556+
557+
impl<T: Size + ?Sized> Size for &'_ T {
558+
#[inline]
559+
fn size(&self) -> io::Result<u64> {
560+
(**self).size()
561+
}
562+
}
563+
564+
impl<T: Size + ?Sized> Size for Box<T> {
565+
#[inline]
566+
fn size(&self) -> io::Result<u64> {
567+
(**self).size()
568+
}
569+
}
570+
571+
impl<T: Size + ?Sized> Size for std::sync::Arc<T> {
572+
#[inline]
573+
fn size(&self) -> io::Result<u64> {
574+
(**self).size()
575+
}
576+
}
577+
578+
impl<T: Size + ?Sized> Size for std::rc::Rc<T> {
579+
#[inline]
580+
fn size(&self) -> io::Result<u64> {
581+
(**self).size()
582+
}
583+
}
584+
585+
impl Size for io::Empty {
586+
#[inline]
587+
fn size(&self) -> io::Result<u64> {
588+
Ok(0)
589+
}
590+
}
591+
513592
#[cold]
514593
fn fill_buffer_error() -> io::Error {
515594
io::Error::new(io::ErrorKind::UnexpectedEof, "failed to fill whole buffer")

0 commit comments

Comments
 (0)