diff options
author | 2021-08-08 18:43:53 +0100 | |
---|---|---|
committer | 2021-08-09 02:43:53 +0900 | |
commit | 2697fa7a9dd871d8d64d1959b7ac46227b7b23b4 (patch) | |
tree | c588b368a944cc77af3781c4b711b344501205d6 /src/bytes_mut.rs | |
parent | fa9cbf1258cea7812d4009639ed8700b987d8d4e (diff) | |
download | bytes-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.rs | 13 |
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 { |