Skip to content

Commit 319b883

Browse files
committed
Implement BufReader
1 parent 73a28e5 commit 319b883

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

src/libstd/rt/io/mem.rs

+39-3
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,27 @@ impl<'self> BufReader<'self> {
171171
}
172172

173173
impl<'self> Reader for BufReader<'self> {
174-
fn read(&mut self, _buf: &mut [u8]) -> Option<uint> { fail!() }
174+
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
175+
{ if self.eof() { return None; } }
176+
177+
let write_len = min(buf.len(), self.buf.len() - self.pos);
178+
{
179+
let input = self.buf.slice(self.pos, self.pos + write_len);
180+
let output = buf.mut_slice(0, write_len);
181+
assert_eq!(input.len(), output.len());
182+
vec::bytes::copy_memory(output, input, write_len);
183+
}
184+
self.pos += write_len;
185+
assert!(self.pos <= self.buf.len());
186+
187+
return Some(write_len);
188+
}
175189

176-
fn eof(&mut self) -> bool { fail!() }
190+
fn eof(&mut self) -> bool { self.pos == self.buf.len() }
177191
}
178192

179193
impl<'self> Seek for BufReader<'self> {
180-
fn tell(&self) -> u64 { fail!() }
194+
fn tell(&self) -> u64 { self.pos as u64 }
181195

182196
fn seek(&mut self, _pos: i64, _style: SeekStyle) { fail!() }
183197
}
@@ -219,4 +233,26 @@ mod test {
219233
assert_eq!(reader.read(buf), None);
220234
assert!(reader.eof());
221235
}
236+
237+
#[test]
238+
fn test_buf_reader() {
239+
let in_buf = ~[0, 1, 2, 3, 4, 5, 6, 7];
240+
let mut reader = BufReader::new(in_buf);
241+
let mut buf = [];
242+
assert_eq!(reader.read(buf), Some(0));
243+
assert_eq!(reader.tell(), 0);
244+
let mut buf = [0];
245+
assert_eq!(reader.read(buf), Some(1));
246+
assert_eq!(reader.tell(), 1);
247+
assert_eq!(buf, [0]);
248+
let mut buf = [0, ..4];
249+
assert_eq!(reader.read(buf), Some(4));
250+
assert_eq!(reader.tell(), 5);
251+
assert_eq!(buf, [1, 2, 3, 4]);
252+
assert_eq!(reader.read(buf), Some(3));
253+
assert_eq!(buf.slice(0, 3), [5, 6, 7]);
254+
assert!(reader.eof());
255+
assert_eq!(reader.read(buf), None);
256+
assert!(reader.eof());
257+
}
222258
}

0 commit comments

Comments
 (0)