mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-22 00:00:15 +02:00
Resize refactor (#696)
* use checked_sub * return when additional == 0 * move safe operation out of unsafe block * use spare_capacity_mut instead of chunk_mut We don't need to check capacity because it's already been reserved above. * Add safety comments * refactor to use guard clauses This would be better written with let-else, but we won't get that until `MSRV >= 1.65.x`. * use if-let instead of unwrap * reduce scope of unsafe blocks Co-authored-by: Alice Ryhl <[email protected]> --------- Co-authored-by: Alice Ryhl <[email protected]>
This commit is contained in:
co-authored by
Alice Ryhl
parent
4e2c9c065a
commit
9d3ec1cffb
+17
-9
@@ -468,18 +468,26 @@ impl BytesMut {
|
|||||||
/// assert_eq!(&buf[..], &[0x1, 0x1, 0x3, 0x3]);
|
/// assert_eq!(&buf[..], &[0x1, 0x1, 0x3, 0x3]);
|
||||||
/// ```
|
/// ```
|
||||||
pub fn resize(&mut self, new_len: usize, value: u8) {
|
pub fn resize(&mut self, new_len: usize, value: u8) {
|
||||||
let len = self.len();
|
let additional = if let Some(additional) = new_len.checked_sub(self.len()) {
|
||||||
if new_len > len {
|
additional
|
||||||
let additional = new_len - len;
|
|
||||||
self.reserve(additional);
|
|
||||||
unsafe {
|
|
||||||
let dst = self.chunk_mut().as_mut_ptr();
|
|
||||||
ptr::write_bytes(dst, value, additional);
|
|
||||||
self.set_len(new_len);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
self.truncate(new_len);
|
self.truncate(new_len);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
if additional == 0 {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.reserve(additional);
|
||||||
|
let dst = self.spare_capacity_mut().as_mut_ptr();
|
||||||
|
// SAFETY: `spare_capacity_mut` returns a valid, properly aligned pointer and we've
|
||||||
|
// reserved enough space to write `additional` bytes.
|
||||||
|
unsafe { ptr::write_bytes(dst, value, additional) };
|
||||||
|
|
||||||
|
// SAFETY: There are at least `new_len` initialized bytes in the buffer so no
|
||||||
|
// uninitialized bytes are being exposed.
|
||||||
|
unsafe { self.set_len(new_len) };
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the length of the buffer.
|
/// Sets the length of the buffer.
|
||||||
|
|||||||
Reference in New Issue
Block a user