From 21c1e132b7de05360abbac48347470a2067854ff Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Fri, 7 Sep 2018 19:07:47 +0200 Subject: buffered-reader: Add a new buffered reader for files. --- buffered-reader/src/file_generic.rs | 94 +++++++++++++++++++++++++++++++++++++ buffered-reader/src/lib.rs | 3 ++ 2 files changed, 97 insertions(+) create mode 100644 buffered-reader/src/file_generic.rs (limited to 'buffered-reader') diff --git a/buffered-reader/src/file_generic.rs b/buffered-reader/src/file_generic.rs new file mode 100644 index 00000000..deb8da95 --- /dev/null +++ b/buffered-reader/src/file_generic.rs @@ -0,0 +1,94 @@ +use std::fmt; +use std::fs::File; +use std::io; +use std::path::Path; + +use super::*; + +/// A `BufferedReader` implementation for files. +/// +/// This is a generic implementation that may be replaced by +/// platform-specific versions. +pub struct BufferedReaderFile(BufferedReaderGeneric); + +impl fmt::Debug for BufferedReaderFile { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_tuple("BufferedReaderFile") + .field(&self.0) + .finish() + } +} + +impl BufferedReaderFile<()> { + /// Opens the given file. + pub fn open>(path: P) -> io::Result { + Self::with_cookie(path, ()) + } +} + +impl BufferedReaderFile { + /// Like `open()`, but sets a cookie. + pub fn with_cookie>(path: P, cookie: C) -> io::Result { + Ok(BufferedReaderFile( + BufferedReaderGeneric::with_cookie(File::open(path)?, + None, + cookie))) + } +} + +impl io::Read for BufferedReaderFile { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + self.0.read(buf) + } +} + +impl BufferedReader for BufferedReaderFile { + fn buffer(&self) -> &[u8] { + self.0.buffer() + } + + fn data(&mut self, amount: usize) -> io::Result<&[u8]> { + self.0.data(amount) + } + + fn data_hard(&mut self, amount: usize) -> io::Result<&[u8]> { + self.0.data_hard(amount) + } + + fn consume(&mut self, amount: usize) -> &[u8] { + self.0.consume(amount) + } + + fn data_consume(&mut self, amount: usize) -> io::Result<&[u8]> { + self.0.data_consume(amount) + } + + fn data_consume_hard(&mut self, amount: usize) -> io::Result<&[u8]> { + self.0.data_consume_hard(amount) + } + + fn get_mut(&mut self) -> Option<&mut BufferedReader> { + None + } + + fn get_ref(&self) -> Option<&BufferedReader> { + None + } + + fn into_inner<'b>(self: Box) -> Option + 'b>> + where Self: 'b { + None + } + + fn cookie_set(&mut self, cookie: C) -> C { + self.0.cookie_set(cookie) + } + + fn cookie_ref(&self) -> &C { + self.0.cookie_ref() + } + + fn cookie_mut(&mut self) -> &mut C { + self.0.cookie_mut() + } +} diff --git a/buffered-reader/src/lib.rs b/buffered-reader/src/lib.rs index 11b93ce0..8008ff23 100644 --- a/buffered-reader/src/lib.rs +++ b/buffered-reader/src/lib.rs @@ -32,6 +32,9 @@ pub use self::decompress_deflate::BufferedReaderZlib; #[cfg(feature = "compression-bzip2")] pub use self::decompress_bzip2::BufferedReaderBzip; +mod file_generic; +pub use self::file_generic::BufferedReaderFile; + // The default buffer size. const DEFAULT_BUF_SIZE: usize = 8 * 1024; -- cgit v1.2.3