From 5dbcc98f67d772d5a633941dbad5b86a858e0221 Mon Sep 17 00:00:00 2001 From: Martin Habovstiak Date: Sun, 24 Jul 2022 12:05:03 +0200 Subject: [PATCH 1/4] Override `read_exact` and `write_all` Some types override these methods to provide optimizations. Using default implementations would bypass those overrides and lead to worse performance. Overriding the methods to delegate implementations directly solves the problem. --- src/lib.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index a4f2a54..d94f73f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1051,6 +1051,10 @@ where for_both!(*self, ref mut inner => inner.read(buf)) } + fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> { + for_both!(*self, ref mut inner => inner.read_exact(buf)) + } + fn read_to_end(&mut self, buf: &mut std::vec::Vec) -> io::Result { for_both!(*self, ref mut inner => inner.read_to_end(buf)) } @@ -1099,6 +1103,10 @@ where for_both!(*self, ref mut inner => inner.write(buf)) } + fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { + for_both!(*self, ref mut inner => inner.write_all(buf)) + } + fn flush(&mut self) -> io::Result<()> { for_both!(*self, ref mut inner => inner.flush()) } From dc62774ff5da9e3ef3ae46799ea80ed081ef8d7e Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Tue, 26 Jul 2022 15:16:16 -0700 Subject: [PATCH 2/4] Override `Read::read_to_string` --- src/lib.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index d94f73f..ab89d90 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1058,6 +1058,10 @@ where fn read_to_end(&mut self, buf: &mut std::vec::Vec) -> io::Result { for_both!(*self, ref mut inner => inner.read_to_end(buf)) } + + fn read_to_string(&mut self, buf: &mut std::string::String) -> io::Result { + for_both!(*self, ref mut inner => inner.read_to_string(buf)) + } } #[cfg(any(test, feature = "use_std"))] From b086bed4a3aa4fa3894c1996c69923935246213d Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Tue, 26 Jul 2022 15:16:46 -0700 Subject: [PATCH 3/4] Override `BufRead::read_until` and `read_line` --- src/lib.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index ab89d90..8870f2b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1092,6 +1092,14 @@ where fn consume(&mut self, amt: usize) { for_both!(*self, ref mut inner => inner.consume(amt)) } + + fn read_until(&mut self, byte: u8, buf: &mut std::vec::Vec) -> io::Result { + for_both!(*self, ref mut inner => inner.read_until(byte, buf)) + } + + fn read_line(&mut self, buf: &mut std::string::String) -> io::Result { + for_both!(*self, ref mut inner => inner.read_line(buf)) + } } #[cfg(any(test, feature = "use_std"))] From 1204a49476c7791dbf4ef35d31c97ba7c3399301 Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Tue, 26 Jul 2022 15:17:11 -0700 Subject: [PATCH 4/4] Override `Write::write_fmt` --- src/lib.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 8870f2b..e109c2d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1119,6 +1119,10 @@ where for_both!(*self, ref mut inner => inner.write_all(buf)) } + fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> io::Result<()> { + for_both!(*self, ref mut inner => inner.write_fmt(fmt)) + } + fn flush(&mut self) -> io::Result<()> { for_both!(*self, ref mut inner => inner.flush()) }