diff options
| author | bors <bors@rust-lang.org> | 2014-10-30 06:32:11 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-10-30 06:32:11 +0000 |
| commit | 2d27bfaeb6522d386d0a2735cb3f75cc5707314a (patch) | |
| tree | 0b27f013ab6f65b62150aed544c1a98f561792c6 /src/libstd | |
| parent | d1fc2dec79689fe6bd37c95f3fe5b7acd476fff6 (diff) | |
| parent | 88a250d194d7a7995c0740d706d9eb19007a85ee (diff) | |
| download | rust-2d27bfaeb6522d386d0a2735cb3f75cc5707314a.tar.gz rust-2d27bfaeb6522d386d0a2735cb3f75cc5707314a.zip | |
auto merge of #17704 : nick29581/rust/object-safety, r=nikomatsakis
r? @nikomatsakis
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/io/extensions.rs | 2 | ||||
| -rw-r--r-- | src/libstd/io/mod.rs | 50 | ||||
| -rw-r--r-- | src/libstd/io/util.rs | 2 |
3 files changed, 38 insertions, 16 deletions
diff --git a/src/libstd/io/extensions.rs b/src/libstd/io/extensions.rs index a595921fcf7..078a9a014c9 100644 --- a/src/libstd/io/extensions.rs +++ b/src/libstd/io/extensions.rs @@ -172,7 +172,7 @@ pub fn u64_from_be_bytes(data: &[u8], start: uint, size: uint) -> u64 { mod test { use prelude::*; use io; - use io::{MemReader, MemWriter}; + use io::{MemReader, MemWriter, BytesReader}; struct InitialZeroByteReader { count: int, diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index 7826a6dd9c6..d22650107a3 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -712,17 +712,6 @@ pub trait Reader { }) } - /// Create an iterator that reads a single byte on - /// each iteration, until EOF. - /// - /// # Error - /// - /// Any error other than `EndOfFile` that is produced by the underlying Reader - /// is returned by the iterator and should be handled by the caller. - fn bytes<'r>(&'r mut self) -> extensions::Bytes<'r, Self> { - extensions::Bytes::new(self) - } - // Byte conversion helpers /// Reads `n` little-endian unsigned integer bytes. @@ -932,16 +921,41 @@ pub trait Reader { fn read_i8(&mut self) -> IoResult<i8> { self.read_byte().map(|i| i as i8) } +} +/// A reader which can be converted to a RefReader. +pub trait AsRefReader { /// Creates a wrapper around a mutable reference to the reader. /// /// This is useful to allow applying adaptors while still /// retaining ownership of the original value. - fn by_ref<'a>(&'a mut self) -> RefReader<'a, Self> { + fn by_ref<'a>(&'a mut self) -> RefReader<'a, Self>; +} + +impl<T: Reader> AsRefReader for T { + fn by_ref<'a>(&'a mut self) -> RefReader<'a, T> { RefReader { inner: self } } } +/// A reader which can be converted to bytes. +pub trait BytesReader { + /// Create an iterator that reads a single byte on + /// each iteration, until EOF. + /// + /// # Error + /// + /// Any error other than `EndOfFile` that is produced by the underlying Reader + /// is returned by the iterator and should be handled by the caller. + fn bytes<'r>(&'r mut self) -> extensions::Bytes<'r, Self>; +} + +impl<T: Reader> BytesReader for T { + fn bytes<'r>(&'r mut self) -> extensions::Bytes<'r, T> { + extensions::Bytes::new(self) + } +} + impl<'a> Reader for Box<Reader+'a> { fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> { let reader: &mut Reader = &mut **self; @@ -986,6 +1000,7 @@ unsafe fn slice_vec_capacity<'a, T>(v: &'a mut Vec<T>, start: uint, end: uint) - /// # fn process_input<R: Reader>(r: R) {} /// # fn foo() { /// use std::io; +/// use std::io::AsRefReader; /// use std::io::util::LimitReader; /// /// let mut stream = io::stdin(); @@ -1268,13 +1283,20 @@ pub trait Writer { fn write_i8(&mut self, n: i8) -> IoResult<()> { self.write([n as u8]) } +} +/// A writer which can be converted to a RefWriter. +pub trait AsRefWriter { /// Creates a wrapper around a mutable reference to the writer. /// /// This is useful to allow applying wrappers while still /// retaining ownership of the original value. #[inline] - fn by_ref<'a>(&'a mut self) -> RefWriter<'a, Self> { + fn by_ref<'a>(&'a mut self) -> RefWriter<'a, Self>; +} + +impl<T: Writer> AsRefWriter for T { + fn by_ref<'a>(&'a mut self) -> RefWriter<'a, T> { RefWriter { inner: self } } } @@ -1309,7 +1331,7 @@ impl<'a> Writer for &'a mut Writer+'a { /// # fn process_input<R: Reader>(r: R) {} /// # fn foo () { /// use std::io::util::TeeReader; -/// use std::io::{stdin, MemWriter}; +/// use std::io::{stdin, MemWriter, AsRefWriter}; /// /// let mut output = MemWriter::new(); /// diff --git a/src/libstd/io/util.rs b/src/libstd/io/util.rs index 820ae931f32..5694565b4ea 100644 --- a/src/libstd/io/util.rs +++ b/src/libstd/io/util.rs @@ -265,7 +265,7 @@ impl<T: Iterator<u8>> Reader for IterReader<T> { #[cfg(test)] mod test { - use io::{MemReader, MemWriter, BufReader}; + use io::{MemReader, MemWriter, BufReader, AsRefReader}; use io; use boxed::Box; use super::*; |
