about summary refs log tree commit diff
path: root/src/libstd/io
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2014-02-15 13:51:37 -0800
committerSteven Fackler <sfackler@gmail.com>2014-02-15 14:22:56 -0800
commit23fdbcf7dddca3aae0ab02ee205344659f33abcb (patch)
treef407ce7495e666fe33fb62b0f0d44a4aeca7f7d7 /src/libstd/io
parenta7aa4c477e7ccc51f19805c42b74cf22dfe22c39 (diff)
downloadrust-23fdbcf7dddca3aae0ab02ee205344659f33abcb.tar.gz
rust-23fdbcf7dddca3aae0ab02ee205344659f33abcb.zip
Add a method to LimitReader to return the limit
This is useful in contexts like this:

let size = rdr.read_be_i32() as uint;
let mut limit = LimitReader::new(rdr.by_ref(), size);
let thing = read_a_thing(&mut limit);
assert!(limit.limit() == 0);
Diffstat (limited to 'src/libstd/io')
-rw-r--r--src/libstd/io/util.rs26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/libstd/io/util.rs b/src/libstd/io/util.rs
index 2e12fc0b9f2..79ae9faf629 100644
--- a/src/libstd/io/util.rs
+++ b/src/libstd/io/util.rs
@@ -24,7 +24,18 @@ impl<R: Reader> LimitReader<R> {
     pub fn new(r: R, limit: uint) -> LimitReader<R> {
         LimitReader { limit: limit, inner: r }
     }
+
+    /// Consumes the `LimitReader`, returning the underlying `Reader`.
     pub fn unwrap(self) -> R { self.inner }
+
+    /// Returns the number of bytes that can be read before the `LimitReader`
+    /// will return EOF.
+    ///
+    /// # Note
+    ///
+    /// The reader may reach EOF after reading fewer bytes than indicated by
+    /// this method if the underlying reader reaches EOF.
+    pub fn limit(&self) -> uint { self.limit }
 }
 
 impl<R: Reader> Reader for LimitReader<R> {
@@ -190,7 +201,7 @@ mod test {
     use prelude::*;
 
     #[test]
-    fn test_bounded_reader_unlimited() {
+    fn test_limit_reader_unlimited() {
         let mut r = MemReader::new(~[0, 1, 2]);
         {
             let mut r = LimitReader::new(r.by_ref(), 4);
@@ -199,7 +210,7 @@ mod test {
     }
 
     #[test]
-    fn test_bound_reader_limited() {
+    fn test_limit_reader_limited() {
         let mut r = MemReader::new(~[0, 1, 2]);
         {
             let mut r = LimitReader::new(r.by_ref(), 2);
@@ -209,6 +220,17 @@ mod test {
     }
 
     #[test]
+    fn test_limit_reader_limit() {
+        let r = MemReader::new(~[0, 1, 2]);
+        let mut r = LimitReader::new(r, 3);
+        assert_eq!(3, r.limit());
+        assert_eq!(0, r.read_byte().unwrap());
+        assert_eq!(2, r.limit());
+        assert_eq!(~[1, 2], r.read_to_end().unwrap());
+        assert_eq!(0, r.limit());
+    }
+
+    #[test]
     fn test_null_writer() {
         let mut s = NullWriter;
         let buf = ~[0, 0, 0];