Skip to content

Commit 6b244d5

Browse files
committed
Implement Read, BufRead, Write and Seek for Cursor<Box<[u8]>>
1 parent 11eda66 commit 6b244d5

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

src/libstd/io/cursor.rs

+57
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,16 @@ impl Write for Cursor<Vec<u8>> {
265265
fn flush(&mut self) -> io::Result<()> { Ok(()) }
266266
}
267267

268+
#[stable(feature = "cursor_box_slice", since = "1.5.0")]
269+
impl Write for Cursor<Box<[u8]>> {
270+
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
271+
let pos = cmp::min(self.pos, self.inner.len() as u64);
272+
let amt = try!((&mut self.inner[(pos as usize)..]).write(buf));
273+
self.pos += amt as u64;
274+
Ok(amt)
275+
}
276+
fn flush(&mut self) -> io::Result<()> { Ok(()) }
277+
}
268278

269279
#[cfg(test)]
270280
mod tests {
@@ -292,6 +302,24 @@ mod tests {
292302
assert_eq!(&writer.get_ref()[..], b);
293303
}
294304

305+
#[test]
306+
fn test_box_slice_writer() {
307+
let mut writer = Cursor::new(vec![0u8; 9].into_boxed_slice());
308+
assert_eq!(writer.position(), 0);
309+
assert_eq!(writer.write(&[0]).unwrap(), 1);
310+
assert_eq!(writer.position(), 1);
311+
assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
312+
assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
313+
assert_eq!(writer.position(), 8);
314+
assert_eq!(writer.write(&[]).unwrap(), 0);
315+
assert_eq!(writer.position(), 8);
316+
317+
assert_eq!(writer.write(&[8, 9]).unwrap(), 1);
318+
assert_eq!(writer.write(&[10]).unwrap(), 0);
319+
let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
320+
assert_eq!(&**writer.get_ref(), b);
321+
}
322+
295323
#[test]
296324
fn test_buf_writer() {
297325
let mut buf = [0 as u8; 9];
@@ -373,6 +401,28 @@ mod tests {
373401
assert_eq!(reader.read(&mut buf).unwrap(), 0);
374402
}
375403

404+
#[test]
405+
fn test_boxed_slice_reader() {
406+
let mut reader = Cursor::new(vec!(0, 1, 2, 3, 4, 5, 6, 7).into_boxed_slice());
407+
let mut buf = [];
408+
assert_eq!(reader.read(&mut buf).unwrap(), 0);
409+
assert_eq!(reader.position(), 0);
410+
let mut buf = [0];
411+
assert_eq!(reader.read(&mut buf).unwrap(), 1);
412+
assert_eq!(reader.position(), 1);
413+
let b: &[_] = &[0];
414+
assert_eq!(buf, b);
415+
let mut buf = [0; 4];
416+
assert_eq!(reader.read(&mut buf).unwrap(), 4);
417+
assert_eq!(reader.position(), 5);
418+
let b: &[_] = &[1, 2, 3, 4];
419+
assert_eq!(buf, b);
420+
assert_eq!(reader.read(&mut buf).unwrap(), 3);
421+
let b: &[_] = &[5, 6, 7];
422+
assert_eq!(&buf[..3], b);
423+
assert_eq!(reader.read(&mut buf).unwrap(), 0);
424+
}
425+
376426
#[test]
377427
fn read_to_end() {
378428
let mut reader = Cursor::new(vec!(0, 1, 2, 3, 4, 5, 6, 7));
@@ -459,6 +509,10 @@ mod tests {
459509
let mut r = Cursor::new(&mut buf[..]);
460510
assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
461511
assert_eq!(r.write(&[3]).unwrap(), 0);
512+
513+
let mut r = Cursor::new(vec![10].into_boxed_slice());
514+
assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
515+
assert_eq!(r.write(&[3]).unwrap(), 0);
462516
}
463517

464518
#[test]
@@ -473,6 +527,9 @@ mod tests {
473527
let mut buf = [0];
474528
let mut r = Cursor::new(&mut buf[..]);
475529
assert!(r.seek(SeekFrom::End(-2)).is_err());
530+
531+
let mut r = Cursor::new(vec!(10).into_boxed_slice());
532+
assert!(r.seek(SeekFrom::End(-2)).is_err());
476533
}
477534

478535
#[test]

0 commit comments

Comments
 (0)