mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-07 00:00:13 +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]);
|
||||
/// ```
|
||||
pub fn resize(&mut self, new_len: usize, value: u8) {
|
||||
let len = self.len();
|
||||
if new_len > len {
|
||||
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);
|
||||
}
|
||||
let additional = if let Some(additional) = new_len.checked_sub(self.len()) {
|
||||
additional
|
||||
} else {
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user