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 //! Readers and Writers for in-memory buffers
14 use container::Container;
16 use result::{Err, Ok};
18 use io::{Reader, Writer, Seek, Buffer, IoError, SeekStyle, IoResult};
20 use slice::{Vector, ImmutableVector, MutableVector};
23 fn combine(seek: SeekStyle, cur: uint, end: uint, offset: i64) -> IoResult<u64> {
24 // compute offset as signed and clamp to prevent overflow
25 let pos = match seek {
33 kind: io::InvalidInput,
34 desc: "invalid seek to a negative offset",
38 Ok((offset + pos) as u64)
42 /// Writes to an owned, growable byte vector
47 /// # #![allow(unused_must_use)]
48 /// use std::io::MemWriter;
50 /// let mut w = MemWriter::new();
51 /// w.write([0, 1, 2]);
53 /// assert_eq!(w.unwrap(), vec!(0, 1, 2));
55 pub struct MemWriter {
61 /// Create a new `MemWriter`.
62 pub fn new() -> MemWriter {
63 MemWriter::with_capacity(128)
65 /// Create a new `MemWriter`, allocating at least `n` bytes for
66 /// the internal buffer.
67 pub fn with_capacity(n: uint) -> MemWriter {
68 MemWriter { buf: Vec::with_capacity(n), pos: 0 }
71 /// Acquires an immutable reference to the underlying buffer of this
74 /// No method is exposed for acquiring a mutable reference to the buffer
75 /// because it could corrupt the state of this `MemWriter`.
76 pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() }
78 /// Unwraps this `MemWriter`, returning the underlying buffer
79 pub fn unwrap(self) -> Vec<u8> { self.buf }
82 impl Writer for MemWriter {
83 fn write(&mut self, buf: &[u8]) -> IoResult<()> {
84 // Make sure the internal buffer is as least as big as where we
86 let difference = self.pos as i64 - self.buf.len() as i64;
88 self.buf.grow(difference as uint, &0);
91 // Figure out what bytes will be used to overwrite what's currently
92 // there (left), and what will be appended on the end (right)
93 let cap = self.buf.len() - self.pos;
94 let (left, right) = if cap <= buf.len() {
95 (buf.slice_to(cap), buf.slice_from(cap))
100 // Do the necessary writes
102 slice::bytes::copy_memory(self.buf.mut_slice_from(self.pos), left);
105 self.buf.push_all(right);
109 self.pos += buf.len();
114 impl Seek for MemWriter {
115 fn tell(&self) -> IoResult<u64> { Ok(self.pos as u64) }
116 fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> {
117 let new = try!(combine(style, self.pos, self.buf.len(), pos));
118 self.pos = new as uint;
123 /// Reads from an owned byte vector
128 /// # #![allow(unused_must_use)]
129 /// use std::io::MemReader;
131 /// let mut r = MemReader::new(vec!(0, 1, 2));
133 /// assert_eq!(r.read_to_end().unwrap(), vec!(0, 1, 2));
135 pub struct MemReader {
141 /// Creates a new `MemReader` which will read the buffer given. The buffer
142 /// can be re-acquired through `unwrap`
143 pub fn new(buf: Vec<u8>) -> MemReader {
150 /// Tests whether this reader has read all bytes in its buffer.
152 /// If `true`, then this will no longer return bytes from `read`.
153 pub fn eof(&self) -> bool { self.pos >= self.buf.len() }
155 /// Acquires an immutable reference to the underlying buffer of this
158 /// No method is exposed for acquiring a mutable reference to the buffer
159 /// because it could corrupt the state of this `MemReader`.
160 pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() }
162 /// Unwraps this `MemReader`, returning the underlying buffer
163 pub fn unwrap(self) -> Vec<u8> { self.buf }
166 impl Reader for MemReader {
167 fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
168 if self.eof() { return Err(io::standard_error(io::EndOfFile)) }
170 let write_len = min(buf.len(), self.buf.len() - self.pos);
172 let input = self.buf.slice(self.pos, self.pos + write_len);
173 let output = buf.mut_slice(0, write_len);
174 assert_eq!(input.len(), output.len());
175 slice::bytes::copy_memory(output, input);
177 self.pos += write_len;
178 assert!(self.pos <= self.buf.len());
180 return Ok(write_len);
184 impl Seek for MemReader {
185 fn tell(&self) -> IoResult<u64> { Ok(self.pos as u64) }
186 fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> {
187 let new = try!(combine(style, self.pos, self.buf.len(), pos));
188 self.pos = new as uint;
193 impl Buffer for MemReader {
194 fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
195 if self.pos < self.buf.len() {
196 Ok(self.buf.slice_from(self.pos))
198 Err(io::standard_error(io::EndOfFile))
201 fn consume(&mut self, amt: uint) { self.pos += amt; }
204 /// Writes to a fixed-size byte slice
206 /// If a write will not fit in the buffer, it returns an error and does not
212 /// # #![allow(unused_must_use)]
213 /// use std::io::BufWriter;
215 /// let mut buf = [0, ..4];
217 /// let mut w = BufWriter::new(buf);
218 /// w.write([0, 1, 2]);
220 /// assert!(buf == [0, 1, 2, 0]);
222 pub struct BufWriter<'a> {
227 impl<'a> BufWriter<'a> {
228 /// Creates a new `BufWriter` which will wrap the specified buffer. The
229 /// writer initially starts at position 0.
230 pub fn new<'a>(buf: &'a mut [u8]) -> BufWriter<'a> {
238 impl<'a> Writer for BufWriter<'a> {
239 fn write(&mut self, buf: &[u8]) -> IoResult<()> {
240 // return an error if the entire write does not fit in the buffer
241 let max_size = self.buf.len();
242 if self.pos >= max_size || (self.pos + buf.len()) > max_size {
244 kind: io::OtherIoError,
245 desc: "Trying to write past end of buffer",
250 slice::bytes::copy_memory(self.buf.mut_slice_from(self.pos), buf);
251 self.pos += buf.len();
256 impl<'a> Seek for BufWriter<'a> {
257 fn tell(&self) -> IoResult<u64> { Ok(self.pos as u64) }
258 fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> {
259 let new = try!(combine(style, self.pos, self.buf.len(), pos));
260 self.pos = new as uint;
265 /// Reads from a fixed-size byte slice
270 /// # #![allow(unused_must_use)]
271 /// use std::io::BufReader;
273 /// let mut buf = [0, 1, 2, 3];
274 /// let mut r = BufReader::new(buf);
276 /// assert_eq!(r.read_to_end().unwrap(), vec!(0, 1, 2, 3));
278 pub struct BufReader<'a> {
283 impl<'a> BufReader<'a> {
284 /// Creates a new buffered reader which will read the specified buffer
285 pub fn new<'a>(buf: &'a [u8]) -> BufReader<'a> {
292 /// Tests whether this reader has read all bytes in its buffer.
294 /// If `true`, then this will no longer return bytes from `read`.
295 pub fn eof(&self) -> bool { self.pos >= self.buf.len() }
298 impl<'a> Reader for BufReader<'a> {
299 fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
300 if self.eof() { return Err(io::standard_error(io::EndOfFile)) }
302 let write_len = min(buf.len(), self.buf.len() - self.pos);
304 let input = self.buf.slice(self.pos, self.pos + write_len);
305 let output = buf.mut_slice(0, write_len);
306 assert_eq!(input.len(), output.len());
307 slice::bytes::copy_memory(output, input);
309 self.pos += write_len;
310 assert!(self.pos <= self.buf.len());
312 return Ok(write_len);
316 impl<'a> Seek for BufReader<'a> {
317 fn tell(&self) -> IoResult<u64> { Ok(self.pos as u64) }
318 fn seek(&mut self, pos: i64, style: SeekStyle) -> IoResult<()> {
319 let new = try!(combine(style, self.pos, self.buf.len(), pos));
320 self.pos = new as uint;
325 impl<'a> Buffer for BufReader<'a> {
326 fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
327 if self.pos < self.buf.len() {
328 Ok(self.buf.slice_from(self.pos))
330 Err(io::standard_error(io::EndOfFile))
333 fn consume(&mut self, amt: uint) { self.pos += amt; }
345 fn test_mem_writer() {
346 let mut writer = MemWriter::new();
347 assert_eq!(writer.tell(), Ok(0));
348 writer.write([0]).unwrap();
349 assert_eq!(writer.tell(), Ok(1));
350 writer.write([1, 2, 3]).unwrap();
351 writer.write([4, 5, 6, 7]).unwrap();
352 assert_eq!(writer.tell(), Ok(8));
353 assert_eq!(writer.get_ref(), &[0, 1, 2, 3, 4, 5, 6, 7]);
355 writer.seek(0, SeekSet).unwrap();
356 assert_eq!(writer.tell(), Ok(0));
357 writer.write([3, 4]).unwrap();
358 assert_eq!(writer.get_ref(), &[3, 4, 2, 3, 4, 5, 6, 7]);
360 writer.seek(1, SeekCur).unwrap();
361 writer.write([0, 1]).unwrap();
362 assert_eq!(writer.get_ref(), &[3, 4, 2, 0, 1, 5, 6, 7]);
364 writer.seek(-1, SeekEnd).unwrap();
365 writer.write([1, 2]).unwrap();
366 assert_eq!(writer.get_ref(), &[3, 4, 2, 0, 1, 5, 6, 1, 2]);
368 writer.seek(1, SeekEnd).unwrap();
369 writer.write([1]).unwrap();
370 assert_eq!(writer.get_ref(), &[3, 4, 2, 0, 1, 5, 6, 1, 2, 0, 1]);
374 fn test_buf_writer() {
375 let mut buf = [0 as u8, ..8];
377 let mut writer = BufWriter::new(buf);
378 assert_eq!(writer.tell(), Ok(0));
379 writer.write([0]).unwrap();
380 assert_eq!(writer.tell(), Ok(1));
381 writer.write([1, 2, 3]).unwrap();
382 writer.write([4, 5, 6, 7]).unwrap();
383 assert_eq!(writer.tell(), Ok(8));
385 assert_eq!(buf.as_slice(), &[0, 1, 2, 3, 4, 5, 6, 7]);
389 fn test_buf_writer_seek() {
390 let mut buf = [0 as u8, ..8];
392 let mut writer = BufWriter::new(buf);
393 assert_eq!(writer.tell(), Ok(0));
394 writer.write([1]).unwrap();
395 assert_eq!(writer.tell(), Ok(1));
397 writer.seek(2, SeekSet).unwrap();
398 assert_eq!(writer.tell(), Ok(2));
399 writer.write([2]).unwrap();
400 assert_eq!(writer.tell(), Ok(3));
402 writer.seek(-2, SeekCur).unwrap();
403 assert_eq!(writer.tell(), Ok(1));
404 writer.write([3]).unwrap();
405 assert_eq!(writer.tell(), Ok(2));
407 writer.seek(-1, SeekEnd).unwrap();
408 assert_eq!(writer.tell(), Ok(7));
409 writer.write([4]).unwrap();
410 assert_eq!(writer.tell(), Ok(8));
413 assert_eq!(buf.as_slice(), &[1, 3, 2, 0, 0, 0, 0, 4]);
417 fn test_buf_writer_error() {
418 let mut buf = [0 as u8, ..2];
419 let mut writer = BufWriter::new(buf);
420 writer.write([0]).unwrap();
422 match writer.write([0, 0]) {
424 Err(e) => assert_eq!(e.kind, io::OtherIoError),
429 fn test_mem_reader() {
430 let mut reader = MemReader::new(vec!(0, 1, 2, 3, 4, 5, 6, 7));
432 assert_eq!(reader.read(buf), Ok(0));
433 assert_eq!(reader.tell(), Ok(0));
435 assert_eq!(reader.read(buf), Ok(1));
436 assert_eq!(reader.tell(), Ok(1));
437 assert_eq!(buf.as_slice(), &[0]);
438 let mut buf = [0, ..4];
439 assert_eq!(reader.read(buf), Ok(4));
440 assert_eq!(reader.tell(), Ok(5));
441 assert_eq!(buf.as_slice(), &[1, 2, 3, 4]);
442 assert_eq!(reader.read(buf), Ok(3));
443 assert_eq!(buf.slice(0, 3), &[5, 6, 7]);
444 assert!(reader.read(buf).is_err());
445 let mut reader = MemReader::new(vec!(0, 1, 2, 3, 4, 5, 6, 7));
446 assert_eq!(reader.read_until(3).unwrap(), vec!(0, 1, 2, 3));
447 assert_eq!(reader.read_until(3).unwrap(), vec!(4, 5, 6, 7));
448 assert!(reader.read(buf).is_err());
452 fn test_buf_reader() {
453 let in_buf = ~[0, 1, 2, 3, 4, 5, 6, 7];
454 let mut reader = BufReader::new(in_buf);
456 assert_eq!(reader.read(buf), Ok(0));
457 assert_eq!(reader.tell(), Ok(0));
459 assert_eq!(reader.read(buf), Ok(1));
460 assert_eq!(reader.tell(), Ok(1));
461 assert_eq!(buf.as_slice(), &[0]);
462 let mut buf = [0, ..4];
463 assert_eq!(reader.read(buf), Ok(4));
464 assert_eq!(reader.tell(), Ok(5));
465 assert_eq!(buf.as_slice(), &[1, 2, 3, 4]);
466 assert_eq!(reader.read(buf), Ok(3));
467 assert_eq!(buf.slice(0, 3), &[5, 6, 7]);
468 assert!(reader.read(buf).is_err());
469 let mut reader = BufReader::new(in_buf);
470 assert_eq!(reader.read_until(3).unwrap(), vec!(0, 1, 2, 3));
471 assert_eq!(reader.read_until(3).unwrap(), vec!(4, 5, 6, 7));
472 assert!(reader.read(buf).is_err());
476 fn test_read_char() {
477 let b = bytes!("Việt");
478 let mut r = BufReader::new(b);
479 assert_eq!(r.read_char(), Ok('V'));
480 assert_eq!(r.read_char(), Ok('i'));
481 assert_eq!(r.read_char(), Ok('ệ'));
482 assert_eq!(r.read_char(), Ok('t'));
483 assert!(r.read_char().is_err());
487 fn test_read_bad_char() {
488 let b = bytes!(0x80);
489 let mut r = BufReader::new(b);
490 assert!(r.read_char().is_err());
494 fn test_write_strings() {
495 let mut writer = MemWriter::new();
496 writer.write_str("testing").unwrap();
497 writer.write_line("testing").unwrap();
498 writer.write_str("testing").unwrap();
499 let mut r = BufReader::new(writer.get_ref());
500 assert_eq!(r.read_to_str().unwrap(), "testingtesting\ntesting".to_owned());
504 fn test_write_char() {
505 let mut writer = MemWriter::new();
506 writer.write_char('a').unwrap();
507 writer.write_char('\n').unwrap();
508 writer.write_char('ệ').unwrap();
509 let mut r = BufReader::new(writer.get_ref());
510 assert_eq!(r.read_to_str().unwrap(), "a\nệ".to_owned());
514 fn test_read_whole_string_bad() {
516 let mut r = BufReader::new(buf);
517 match r.read_to_str() {
526 let mut r = BufReader::new(buf);
527 r.seek(10, SeekSet).unwrap();
528 assert!(r.read(&mut []).is_err());
530 let mut r = MemReader::new(vec!(10));
531 r.seek(10, SeekSet).unwrap();
532 assert!(r.read(&mut []).is_err());
534 let mut r = MemWriter::new();
535 r.seek(10, SeekSet).unwrap();
536 assert!(r.write([3]).is_ok());
539 let mut r = BufWriter::new(buf);
540 r.seek(10, SeekSet).unwrap();
541 assert!(r.write([3]).is_err());
547 let mut r = BufReader::new(buf);
548 assert!(r.seek(-1, SeekSet).is_err());
550 let mut r = MemReader::new(vec!(10));
551 assert!(r.seek(-1, SeekSet).is_err());
553 let mut r = MemWriter::new();
554 assert!(r.seek(-1, SeekSet).is_err());
557 let mut r = BufWriter::new(buf);
558 assert!(r.seek(-1, SeekSet).is_err());
563 let mut r = MemReader::new(vec!(1, 2, 3, 4, 5, 6, 7, 8));
564 let mut buf = [0, ..3];
565 assert_eq!(r.fill(buf), Ok(()));
566 assert_eq!(buf.as_slice(), &[1, 2, 3]);
567 assert_eq!(r.fill(buf.mut_slice_to(0)), Ok(()));
568 assert_eq!(buf.as_slice(), &[1, 2, 3]);
569 assert_eq!(r.fill(buf), Ok(()));
570 assert_eq!(buf.as_slice(), &[4, 5, 6]);
571 assert!(r.fill(buf).is_err());
572 assert_eq!(buf.as_slice(), &[7, 8, 6]);