diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2013-01-10 20:09:26 -0800 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2013-01-10 20:10:10 -0800 |
| commit | 0274292bed1c1a109cc46d49e4ac685d10b43bb3 (patch) | |
| tree | b5955776099d609929dd23e5abb0d01229a2a803 /src/libstd/io_util.rs | |
| parent | 3e7da96fd22faf8587c1717e03a988dce6893bdb (diff) | |
| download | rust-0274292bed1c1a109cc46d49e4ac685d10b43bb3.tar.gz rust-0274292bed1c1a109cc46d49e4ac685d10b43bb3.zip | |
std: Address XXXes in flatpipes
Diffstat (limited to 'src/libstd/io_util.rs')
| -rw-r--r-- | src/libstd/io_util.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/libstd/io_util.rs b/src/libstd/io_util.rs new file mode 100644 index 00000000000..fb410c19a76 --- /dev/null +++ b/src/libstd/io_util.rs @@ -0,0 +1,61 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use core::io::{Reader, BytesReader}; +use core::io; +use core::prelude::*; + +pub struct BufReader { + buf: ~[u8], + mut pos: uint +} + +pub impl BufReader { + static pub fn new(v: ~[u8]) -> BufReader { + BufReader { + buf: move v, + pos: 0 + } + } + + priv fn as_bytes_reader<A>(f: &fn(&BytesReader) -> A) -> A { + // Recreating the BytesReader state every call since + // I can't get the borrowing to work correctly + let bytes_reader = BytesReader { + bytes: ::core::util::id::<&[u8]>(self.buf), + pos: self.pos + }; + + let res = f(&bytes_reader); + + // FIXME #4429: This isn't correct if f fails + self.pos = bytes_reader.pos; + + return move res; + } +} + +impl BufReader: Reader { + fn read(&self, bytes: &[mut u8], len: uint) -> uint { + self.as_bytes_reader(|r| r.read(bytes, len) ) + } + fn read_byte(&self) -> int { + self.as_bytes_reader(|r| r.read_byte() ) + } + fn eof(&self) -> bool { + self.as_bytes_reader(|r| r.eof() ) + } + fn seek(&self, offset: int, whence: io::SeekStyle) { + self.as_bytes_reader(|r| r.seek(offset, whence) ) + } + fn tell(&self) -> uint { + self.as_bytes_reader(|r| r.tell() ) + } +} |
