aboutsummaryrefslogtreecommitdiff
path: root/src/bytes_mut.rs
diff options
context:
space:
mode:
authorGravatar Stepan Koltsov <stepan.koltsov@gmail.com> 2021-08-08 18:43:53 +0100
committerGravatar GitHub <noreply@github.com> 2021-08-09 02:43:53 +0900
commit2697fa7a9dd871d8d64d1959b7ac46227b7b23b4 (patch)
treec588b368a944cc77af3781c4b711b344501205d6 /src/bytes_mut.rs
parentfa9cbf1258cea7812d4009639ed8700b987d8d4e (diff)
downloadbytes-2697fa7a9dd871d8d64d1959b7ac46227b7b23b4.tar.gz
bytes-2697fa7a9dd871d8d64d1959b7ac46227b7b23b4.tar.zst
bytes-2697fa7a9dd871d8d64d1959b7ac46227b7b23b4.zip
BufMut::put_bytes(self, val, cnt) (#487)
Equivalent to ``` for _ in 0..cnt { self.put_u8(val); } ``` but may work faster. Name and signature is chosen to be consistent with `ptr::write_bytes`. Include three specializations: * `Vec<u8>` * `&mut [u8]` * `BytesMut` `BytesMut` and `&mut [u8]` specializations use `ptr::write`, `Vec<u8>` specialization uses `Vec::resize`.
Diffstat (limited to 'src/bytes_mut.rs')
-rw-r--r--src/bytes_mut.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs
index 8e42079..b754ed1 100644
--- a/src/bytes_mut.rs
+++ b/src/bytes_mut.rs
@@ -1010,6 +1010,19 @@ unsafe impl BufMut for BytesMut {
fn put_slice(&mut self, src: &[u8]) {
self.extend_from_slice(src);
}
+
+ fn put_bytes(&mut self, val: u8, cnt: usize) {
+ self.reserve(cnt);
+ unsafe {
+ let dst = self.uninit_slice();
+ // Reserved above
+ debug_assert!(dst.len() >= cnt);
+
+ ptr::write_bytes(dst.as_mut_ptr(), val, cnt);
+
+ self.advance_mut(cnt);
+ }
+ }
}
impl AsRef<[u8]> for BytesMut {