From: Erick Tryzelaar Date: Tue, 3 Jun 2014 03:42:41 +0000 (-0700) Subject: std: add `IterReader` to adapt iterators into readers X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=30a8bcbe3df484f7fa9f2523f429490c97af0382;p=rust.git std: add `IterReader` to adapt iterators into readers --- diff --git a/src/libstd/io/util.rs b/src/libstd/io/util.rs index 05d5f19eeff..59c42f111d0 100644 --- a/src/libstd/io/util.rs +++ b/src/libstd/io/util.rs @@ -229,6 +229,36 @@ pub fn copy(r: &mut R, w: &mut W) -> io::IoResult<()> { } } +/// A `Reader` which converts an `Iterator` into a `Reader`. +pub struct IterReader { + iter: T, +} + +impl> IterReader { + /// Create a new `IterReader` which will read from the specified `Iterator`. + pub fn new(iter: T) -> IterReader { + IterReader { + iter: iter, + } + } +} + +impl> Reader for IterReader { + #[inline] + fn read(&mut self, buf: &mut [u8]) -> io::IoResult { + let mut len = 0; + for (slot, elt) in buf.mut_iter().zip(self.iter.by_ref()) { + *slot = elt; + len += 1; + } + if len == 0 { + Err(io::standard_error(io::EndOfFile)) + } else { + Ok(len) + } + } +} + #[cfg(test)] mod test { use io::{MemReader, MemWriter, BufReader}; @@ -366,4 +396,23 @@ fn limit_reader_buffer() { assert_eq!(r.read_line(), Ok("23456789\n".to_str())); } } + + #[test] + fn test_iter_reader() { + let mut r = IterReader::new(range(0u8, 8)); + let mut buf = [0, 0, 0]; + let len = r.read(buf).unwrap(); + assert_eq!(len, 3); + assert!(buf == [0, 1, 2]); + + let len = r.read(buf).unwrap(); + assert_eq!(len, 3); + assert!(buf == [3, 4, 5]); + + let len = r.read(buf).unwrap(); + assert_eq!(len, 2); + assert!(buf == [6, 7, 5]); + + assert_eq!(r.read(buf).unwrap_err().kind, io::EndOfFile); + } }