1 // Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 // ignore-lexer-test FIXME #15679
13 //! Readers and Writers for in-memory buffers
17 use result::{Err, Ok};
19 use io::{Reader, Writer, Seek, Buffer, IoError, SeekStyle, IoResult};
20 use slice::{mod, AsSlice, ImmutableSlice};
23 const BUF_CAPACITY: uint = 128;
25 fn combine(seek: SeekStyle, cur: uint, end: uint, offset: i64) -> IoResult<u64> {
26 // compute offset as signed and clamp to prevent overflow
27 let pos = match seek {
35 kind: io::InvalidInput,
36 desc: "invalid seek to a negative offset",
40 Ok((offset + pos) as u64)
44 /// Writes to an owned, growable byte vector
49 /// # #![allow(unused_must_use)]
50 /// use std::io::MemWriter;
52 /// let mut w = MemWriter::new();
53 /// w.write([0, 1, 2]);
55 /// assert_eq!(w.unwrap(), vec!(0, 1, 2));
58 pub struct MemWriter {
63 /// Create a new `MemWriter`.
65 pub fn new() -> MemWriter {
66 MemWriter::with_capacity(BUF_CAPACITY)
68 /// Create a new `MemWriter`, allocating at least `n` bytes for
69 /// the internal buffer.
71 pub fn with_capacity(n: uint) -> MemWriter {
72 MemWriter::from_vec(Vec::with_capacity(n))
74 /// Create a new `MemWriter` that will append to an existing `Vec`.
76 pub fn from_vec(buf: Vec<u8>) -> MemWriter {
77 MemWriter { buf: buf }
80 /// Acquires an immutable reference to the underlying buffer of this
83 pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() }
85 /// Unwraps this `MemWriter`, returning the underlying buffer
87 pub fn unwrap(self) -> Vec<u8> { self.buf }
90 impl Writer for MemWriter {
92 fn write(&mut self, buf: &[u8]) -> IoResult<()> {
93 self.buf.push_all(buf);
98 /// Reads from an owned byte vector
103 /// # #![allow(unused_must_use)]
104 /// use std::io::MemReader;
106 /// let mut r = MemReader::new(vec!(0, 1, 2));
108 /// assert_eq!(r.read_to_end().unwrap(), vec!(0, 1, 2));
110 pub struct MemReader {
116 /// Creates a new `MemReader` which will read the buffer given. The buffer
117 /// can be re-acquired through `unwrap`
119 pub fn new(buf: Vec<u8>) -> MemReader {
126 /// Tests whether this reader has read all bytes in its buffer.
128 /// If `true`, then this will no longer return bytes from `read`.
130 pub fn eof(&self) -> bool { self.pos >= self.buf.len() }
132 /// Acquires an immutable reference to the underlying buffer of this
135 /// No method is exposed for acquiring a mutable reference to the buffer
136 /// because it could corrupt the state of this `MemReader`.
138 pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() }
140 /// Unwraps this `MemReader`, returning the underlying buffer
142 pub fn unwrap(self) -> Vec<u8> { self.buf }
145 impl Reader for MemReader {
147 fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
148 if self.eof() { return Err(io::standard_error(io::EndOfFile)) }
150 let write_len = min(buf.len(), self.buf.len() - self.pos);
152 let input = self.buf[self.pos.. self.pos + write_len];
153 let output = buf[mut ..write_len];
154 assert_eq!(input.len(), output.len());
155 slice::bytes::copy_memory(output, input);
157 self.pos += write_len;
158 assert!(self.pos <= self.buf.len());
160 return Ok(write_len);
164 impl Seek for MemReader {
166 fn tell(&self) -> IoResult<u64> { Ok(self.pos as u64) }
169 fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> {
170 let new = try!(combine(style, self.pos, self.buf.len(), pos));
171 self.pos = new as uint;
176 impl Buffer for MemReader {
178 fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
179 if self.pos < self.buf.len() {
180 Ok(self.buf[self.pos..])
182 Err(io::standard_error(io::EndOfFile))
187 fn consume(&mut self, amt: uint) { self.pos += amt; }
190 /// Writes to a fixed-size byte slice
192 /// If a write will not fit in the buffer, it returns an error and does not
198 /// # #![allow(unused_must_use)]
199 /// use std::io::BufWriter;
201 /// let mut buf = [0, ..4];
203 /// let mut w = BufWriter::new(buf);
204 /// w.write([0, 1, 2]);
206 /// assert!(buf == [0, 1, 2, 0]);
208 pub struct BufWriter<'a> {
213 impl<'a> BufWriter<'a> {
214 /// Creates a new `BufWriter` which will wrap the specified buffer. The
215 /// writer initially starts at position 0.
217 pub fn new<'a>(buf: &'a mut [u8]) -> BufWriter<'a> {
225 impl<'a> Writer for BufWriter<'a> {
227 fn write(&mut self, buf: &[u8]) -> IoResult<()> {
228 // return an error if the entire write does not fit in the buffer
229 let cap = if self.pos >= self.buf.len() { 0 } else { self.buf.len() - self.pos };
232 kind: io::OtherIoError,
233 desc: "Trying to write past end of buffer",
238 slice::bytes::copy_memory(self.buf[mut self.pos..], buf);
239 self.pos += buf.len();
244 impl<'a> Seek for BufWriter<'a> {
246 fn tell(&self) -> IoResult<u64> { Ok(self.pos as u64) }
249 fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> {
250 let new = try!(combine(style, self.pos, self.buf.len(), pos));
251 self.pos = new as uint;
256 /// Reads from a fixed-size byte slice
261 /// # #![allow(unused_must_use)]
262 /// use std::io::BufReader;
264 /// let mut buf = [0, 1, 2, 3];
265 /// let mut r = BufReader::new(buf);
267 /// assert_eq!(r.read_to_end().unwrap(), vec!(0, 1, 2, 3));
269 pub struct BufReader<'a> {
274 impl<'a> BufReader<'a> {
275 /// Creates a new buffered reader which will read the specified buffer
277 pub fn new<'a>(buf: &'a [u8]) -> BufReader<'a> {
284 /// Tests whether this reader has read all bytes in its buffer.
286 /// If `true`, then this will no longer return bytes from `read`.
288 pub fn eof(&self) -> bool { self.pos >= self.buf.len() }
291 impl<'a> Reader for BufReader<'a> {
293 fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
294 if self.eof() { return Err(io::standard_error(io::EndOfFile)) }
296 let write_len = min(buf.len(), self.buf.len() - self.pos);
298 let input = self.buf[self.pos.. self.pos + write_len];
299 let output = buf[mut ..write_len];
300 assert_eq!(input.len(), output.len());
301 slice::bytes::copy_memory(output, input);
303 self.pos += write_len;
304 assert!(self.pos <= self.buf.len());
306 return Ok(write_len);
310 impl<'a> Seek for BufReader<'a> {
312 fn tell(&self) -> IoResult<u64> { Ok(self.pos as u64) }
315 fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> {
316 let new = try!(combine(style, self.pos, self.buf.len(), pos));
317 self.pos = new as uint;
322 impl<'a> Buffer for BufReader<'a> {
324 fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
325 if self.pos < self.buf.len() {
326 Ok(self.buf[self.pos..])
328 Err(io::standard_error(io::EndOfFile))
333 fn consume(&mut self, amt: uint) { self.pos += amt; }
343 use self::test::Bencher;
347 fn test_mem_writer() {
348 let mut writer = MemWriter::new();
349 writer.write([0]).unwrap();
350 writer.write([1, 2, 3]).unwrap();
351 writer.write([4, 5, 6, 7]).unwrap();
352 let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
353 assert_eq!(writer.get_ref(), b);
357 fn test_buf_writer() {
358 let mut buf = [0 as u8, ..8];
360 let mut writer = BufWriter::new(buf);
361 assert_eq!(writer.tell(), Ok(0));
362 writer.write([0]).unwrap();
363 assert_eq!(writer.tell(), Ok(1));
364 writer.write([1, 2, 3]).unwrap();
365 writer.write([4, 5, 6, 7]).unwrap();
366 assert_eq!(writer.tell(), Ok(8));
367 writer.write([]).unwrap();
368 assert_eq!(writer.tell(), Ok(8));
370 let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
371 assert_eq!(buf.as_slice(), b);
375 fn test_buf_writer_seek() {
376 let mut buf = [0 as u8, ..8];
378 let mut writer = BufWriter::new(buf);
379 assert_eq!(writer.tell(), Ok(0));
380 writer.write([1]).unwrap();
381 assert_eq!(writer.tell(), Ok(1));
383 writer.seek(2, SeekSet).unwrap();
384 assert_eq!(writer.tell(), Ok(2));
385 writer.write([2]).unwrap();
386 assert_eq!(writer.tell(), Ok(3));
388 writer.seek(-2, SeekCur).unwrap();
389 assert_eq!(writer.tell(), Ok(1));
390 writer.write([3]).unwrap();
391 assert_eq!(writer.tell(), Ok(2));
393 writer.seek(-1, SeekEnd).unwrap();
394 assert_eq!(writer.tell(), Ok(7));
395 writer.write([4]).unwrap();
396 assert_eq!(writer.tell(), Ok(8));
399 let b: &[_] = &[1, 3, 2, 0, 0, 0, 0, 4];
400 assert_eq!(buf.as_slice(), b);
404 fn test_buf_writer_error() {
405 let mut buf = [0 as u8, ..2];
406 let mut writer = BufWriter::new(buf);
407 writer.write([0]).unwrap();
409 match writer.write([0, 0]) {
411 Err(e) => assert_eq!(e.kind, io::OtherIoError),
416 fn test_mem_reader() {
417 let mut reader = MemReader::new(vec!(0, 1, 2, 3, 4, 5, 6, 7));
419 assert_eq!(reader.read(buf), Ok(0));
420 assert_eq!(reader.tell(), Ok(0));
422 assert_eq!(reader.read(buf), Ok(1));
423 assert_eq!(reader.tell(), Ok(1));
425 assert_eq!(buf.as_slice(), b);
426 let mut buf = [0, ..4];
427 assert_eq!(reader.read(buf), Ok(4));
428 assert_eq!(reader.tell(), Ok(5));
429 let b: &[_] = &[1, 2, 3, 4];
430 assert_eq!(buf.as_slice(), b);
431 assert_eq!(reader.read(buf), Ok(3));
432 let b: &[_] = &[5, 6, 7];
433 assert_eq!(buf[0..3], b);
434 assert!(reader.read(buf).is_err());
435 let mut reader = MemReader::new(vec!(0, 1, 2, 3, 4, 5, 6, 7));
436 assert_eq!(reader.read_until(3).unwrap(), vec!(0, 1, 2, 3));
437 assert_eq!(reader.read_until(3).unwrap(), vec!(4, 5, 6, 7));
438 assert!(reader.read(buf).is_err());
442 fn test_buf_reader() {
443 let in_buf = vec![0, 1, 2, 3, 4, 5, 6, 7];
444 let mut reader = BufReader::new(in_buf.as_slice());
446 assert_eq!(reader.read(buf), Ok(0));
447 assert_eq!(reader.tell(), Ok(0));
449 assert_eq!(reader.read(buf), Ok(1));
450 assert_eq!(reader.tell(), Ok(1));
452 assert_eq!(buf.as_slice(), b);
453 let mut buf = [0, ..4];
454 assert_eq!(reader.read(buf), Ok(4));
455 assert_eq!(reader.tell(), Ok(5));
456 let b: &[_] = &[1, 2, 3, 4];
457 assert_eq!(buf.as_slice(), b);
458 assert_eq!(reader.read(buf), Ok(3));
459 let b: &[_] = &[5, 6, 7];
460 assert_eq!(buf[0..3], b);
461 assert!(reader.read(buf).is_err());
462 let mut reader = BufReader::new(in_buf.as_slice());
463 assert_eq!(reader.read_until(3).unwrap(), vec!(0, 1, 2, 3));
464 assert_eq!(reader.read_until(3).unwrap(), vec!(4, 5, 6, 7));
465 assert!(reader.read(buf).is_err());
469 fn test_read_char() {
470 let b = b"Vi\xE1\xBB\x87t";
471 let mut r = BufReader::new(b);
472 assert_eq!(r.read_char(), Ok('V'));
473 assert_eq!(r.read_char(), Ok('i'));
474 assert_eq!(r.read_char(), Ok('ệ'));
475 assert_eq!(r.read_char(), Ok('t'));
476 assert!(r.read_char().is_err());
480 fn test_read_bad_char() {
482 let mut r = BufReader::new(b);
483 assert!(r.read_char().is_err());
487 fn test_write_strings() {
488 let mut writer = MemWriter::new();
489 writer.write_str("testing").unwrap();
490 writer.write_line("testing").unwrap();
491 writer.write_str("testing").unwrap();
492 let mut r = BufReader::new(writer.get_ref());
493 assert_eq!(r.read_to_string().unwrap(), "testingtesting\ntesting".to_string());
497 fn test_write_char() {
498 let mut writer = MemWriter::new();
499 writer.write_char('a').unwrap();
500 writer.write_char('\n').unwrap();
501 writer.write_char('ệ').unwrap();
502 let mut r = BufReader::new(writer.get_ref());
503 assert_eq!(r.read_to_string().unwrap(), "a\nệ".to_string());
507 fn test_read_whole_string_bad() {
509 let mut r = BufReader::new(buf);
510 match r.read_to_string() {
519 let mut r = BufReader::new(buf);
520 r.seek(10, SeekSet).unwrap();
521 assert!(r.read(&mut []).is_err());
523 let mut r = MemReader::new(vec!(10));
524 r.seek(10, SeekSet).unwrap();
525 assert!(r.read(&mut []).is_err());
528 let mut r = BufWriter::new(buf);
529 r.seek(10, SeekSet).unwrap();
530 assert!(r.write([3]).is_err());
536 let mut r = BufReader::new(buf);
537 assert!(r.seek(-1, SeekSet).is_err());
539 let mut r = MemReader::new(vec!(10));
540 assert!(r.seek(-1, SeekSet).is_err());
543 let mut r = BufWriter::new(buf);
544 assert!(r.seek(-1, SeekSet).is_err());
548 fn io_read_at_least() {
549 let mut r = MemReader::new(vec![1, 2, 3, 4, 5, 6, 7, 8]);
550 let mut buf = [0, ..3];
551 assert!(r.read_at_least(buf.len(), buf).is_ok());
552 let b: &[_] = &[1, 2, 3];
553 assert_eq!(buf.as_slice(), b);
554 assert!(r.read_at_least(0, buf[mut ..0]).is_ok());
555 assert_eq!(buf.as_slice(), b);
556 assert!(r.read_at_least(buf.len(), buf).is_ok());
557 let b: &[_] = &[4, 5, 6];
558 assert_eq!(buf.as_slice(), b);
559 assert!(r.read_at_least(buf.len(), buf).is_err());
560 let b: &[_] = &[7, 8, 6];
561 assert_eq!(buf.as_slice(), b);
564 fn do_bench_mem_writer(b: &mut Bencher, times: uint, len: uint) {
565 let src: Vec<u8> = Vec::from_elem(len, 5);
567 b.bytes = (times * len) as u64;
569 let mut wr = MemWriter::new();
570 for _ in range(0, times) {
571 wr.write(src.as_slice()).unwrap();
575 assert_eq!(v.len(), times * len);
576 assert!(v.iter().all(|x| *x == 5));
581 fn bench_mem_writer_001_0000(b: &mut Bencher) {
582 do_bench_mem_writer(b, 1, 0)
586 fn bench_mem_writer_001_0010(b: &mut Bencher) {
587 do_bench_mem_writer(b, 1, 10)
591 fn bench_mem_writer_001_0100(b: &mut Bencher) {
592 do_bench_mem_writer(b, 1, 100)
596 fn bench_mem_writer_001_1000(b: &mut Bencher) {
597 do_bench_mem_writer(b, 1, 1000)
601 fn bench_mem_writer_100_0000(b: &mut Bencher) {
602 do_bench_mem_writer(b, 100, 0)
606 fn bench_mem_writer_100_0010(b: &mut Bencher) {
607 do_bench_mem_writer(b, 100, 10)
611 fn bench_mem_writer_100_0100(b: &mut Bencher) {
612 do_bench_mem_writer(b, 100, 100)
616 fn bench_mem_writer_100_1000(b: &mut Bencher) {
617 do_bench_mem_writer(b, 100, 1000)
621 fn bench_mem_reader(b: &mut Bencher) {
623 let buf = [5 as u8, ..100].to_vec();
625 let mut rdr = MemReader::new(buf);
626 for _i in range(0u, 10) {
627 let mut buf = [0 as u8, .. 10];
628 rdr.read(buf).unwrap();
629 assert_eq!(buf.as_slice(), [5, .. 10].as_slice());
636 fn bench_buf_writer(b: &mut Bencher) {
638 let mut buf = [0 as u8, ..100];
640 let mut wr = BufWriter::new(buf);
641 for _i in range(0u, 10) {
642 wr.write([5, .. 10]).unwrap();
645 assert_eq!(buf.as_slice(), [5, .. 100].as_slice());
650 fn bench_buf_reader(b: &mut Bencher) {
652 let buf = [5 as u8, ..100];
654 let mut rdr = BufReader::new(buf);
655 for _i in range(0u, 10) {
656 let mut buf = [0 as u8, .. 10];
657 rdr.read(buf).unwrap();
658 assert_eq!(buf.as_slice(), [5, .. 10].as_slice());