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
15 use container::Container;
16 use option::{Option, Some, None};
17 use super::{Reader, Writer, Seek, Buffer, IoError, SeekStyle, io_error,
20 use vec::{Vector, ImmutableVector, MutableVector, OwnedCopyableVector};
22 /// Writes to an owned, growable byte vector
27 /// use std::io::MemWriter;
29 /// let mut w = MemWriter::new();
30 /// w.write([0, 1, 2]);
32 /// assert_eq!(w.unwrap(), ~[0, 1, 2]);
34 pub struct MemWriter {
40 /// Create a new `MemWriter`.
41 pub fn new() -> MemWriter {
42 MemWriter::with_capacity(128)
44 /// Create a new `MemWriter`, allocating at least `n` bytes for
45 /// the internal buffer.
46 pub fn with_capacity(n: uint) -> MemWriter {
47 MemWriter { buf: vec::with_capacity(n), pos: 0 }
50 /// Acquires an immutable reference to the underlying buffer of this
53 /// No method is exposed for acquiring a mutable reference to the buffer
54 /// because it could corrupt the state of this `MemWriter`.
55 pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() }
57 /// Unwraps this `MemWriter`, returning the underlying buffer
58 pub fn unwrap(self) -> ~[u8] { self.buf }
61 impl Writer for MemWriter {
62 fn write(&mut self, buf: &[u8]) {
63 // Make sure the internal buffer is as least as big as where we
65 let difference = self.pos as i64 - self.buf.len() as i64;
67 self.buf.grow(difference as uint, &0);
70 // Figure out what bytes will be used to overwrite what's currently
71 // there (left), and what will be appended on the end (right)
72 let cap = self.buf.len() - self.pos;
73 let (left, right) = if cap <= buf.len() {
74 (buf.slice_to(cap), buf.slice_from(cap))
79 // Do the necessary writes
81 vec::bytes::copy_memory(self.buf.mut_slice_from(self.pos), left);
84 self.buf.push_all(right);
88 self.pos += buf.len();
93 impl Seek for MemWriter {
94 fn tell(&self) -> u64 { self.pos as u64 }
96 fn seek(&mut self, pos: i64, style: SeekStyle) {
97 // compute offset as signed and clamp to prevent overflow
98 let offset = match style {
100 SeekEnd => { self.buf.len() }
101 SeekCur => { self.pos }
104 self.pos = max(0, offset+pos) as uint;
108 /// Reads from an owned byte vector
113 /// use std::io::MemReader;
115 /// let mut r = MemReader::new(~[0, 1, 2]);
117 /// assert_eq!(r.read_to_end(), ~[0, 1, 2]);
119 pub struct MemReader {
125 /// Creates a new `MemReader` which will read the buffer given. The buffer
126 /// can be re-acquired through `unwrap`
127 pub fn new(buf: ~[u8]) -> MemReader {
134 /// Tests whether this reader has read all bytes in its buffer.
136 /// If `true`, then this will no longer return bytes from `read`.
137 pub fn eof(&self) -> bool { self.pos == self.buf.len() }
139 /// Acquires an immutable reference to the underlying buffer of this
142 /// No method is exposed for acquiring a mutable reference to the buffer
143 /// because it could corrupt the state of this `MemReader`.
144 pub fn get_ref<'a>(&'a self) -> &'a [u8] { self.buf.as_slice() }
146 /// Unwraps this `MemReader`, returning the underlying buffer
147 pub fn unwrap(self) -> ~[u8] { self.buf }
150 impl Reader for MemReader {
151 fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
152 if self.eof() { return None }
154 let write_len = min(buf.len(), self.buf.len() - self.pos);
156 let input = self.buf.slice(self.pos, self.pos + write_len);
157 let output = buf.mut_slice(0, write_len);
158 assert_eq!(input.len(), output.len());
159 vec::bytes::copy_memory(output, input);
161 self.pos += write_len;
162 assert!(self.pos <= self.buf.len());
164 return Some(write_len);
168 impl Seek for MemReader {
169 fn tell(&self) -> u64 { self.pos as u64 }
170 fn seek(&mut self, _pos: i64, _style: SeekStyle) { fail!() }
173 impl Buffer for MemReader {
174 fn fill<'a>(&'a mut self) -> &'a [u8] { self.buf.slice_from(self.pos) }
175 fn consume(&mut self, amt: uint) { self.pos += amt; }
178 /// Writes to a fixed-size byte slice
180 /// If a write will not fit in the buffer, it raises the `io_error`
181 /// condition and does not write any data.
186 /// use std::io::BufWriter;
188 /// let mut buf = [0, ..4];
190 /// let mut w = BufWriter::new(buf);
191 /// w.write([0, 1, 2]);
193 /// assert_eq!(buf, [0, 1, 2, 0]);
195 pub struct BufWriter<'a> {
196 priv buf: &'a mut [u8],
200 impl<'a> BufWriter<'a> {
201 pub fn new<'a>(buf: &'a mut [u8]) -> BufWriter<'a> {
209 impl<'a> Writer for BufWriter<'a> {
210 fn write(&mut self, buf: &[u8]) {
211 // raises a condition if the entire write does not fit in the buffer
212 let max_size = self.buf.len();
213 if self.pos >= max_size || (self.pos + buf.len()) > max_size {
214 io_error::cond.raise(IoError {
216 desc: "Trying to write past end of buffer",
222 vec::bytes::copy_memory(self.buf.mut_slice_from(self.pos), buf);
223 self.pos += buf.len();
228 impl<'a> Seek for BufWriter<'a> {
229 fn tell(&self) -> u64 { self.pos as u64 }
231 fn seek(&mut self, pos: i64, style: SeekStyle) {
232 // compute offset as signed and clamp to prevent overflow
233 let offset = match style {
235 SeekEnd => { self.buf.len() }
236 SeekCur => { self.pos }
239 self.pos = max(0, offset+pos) as uint;
244 /// Reads from a fixed-size byte slice
249 /// use std::io::BufReader;
251 /// let mut buf = [0, 1, 2, 3];
252 /// let mut r = BufReader::new(buf);
254 /// assert_eq!(r.read_to_end(), ~[0, 1, 2, 3]);
256 pub struct BufReader<'a> {
261 impl<'a> BufReader<'a> {
262 /// Creates a new buffered reader which will read the specified buffer
263 pub fn new<'a>(buf: &'a [u8]) -> BufReader<'a> {
270 /// Tests whether this reader has read all bytes in its buffer.
272 /// If `true`, then this will no longer return bytes from `read`.
273 pub fn eof(&self) -> bool { self.pos == self.buf.len() }
276 impl<'a> Reader for BufReader<'a> {
277 fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
278 if self.eof() { return None }
280 let write_len = min(buf.len(), self.buf.len() - self.pos);
282 let input = self.buf.slice(self.pos, self.pos + write_len);
283 let output = buf.mut_slice(0, write_len);
284 assert_eq!(input.len(), output.len());
285 vec::bytes::copy_memory(output, input);
287 self.pos += write_len;
288 assert!(self.pos <= self.buf.len());
290 return Some(write_len);
294 impl<'a> Seek for BufReader<'a> {
295 fn tell(&self) -> u64 { self.pos as u64 }
297 fn seek(&mut self, _pos: i64, _style: SeekStyle) { fail!() }
300 impl<'a> Buffer for BufReader<'a> {
301 fn fill<'a>(&'a mut self) -> &'a [u8] { self.buf.slice_from(self.pos) }
302 fn consume(&mut self, amt: uint) { self.pos += amt; }
312 fn test_mem_writer() {
313 let mut writer = MemWriter::new();
314 assert_eq!(writer.tell(), 0);
316 assert_eq!(writer.tell(), 1);
317 writer.write([1, 2, 3]);
318 writer.write([4, 5, 6, 7]);
319 assert_eq!(writer.tell(), 8);
320 assert_eq!(writer.get_ref(), [0, 1, 2, 3, 4, 5, 6, 7]);
322 writer.seek(0, SeekSet);
323 assert_eq!(writer.tell(), 0);
324 writer.write([3, 4]);
325 assert_eq!(writer.get_ref(), [3, 4, 2, 3, 4, 5, 6, 7]);
327 writer.seek(1, SeekCur);
328 writer.write([0, 1]);
329 assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 7]);
331 writer.seek(-1, SeekEnd);
332 writer.write([1, 2]);
333 assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 1, 2]);
335 writer.seek(1, SeekEnd);
337 assert_eq!(writer.get_ref(), [3, 4, 2, 0, 1, 5, 6, 1, 2, 0, 1]);
341 fn test_buf_writer() {
342 let mut buf = [0 as u8, ..8];
344 let mut writer = BufWriter::new(buf);
345 assert_eq!(writer.tell(), 0);
347 assert_eq!(writer.tell(), 1);
348 writer.write([1, 2, 3]);
349 writer.write([4, 5, 6, 7]);
350 assert_eq!(writer.tell(), 8);
352 assert_eq!(buf, [0, 1, 2, 3, 4, 5, 6, 7]);
356 fn test_buf_writer_seek() {
357 let mut buf = [0 as u8, ..8];
359 let mut writer = BufWriter::new(buf);
360 assert_eq!(writer.tell(), 0);
362 assert_eq!(writer.tell(), 1);
364 writer.seek(2, SeekSet);
365 assert_eq!(writer.tell(), 2);
367 assert_eq!(writer.tell(), 3);
369 writer.seek(-2, SeekCur);
370 assert_eq!(writer.tell(), 1);
372 assert_eq!(writer.tell(), 2);
374 writer.seek(-1, SeekEnd);
375 assert_eq!(writer.tell(), 7);
377 assert_eq!(writer.tell(), 8);
380 assert_eq!(buf, [1, 3, 2, 0, 0, 0, 0, 4]);
384 fn test_buf_writer_error() {
385 let mut buf = [0 as u8, ..2];
386 let mut writer = BufWriter::new(buf);
389 let mut called = false;
390 io_error::cond.trap(|err| {
391 assert_eq!(err.kind, OtherIoError);
394 writer.write([0, 0]);
400 fn test_mem_reader() {
401 let mut reader = MemReader::new(~[0, 1, 2, 3, 4, 5, 6, 7]);
403 assert_eq!(reader.read(buf), Some(0));
404 assert_eq!(reader.tell(), 0);
406 assert_eq!(reader.read(buf), Some(1));
407 assert_eq!(reader.tell(), 1);
408 assert_eq!(buf, [0]);
409 let mut buf = [0, ..4];
410 assert_eq!(reader.read(buf), Some(4));
411 assert_eq!(reader.tell(), 5);
412 assert_eq!(buf, [1, 2, 3, 4]);
413 assert_eq!(reader.read(buf), Some(3));
414 assert_eq!(buf.slice(0, 3), [5, 6, 7]);
415 assert_eq!(reader.read(buf), None);
419 fn test_buf_reader() {
420 let in_buf = ~[0, 1, 2, 3, 4, 5, 6, 7];
421 let mut reader = BufReader::new(in_buf);
423 assert_eq!(reader.read(buf), Some(0));
424 assert_eq!(reader.tell(), 0);
426 assert_eq!(reader.read(buf), Some(1));
427 assert_eq!(reader.tell(), 1);
428 assert_eq!(buf, [0]);
429 let mut buf = [0, ..4];
430 assert_eq!(reader.read(buf), Some(4));
431 assert_eq!(reader.tell(), 5);
432 assert_eq!(buf, [1, 2, 3, 4]);
433 assert_eq!(reader.read(buf), Some(3));
434 assert_eq!(buf.slice(0, 3), [5, 6, 7]);
435 assert_eq!(reader.read(buf), None);
439 fn test_read_char() {
440 let mut r = BufReader::new(bytes!("Việt"));
441 assert_eq!(r.read_char(), Some('V'));
442 assert_eq!(r.read_char(), Some('i'));
443 assert_eq!(r.read_char(), Some('ệ'));
444 assert_eq!(r.read_char(), Some('t'));
445 assert_eq!(r.read_char(), None);
449 fn test_read_bad_char() {
450 let mut r = BufReader::new(bytes!(0x80));
451 assert_eq!(r.read_char(), None);
455 fn test_write_strings() {
456 let mut writer = MemWriter::new();
457 writer.write_str("testing");
458 writer.write_line("testing");
459 writer.write_str("testing");
460 let mut r = BufReader::new(writer.get_ref());
461 assert_eq!(r.read_to_str(), ~"testingtesting\ntesting");
465 fn test_write_char() {
466 let mut writer = MemWriter::new();
467 writer.write_char('a');
468 writer.write_char('\n');
469 writer.write_char('ệ');
470 let mut r = BufReader::new(writer.get_ref());
471 assert_eq!(r.read_to_str(), ~"a\nệ");
475 fn test_read_whole_string_bad() {
477 let mut r = BufReader::new(buf);
478 match result(|| r.read_to_str()) {