diff --git a/src/bytes.rs b/src/bytes.rs index 67661c6c3e680acbbbdf82c35628a7c5dba5fcd6..4fc1a4980ffa731f727eb9198d745cba7939a5df 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -549,6 +549,14 @@ impl Bytes { /// /// Panics if `at > len` pub fn split_off(&mut self, at: usize) -> Bytes { + if at == self.len() { + return Bytes::new(); + } + + if at == 0 { + return mem::replace(self, Bytes::new()); + } + Bytes { inner: Inner2 { inner: self.inner.split_off(at), @@ -580,6 +588,14 @@ impl Bytes { /// /// Panics if `at > len` pub fn split_to(&mut self, at: usize) -> Bytes { + if at == self.len() { + return mem::replace(self, Bytes::new()); + } + + if at == 0 { + return Bytes::new(); + } + Bytes { inner: Inner2 { inner: self.inner.split_to(at), diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index 5c2c91d49fb26e5acd47b5e40162310f08b3f6f1..ae50d8617cd8fd8844f00f099d775a29dba90778 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -134,6 +134,50 @@ fn split_off_uninitialized() { assert_eq!(other.capacity(), 896); } +#[test] +fn split_off_to_loop() { + let s = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + for i in 0..(s.len() + 1) { + { + let mut bytes = Bytes::from(&s[..]); + let off = bytes.split_off(i); + assert_eq!(i, bytes.len()); + let mut sum = Vec::new(); + sum.extend(&bytes); + sum.extend(&off); + assert_eq!(&s[..], &sum[..]); + } + { + let mut bytes = BytesMut::from(&s[..]); + let off = bytes.split_off(i); + assert_eq!(i, bytes.len()); + let mut sum = Vec::new(); + sum.extend(&bytes); + sum.extend(&off); + assert_eq!(&s[..], &sum[..]); + } + { + let mut bytes = Bytes::from(&s[..]); + let off = bytes.split_to(i); + assert_eq!(i, off.len()); + let mut sum = Vec::new(); + sum.extend(&off); + sum.extend(&bytes); + assert_eq!(&s[..], &sum[..]); + } + { + let mut bytes = BytesMut::from(&s[..]); + let off = bytes.split_to(i); + assert_eq!(i, off.len()); + let mut sum = Vec::new(); + sum.extend(&off); + sum.extend(&bytes); + assert_eq!(&s[..], &sum[..]); + } + } +} + #[test] fn split_to_1() { // Inline