Skip to content

Commit 4eff313

Browse files
committed
core::rt:: Implement Reader/Writer for MemReader/MemWriter
1 parent fa478f5 commit 4eff313

File tree

2 files changed

+70
-7
lines changed

2 files changed

+70
-7
lines changed

src/libcore/rt/io/mem.rs

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
1818
use prelude::*;
1919
use super::*;
20-
20+
use cmp::min;
2121

2222
/// Writes to an owned, growable byte vector
2323
pub struct MemWriter {
@@ -29,13 +29,15 @@ impl MemWriter {
2929
}
3030

3131
impl Writer for MemWriter {
32-
fn write(&mut self, _buf: &[u8]) { fail!() }
32+
fn write(&mut self, buf: &[u8]) {
33+
self.buf.push_all(buf)
34+
}
3335

3436
fn flush(&mut self) { /* no-op */ }
3537
}
3638

3739
impl Seek for MemWriter {
38-
fn tell(&self) -> u64 { fail!() }
40+
fn tell(&self) -> u64 { self.buf.len() as u64 }
3941

4042
fn seek(&mut self, _pos: i64, _style: SeekStyle) { fail!() }
4143
}
@@ -77,13 +79,27 @@ impl MemReader {
7779
}
7880

7981
impl Reader for MemReader {
80-
fn read(&mut self, _buf: &mut [u8]) -> Option<uint> { fail!() }
82+
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
83+
{ if self.eof() { return None; } }
84+
85+
let write_len = min(buf.len(), self.buf.len() - self.pos);
86+
{
87+
let input = self.buf.slice(self.pos, self.pos + write_len);
88+
let output = vec::mut_slice(buf, 0, write_len);
89+
assert!(input.len() == output.len());
90+
vec::bytes::copy_memory(output, input, write_len);
91+
}
92+
self.pos += write_len;
93+
assert!(self.pos <= self.buf.len());
8194

82-
fn eof(&mut self) -> bool { fail!() }
95+
return Some(write_len);
96+
}
97+
98+
fn eof(&mut self) -> bool { self.pos == self.buf.len() }
8399
}
84100

85101
impl Seek for MemReader {
86-
fn tell(&self) -> u64 { fail!() }
102+
fn tell(&self) -> u64 { self.pos as u64 }
87103

88104
fn seek(&mut self, _pos: i64, _style: SeekStyle) { fail!() }
89105
}
@@ -163,4 +179,43 @@ impl<'self> Seek for BufReader<'self> {
163179
fn tell(&self) -> u64 { fail!() }
164180

165181
fn seek(&mut self, _pos: i64, _style: SeekStyle) { fail!() }
166-
}
182+
}
183+
184+
#[cfg(test)]
185+
mod test {
186+
use prelude::*;
187+
use super::*;
188+
189+
#[test]
190+
fn test_mem_writer() {
191+
let mut writer = MemWriter::new();
192+
assert!(writer.tell() == 0);
193+
writer.write([0]);
194+
assert!(writer.tell() == 1);
195+
writer.write([1, 2, 3]);
196+
writer.write([4, 5, 6, 7]);
197+
assert!(writer.tell() == 8);
198+
assert!(writer.inner() == ~[0, 1, 2, 3, 4, 5 , 6, 7]);
199+
}
200+
201+
#[test]
202+
fn test_mem_reader() {
203+
let mut reader = MemReader::new(~[0, 1, 2, 3, 4, 5, 6, 7]);
204+
let mut buf = [];
205+
assert!(reader.read(buf) == Some(0));
206+
assert!(reader.tell() == 0);
207+
let mut buf = [0];
208+
assert!(reader.read(buf) == Some(1));
209+
assert!(reader.tell() == 1);
210+
assert!(buf == [0]);
211+
let mut buf = [0, ..4];
212+
assert!(reader.read(buf) == Some(4));
213+
assert!(reader.tell() == 5);
214+
assert!(buf == [1, 2, 3, 4]);
215+
assert!(reader.read(buf) == Some(3));
216+
assert!(buf.slice(0, 3) == [5, 6, 7]);
217+
assert!(reader.eof());
218+
assert!(reader.read(buf) == None);
219+
assert!(reader.eof());
220+
}
221+
}

src/libcore/rt/io/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,14 @@ pub enum SeekStyle {
269269
/// * Are `u64` and `i64` the right choices?
270270
pub trait Seek {
271271
fn tell(&self) -> u64;
272+
273+
/// Seek to an offset in a stream
274+
///
275+
/// A successful seek clears the EOF indicator.
276+
///
277+
/// # XXX
278+
///
279+
/// * What is the behavior when seeking past the end of a stream?
272280
fn seek(&mut self, pos: i64, style: SeekStyle);
273281
}
274282

0 commit comments

Comments
 (0)