diff --git a/src/bytes.rs b/src/bytes.rs index 99022f0b382567127c17a7c49375beb654584f34..6a9c959352bbe3847fec01110429165127b7e623 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 3c51ac5e487081ce21c153b81dd1f6814c5c17c3..73345231e5d8cc798aab4fc03b221a6e08394bd5 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);