From ae9991f3ba4f08d9c3d57b240a3c018082a38012 Mon Sep 17 00:00:00 2001 From: Douman <douman@gmx.se> Date: Fri, 16 Aug 2019 08:50:24 +0200 Subject: [PATCH] Make From only for static slices to Bytes --- src/bytes.rs | 23 ++++++++++++++--------- tests/test_bytes.rs | 4 ++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/bytes.rs b/src/bytes.rs index 99022f0..6a9c959 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -499,6 +499,11 @@ impl Bytes { self.inner.is_inline() } + ///Creates `Bytes` instance from slice, by copying it. + pub fn copy_from_slice(data: &[u8]) -> Self { + BytesMut::from(data).freeze() + } + /// Returns a slice of self for the provided range. /// /// This will increment the reference count for the underlying memory and @@ -542,7 +547,7 @@ impl Bytes { assert!(end <= len); if end - begin <= INLINE_CAP { - return Bytes::from(&self[begin..end]); + return Bytes::copy_from_slice(&self[begin..end]); } let mut ret = self.clone(); @@ -729,7 +734,7 @@ impl Bytes { /// ``` /// use bytes::Bytes; /// - /// let a = Bytes::from(&b"Mary had a little lamb, little lamb, little lamb..."[..]); + /// let a = Bytes::copy_from_slice(&b"Mary had a little lamb, little lamb, little lamb..."[..]); /// /// // Create a shallow clone /// let b = a.clone(); @@ -759,7 +764,7 @@ impl Bytes { /// Clones the data if it is not already owned. pub fn to_mut(&mut self) -> &mut BytesMut { if !self.inner.is_mut_safe() { - let new = Bytes::from(&self[..]); + let new = Self::copy_from_slice(&self[..]); *self = new; } unsafe { &mut *(self as *mut Bytes as *mut BytesMut) } @@ -922,15 +927,15 @@ impl From<String> for Bytes { } } -impl<'a> From<&'a [u8]> for Bytes { - fn from(src: &'a [u8]) -> Bytes { - BytesMut::from(src).freeze() +impl From<&'static [u8]> for Bytes { + fn from(src: &'static [u8]) -> Bytes { + Bytes::from_static(src) } } -impl<'a> From<&'a str> for Bytes { - fn from(src: &'a str) -> Bytes { - BytesMut::from(src).freeze() +impl From<&'static str> for Bytes { + fn from(src: &'static str) -> Bytes { + Bytes::from_static(src.as_bytes()) } } diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index 3c51ac5..7334523 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -528,7 +528,7 @@ fn stress() { for i in 0..ITERS { let data = [i as u8; 256]; - let buf = Arc::new(Bytes::from(&data[..])); + let buf = Arc::new(Bytes::copy_from_slice(&data[..])); let barrier = Arc::new(Barrier::new(THREADS)); let mut joins = Vec::with_capacity(THREADS); @@ -888,7 +888,7 @@ fn slice_ref_catches_not_an_empty_subset() { #[test] #[should_panic] fn empty_slice_ref_catches_not_an_empty_subset() { - let bytes = Bytes::from(&b""[..]); + let bytes = Bytes::copy_from_slice(&b""[..]); let slice = &b""[0..0]; bytes.slice_ref(slice); -- GitLab