aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Brad Dunbar <dunbarb2@gmail.com> 2024-02-23 17:22:58 -0500
committerGravatar GitHub <noreply@github.com> 2024-02-23 14:22:58 -0800
commit46289278f52a26c12298779f4aaebad1dcb26d35 (patch)
tree4fd74bbf04722291b05edb5ae9a21d169e60eaf5 /src
parent1bcd2129d195a0722d8b5b1a16c7d33698701f2e (diff)
downloadbytes-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.rs50
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);
}
}