diff options
author | 2024-02-23 17:22:58 -0500 | |
---|---|---|
committer | 2024-02-23 14:22:58 -0800 | |
commit | 46289278f52a26c12298779f4aaebad1dcb26d35 (patch) | |
tree | 4fd74bbf04722291b05edb5ae9a21d169e60eaf5 /src | |
parent | 1bcd2129d195a0722d8b5b1a16c7d33698701f2e (diff) | |
download | bytes-46289278f52a26c12298779f4aaebad1dcb26d35.tar.gz bytes-46289278f52a26c12298779f4aaebad1dcb26d35.tar.zst bytes-46289278f52a26c12298779f4aaebad1dcb26d35.zip |
Refactor split_at/split_to (#663)
* set len a little more concisely
* inline set_end
* remove kind assertions
* remove a duplicate assertion
* remove redundant assertion and min
* rename set_start to advance_unchecked
Diffstat (limited to 'src')
-rw-r--r-- | src/bytes_mut.rs | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 9018896..220bdb0 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -317,8 +317,10 @@ impl BytesMut { ); unsafe { let mut other = self.shallow_clone(); - other.set_start(at); - self.set_end(at); + // SAFETY: We've checked that `at` <= `self.capacity()` above. + other.advance_unchecked(at); + self.cap = at; + self.len = cmp::min(self.len, at); other } } @@ -391,8 +393,11 @@ impl BytesMut { unsafe { let mut other = self.shallow_clone(); - other.set_end(at); - self.set_start(at); + // SAFETY: We've checked that `at` <= `self.len()` and we know that `self.len()` <= + // `self.capacity()`. + self.advance_unchecked(at); + other.cap = at; + other.len = at; other } } @@ -851,14 +856,19 @@ impl BytesMut { unsafe { slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len) } } - unsafe fn set_start(&mut self, start: usize) { + /// Advance the buffer without bounds checking. + /// + /// # SAFETY + /// + /// The caller must ensure that `count` <= `self.cap`. + unsafe fn advance_unchecked(&mut self, count: usize) { // Setting the start to 0 is a no-op, so return early if this is the // case. - if start == 0 { + if count == 0 { return; } - debug_assert!(start <= self.cap, "internal: set_start out of bounds"); + debug_assert!(count <= self.cap, "internal: set_start out of bounds"); let kind = self.kind(); @@ -867,7 +877,7 @@ impl BytesMut { // complicated. First, we have to track how far ahead the // "start" of the byte buffer from the beginning of the vec. We // also have to ensure that we don't exceed the maximum shift. - let pos = self.get_vec_pos() + start; + let pos = self.get_vec_pos() + count; if pos <= MAX_VEC_POS { self.set_vec_pos(pos); @@ -883,23 +893,9 @@ impl BytesMut { // Updating the start of the view is setting `ptr` to point to the // new start and updating the `len` field to reflect the new length // of the view. - self.ptr = vptr(self.ptr.as_ptr().add(start)); - - if self.len >= start { - self.len -= start; - } else { - self.len = 0; - } - - self.cap -= start; - } - - unsafe fn set_end(&mut self, end: usize) { - debug_assert_eq!(self.kind(), KIND_ARC); - assert!(end <= self.cap, "set_end out of bounds"); - - self.cap = end; - self.len = cmp::min(self.len, end); + self.ptr = vptr(self.ptr.as_ptr().add(count)); + self.len = self.len.checked_sub(count).unwrap_or(0); + self.cap -= count; } fn try_unsplit(&mut self, other: BytesMut) -> Result<(), BytesMut> { @@ -1069,7 +1065,9 @@ impl Buf for BytesMut { self.remaining(), ); unsafe { - self.set_start(cnt); + // SAFETY: We've checked that `cnt` <= `self.remaining()` and we know that + // `self.remaining()` <= `self.cap`. + self.advance_unchecked(cnt); } } |