From e464a2d3084bdd52d484e71fd01d7d1ca1dda400 Mon Sep 17 00:00:00 2001 From: sinkuu Date: Thu, 17 Nov 2016 21:20:08 +0900 Subject: [PATCH 1/2] Override Write::write_fmt for Vec --- src/libstd/io/impls.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/libstd/io/impls.rs b/src/libstd/io/impls.rs index 6b26c016638a7..0f26e4359bf41 100644 --- a/src/libstd/io/impls.rs +++ b/src/libstd/io/impls.rs @@ -229,6 +229,23 @@ impl Write for Vec { Ok(()) } + #[inline] + fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> { + struct Adaptor<'a>(&'a mut Vec); + + impl<'a> fmt::Write for Adaptor<'a> { + #[inline] + fn write_str(&mut self, s: &str) -> fmt::Result { + self.0.extend_from_slice(s.as_bytes()); + Ok(()) + } + } + + let mut output = Adaptor(self); + fmt::write(&mut output, fmt) + .map_err(|_| Error::new(ErrorKind::Other, "formatter error")) + } + #[inline] fn flush(&mut self) -> io::Result<()> { Ok(()) } } From 856bc1f69b2b591092b53853ca06341ab05091d8 Mon Sep 17 00:00:00 2001 From: sinkuu Date: Fri, 18 Nov 2016 21:04:07 +0900 Subject: [PATCH 2/2] Override `Write::write_fmt` for `Sink` --- src/libstd/io/util.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/libstd/io/util.rs b/src/libstd/io/util.rs index 2c6880281b5e6..c74ab877994ef 100644 --- a/src/libstd/io/util.rs +++ b/src/libstd/io/util.rs @@ -10,7 +10,8 @@ #![allow(missing_copy_implementations)] -use io::{self, Read, Write, ErrorKind, BufRead}; +use io::{self, Read, Write, Error, ErrorKind, BufRead}; +use fmt; /// Copies the entire contents of a reader into a writer. /// @@ -161,8 +162,25 @@ pub fn sink() -> Sink { Sink { _priv: () } } #[stable(feature = "rust1", since = "1.0.0")] impl Write for Sink { + #[inline] fn write(&mut self, buf: &[u8]) -> io::Result { Ok(buf.len()) } + + #[inline] fn flush(&mut self) -> io::Result<()> { Ok(()) } + + #[inline] + fn write_fmt(&mut self, fmt: fmt::Arguments) -> io::Result<()> { + struct SinkAdapter; + impl fmt::Write for SinkAdapter { + fn write_str(&mut self, _: &str) -> fmt::Result { + Ok(()) + } + } + + let mut a = SinkAdapter; + fmt::write(&mut a, fmt) + .map_err(|_| Error::new(ErrorKind::Other, "formatter error")) + } } #[cfg(test)]