}
}
+/// A `Reader` which converts an `Iterator<u8>` into a `Reader`.
+pub struct IterReader<T> {
+ iter: T,
+}
+
+impl<T: Iterator<u8>> IterReader<T> {
+ /// Create a new `IterReader` which will read from the specified `Iterator`.
+ pub fn new(iter: T) -> IterReader<T> {
+ IterReader {
+ iter: iter,
+ }
+ }
+}
+
+impl<T: Iterator<u8>> Reader for IterReader<T> {
+ #[inline]
+ fn read(&mut self, buf: &mut [u8]) -> io::IoResult<uint> {
+ 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};
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);
+ }
}