about summary refs log tree commit diff
path: root/src/libstd/io_util.rs
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2013-01-10 20:09:26 -0800
committerTim Chevalier <chevalier@alum.wellesley.edu>2013-01-10 20:10:10 -0800
commit0274292bed1c1a109cc46d49e4ac685d10b43bb3 (patch)
treeb5955776099d609929dd23e5abb0d01229a2a803 /src/libstd/io_util.rs
parent3e7da96fd22faf8587c1717e03a988dce6893bdb (diff)
downloadrust-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.rs61
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() )
+    }
+}