From 27356969711d297e50bc9b68aa494a3592616c9a Mon Sep 17 00:00:00 2001 From: rich-murphey Date: Sat, 6 Feb 2021 22:13:05 -0600 Subject: [PATCH 1/7] implement the Write trait for BytesMut --- src/bytes_mut.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 61c0460ca..51261baf8 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -1191,6 +1191,37 @@ impl<'a> FromIterator<&'a u8> for BytesMut { } } +/// Write is implemented for `BytesMut` by extending the buffer. +/// The buffer will grow as needed. +impl std::io::Write for BytesMut { + #[inline] + fn write(&mut self, buf: &[u8]) -> std::io::Result { + self.extend_from_slice(buf); + Ok(buf.len()) + } + + #[inline] + fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result { + let len = bufs.iter().map(|b| b.len()).sum(); + self.reserve(len); + for buf in bufs { + self.extend_from_slice(buf); + } + Ok(len) + } + #[inline] + fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> { + self.extend_from_slice(buf); + Ok(()) + } + + #[inline] + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } +} + + /* * * ===== Inner ===== From cf0a7200f7fa497f2082d5e895a962ae2368fd48 Mon Sep 17 00:00:00 2001 From: rich-murphey Date: Sat, 6 Feb 2021 22:18:27 -0600 Subject: [PATCH 2/7] fix fustfmt --- src/bytes_mut.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 51261baf8..adb2167bc 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -1221,7 +1221,6 @@ impl std::io::Write for BytesMut { } } - /* * * ===== Inner ===== From d62bf13bd2ca0995896ac961240e6b7e652848ad Mon Sep 17 00:00:00 2001 From: rich-murphey Date: Sat, 6 Feb 2021 22:21:24 -0600 Subject: [PATCH 3/7] implement Write only for std --- src/bytes_mut.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index adb2167bc..2d1be984f 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -1193,6 +1193,7 @@ impl<'a> FromIterator<&'a u8> for BytesMut { /// Write is implemented for `BytesMut` by extending the buffer. /// The buffer will grow as needed. +#[cfg(feature = "std")] impl std::io::Write for BytesMut { #[inline] fn write(&mut self, buf: &[u8]) -> std::io::Result { From eacadae6ea5949b9a866562979aa21b1976f0fcd Mon Sep 17 00:00:00 2001 From: rich-murphey Date: Tue, 9 Feb 2021 04:19:30 -0600 Subject: [PATCH 4/7] move impl io:Write to BytesMutExt trait. add tests. --- src/bytes_mut.rs | 31 ----------------------- src/lib.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++++ tests/test_buf.rs | 31 +++++++++++++++++++++++ 3 files changed, 94 insertions(+), 31 deletions(-) diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 2d1be984f..61c0460ca 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -1191,37 +1191,6 @@ impl<'a> FromIterator<&'a u8> for BytesMut { } } -/// Write is implemented for `BytesMut` by extending the buffer. -/// The buffer will grow as needed. -#[cfg(feature = "std")] -impl std::io::Write for BytesMut { - #[inline] - fn write(&mut self, buf: &[u8]) -> std::io::Result { - self.extend_from_slice(buf); - Ok(buf.len()) - } - - #[inline] - fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result { - let len = bufs.iter().map(|b| b.len()).sum(); - self.reserve(len); - for buf in bufs { - self.extend_from_slice(buf); - } - Ok(len) - } - #[inline] - fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> { - self.extend_from_slice(buf); - Ok(()) - } - - #[inline] - fn flush(&mut self) -> std::io::Result<()> { - Ok(()) - } -} - /* * * ===== Inner ===== diff --git a/src/lib.rs b/src/lib.rs index dd8cc9661..5040475b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -115,3 +115,66 @@ fn abort() -> ! { panic!("abort"); } } + +/// extension traits +pub mod ext { + /// extension trait for BytesMut + pub trait BytesMutExt { + /// extension trait for BytesMut + fn write(&mut self, buf: &[u8]) -> std::io::Result; + /// extension trait for BytesMut + fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result; + /// extension trait for BytesMut + fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()>; + /// extension trait for BytesMut + fn flush(&mut self) -> std::io::Result<()>; + } + impl BytesMutExt for super::BytesMut { + #[inline] + fn write(&mut self, buf: &[u8]) -> std::io::Result { + self.extend_from_slice(buf); + Ok(buf.len()) + } + + #[inline] + fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result { + let len = bufs.iter().map(|b| b.len()).sum(); + self.reserve(len); + for buf in bufs { + self.extend_from_slice(buf); + } + Ok(len) + } + #[inline] + fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> { + self.extend_from_slice(buf); + Ok(()) + } + + #[inline] + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } + } + + impl std::io::Write for dyn BytesMutExt { + #[inline] + fn write(&mut self, buf: &[u8]) -> std::io::Result { + self.write(buf) + } + + #[inline] + fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result { + self.write_vectored(bufs) + } + #[inline] + fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> { + self.write_all(buf) + } + + #[inline] + fn flush(&mut self) -> std::io::Result<()> { + self.flush() + } + } +} diff --git a/tests/test_buf.rs b/tests/test_buf.rs index fbad003a4..c78c48e9e 100644 --- a/tests/test_buf.rs +++ b/tests/test_buf.rs @@ -118,3 +118,34 @@ fn copy_to_bytes_overflow() { let _bytes = buf.copy_to_bytes(12); } + +#[test] +fn fmt_write_bytesmut_test() { + use std::fmt::Write; + use bytes::BytesMut; + let mut buf = BytesMut::with_capacity(64); + write!(&mut buf, "hello").ok(); + assert_eq!(&buf[..], b"hello"); +} + +#[test] +fn io_write_bytesmut_test() { + use std::io::Write; + use bytes::BytesMut; + use bytes::ext::BytesMutExt; + let mut buf = BytesMut::with_capacity(64); + write!(&mut buf as &mut dyn BytesMutExt, "hello").ok(); + assert_eq!(&buf[..], b"hello"); +} + +#[test] +fn fmt_write_bytesmut_with_both_write_in_scope_test() { + #[allow(unused_imports)] + use std::fmt::Write as FmtWrite; + use std::io::Write as IoWrite; + use bytes::BytesMut; + use bytes::ext::BytesMutExt; + let mut buf = BytesMut::with_capacity(64); + write!(&mut buf as &mut dyn BytesMutExt, "hello").ok(); + assert_eq!(&buf[..], b"hello"); +} From cc5ac8926987208cef02fbb30ddf94f447e34add Mon Sep 17 00:00:00 2001 From: rich-murphey Date: Tue, 9 Feb 2021 04:20:22 -0600 Subject: [PATCH 5/7] fmt --- tests/test_buf.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_buf.rs b/tests/test_buf.rs index c78c48e9e..5a433a18b 100644 --- a/tests/test_buf.rs +++ b/tests/test_buf.rs @@ -121,8 +121,8 @@ fn copy_to_bytes_overflow() { #[test] fn fmt_write_bytesmut_test() { - use std::fmt::Write; use bytes::BytesMut; + use std::fmt::Write; let mut buf = BytesMut::with_capacity(64); write!(&mut buf, "hello").ok(); assert_eq!(&buf[..], b"hello"); @@ -130,9 +130,9 @@ fn fmt_write_bytesmut_test() { #[test] fn io_write_bytesmut_test() { - use std::io::Write; - use bytes::BytesMut; use bytes::ext::BytesMutExt; + use bytes::BytesMut; + use std::io::Write; let mut buf = BytesMut::with_capacity(64); write!(&mut buf as &mut dyn BytesMutExt, "hello").ok(); assert_eq!(&buf[..], b"hello"); @@ -140,11 +140,11 @@ fn io_write_bytesmut_test() { #[test] fn fmt_write_bytesmut_with_both_write_in_scope_test() { + use bytes::ext::BytesMutExt; + use bytes::BytesMut; #[allow(unused_imports)] use std::fmt::Write as FmtWrite; use std::io::Write as IoWrite; - use bytes::BytesMut; - use bytes::ext::BytesMutExt; let mut buf = BytesMut::with_capacity(64); write!(&mut buf as &mut dyn BytesMutExt, "hello").ok(); assert_eq!(&buf[..], b"hello"); From 2a0b8ae0e9a23778cedf5b43ab5083b0b6742a68 Mon Sep 17 00:00:00 2001 From: rich-murphey Date: Tue, 9 Feb 2021 04:29:13 -0600 Subject: [PATCH 6/7] ipml io::Write only for std --- src/lib.rs | 2 ++ tests/test_buf.rs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 5040475b3..c9b5e1e6b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -116,7 +116,9 @@ fn abort() -> ! { } } + /// extension traits +#[cfg(feature = "std")] pub mod ext { /// extension trait for BytesMut pub trait BytesMutExt { diff --git a/tests/test_buf.rs b/tests/test_buf.rs index 5a433a18b..627484d1f 100644 --- a/tests/test_buf.rs +++ b/tests/test_buf.rs @@ -119,6 +119,7 @@ fn copy_to_bytes_overflow() { let _bytes = buf.copy_to_bytes(12); } +#[cfg(feature = "std")] #[test] fn fmt_write_bytesmut_test() { use bytes::BytesMut; @@ -128,6 +129,7 @@ fn fmt_write_bytesmut_test() { assert_eq!(&buf[..], b"hello"); } +#[cfg(feature = "std")] #[test] fn io_write_bytesmut_test() { use bytes::ext::BytesMutExt; @@ -138,6 +140,7 @@ fn io_write_bytesmut_test() { assert_eq!(&buf[..], b"hello"); } +#[cfg(feature = "std")] #[test] fn fmt_write_bytesmut_with_both_write_in_scope_test() { use bytes::ext::BytesMutExt; From 8fee5d35ca7c397f097b9aa09a1575f803b0481f Mon Sep 17 00:00:00 2001 From: rich-murphey Date: Tue, 9 Feb 2021 04:33:49 -0600 Subject: [PATCH 7/7] fmt --- src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index c9b5e1e6b..173c13c89 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -116,7 +116,6 @@ fn abort() -> ! { } } - /// extension traits #[cfg(feature = "std")] pub mod ext {