diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index ba13bd05dc5dc..36def48b88b32 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -13,6 +13,7 @@ //! Buffering wrappers for I/O traits use cmp; +use fmt; use io::{Reader, Writer, Stream, Buffer, DEFAULT_BUF_SIZE, IoResult}; use iter::{IteratorExt, ExactSizeIterator}; use ops::Drop; @@ -51,6 +52,13 @@ pub struct BufferedReader { cap: uint, } +impl fmt::Show for BufferedReader where R: fmt::Show { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + write!(fmt, "BufferedReader {{ reader: {:?}, buffer: {}/{} }}", + self.inner, self.cap - self.pos, self.buf.len()) + } +} + impl BufferedReader { /// Creates a new `BufferedReader` with the specified buffer capacity pub fn with_capacity(cap: uint, inner: R) -> BufferedReader { @@ -148,6 +156,13 @@ pub struct BufferedWriter { pos: uint } +impl fmt::Show for BufferedWriter where W: fmt::Show { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + write!(fmt, "BufferedWriter {{ writer: {:?}, buffer: {}/{} }}", + self.inner.as_ref().unwrap(), self.pos, self.buf.len()) + } +} + impl BufferedWriter { /// Creates a new `BufferedWriter` with the specified buffer capacity pub fn with_capacity(cap: uint, inner: W) -> BufferedWriter { @@ -235,6 +250,13 @@ pub struct LineBufferedWriter { inner: BufferedWriter, } +impl fmt::Show for LineBufferedWriter where W: fmt::Show { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + write!(fmt, "LineBufferedWriter {{ writer: {:?}, buffer: {}/{} }}", + self.inner.inner, self.inner.pos, self.inner.buf.len()) + } +} + impl LineBufferedWriter { /// Creates a new `LineBufferedWriter` pub fn new(inner: W) -> LineBufferedWriter { @@ -318,6 +340,17 @@ pub struct BufferedStream { inner: BufferedReader> } +impl fmt::Show for BufferedStream where S: fmt::Show { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + let reader = &self.inner; + let writer = &self.inner.inner.0; + write!(fmt, "BufferedStream {{ stream: {:?}, write_buffer: {}/{}, read_buffer: {}/{} }}", + writer.inner, + writer.pos, writer.buf.len(), + reader.cap - reader.pos, reader.buf.len()) + } +} + impl BufferedStream { /// Creates a new buffered stream with explicitly listed capacities for the /// reader/writer buffer. diff --git a/src/libstd/io/util.rs b/src/libstd/io/util.rs index 5a7219495f562..ac7fb3f9cdb4a 100644 --- a/src/libstd/io/util.rs +++ b/src/libstd/io/util.rs @@ -16,6 +16,7 @@ use io; use slice::bytes::MutableByteVector; /// Wraps a `Reader`, limiting the number of bytes that can be read from it. +#[derive(Show)] pub struct LimitReader { limit: uint, inner: R @@ -77,7 +78,7 @@ impl Buffer for LimitReader { } /// A `Writer` which ignores bytes written to it, like /dev/null. -#[derive(Copy)] +#[derive(Copy, Show)] pub struct NullWriter; impl Writer for NullWriter { @@ -86,7 +87,7 @@ impl Writer for NullWriter { } /// A `Reader` which returns an infinite stream of 0 bytes, like /dev/zero. -#[derive(Copy)] +#[derive(Copy, Show)] pub struct ZeroReader; impl Reader for ZeroReader { @@ -107,7 +108,7 @@ impl Buffer for ZeroReader { } /// A `Reader` which is always at EOF, like /dev/null. -#[derive(Copy)] +#[derive(Copy, Show)] pub struct NullReader; impl Reader for NullReader { @@ -128,18 +129,19 @@ impl Buffer for NullReader { /// /// The `Writer`s are delegated to in order. If any `Writer` returns an error, /// that error is returned immediately and remaining `Writer`s are not called. -pub struct MultiWriter { - writers: Vec> +#[derive(Show)] +pub struct MultiWriter { + writers: Vec } -impl MultiWriter { +impl MultiWriter where W: Writer { /// Creates a new `MultiWriter` - pub fn new(writers: Vec>) -> MultiWriter { + pub fn new(writers: Vec) -> MultiWriter { MultiWriter { writers: writers } } } -impl Writer for MultiWriter { +impl Writer for MultiWriter where W: Writer { #[inline] fn write(&mut self, buf: &[u8]) -> io::IoResult<()> { for writer in self.writers.iter_mut() { @@ -159,7 +161,7 @@ impl Writer for MultiWriter { /// A `Reader` which chains input from multiple `Reader`s, reading each to /// completion before moving onto the next. -#[derive(Clone)] +#[derive(Clone, Show)] pub struct ChainedReader { readers: I, cur_reader: Option, @@ -198,6 +200,7 @@ impl> Reader for ChainedReader { /// A `Reader` which forwards input from another `Reader`, passing it along to /// a `Writer` as well. Similar to the `tee(1)` command. +#[derive(Show)] pub struct TeeReader { reader: R, writer: W, @@ -239,7 +242,7 @@ pub fn copy(r: &mut R, w: &mut W) -> io::IoResult<()> { } /// An adaptor converting an `Iterator` to a `Reader`. -#[derive(Clone)] +#[derive(Clone, Show)] pub struct IterReader { iter: T, }