aboutsummaryrefslogtreecommitdiff
path: root/src/varint.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/varint.rs')
-rw-r--r--src/varint.rs16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/varint.rs b/src/varint.rs
index 1f1cb1c..8e542bc 100644
--- a/src/varint.rs
+++ b/src/varint.rs
@@ -1,17 +1,21 @@
+use std::mem::MaybeUninit;
+
+use crate::misc::maybe_uninit_write;
+
/// Encode u64 as varint.
/// Panics if buffer length is less than 10.
#[inline]
-pub fn encode_varint64(mut value: u64, buf: &mut [u8]) -> usize {
+pub fn encode_varint64(mut value: u64, buf: &mut [MaybeUninit<u8>]) -> usize {
assert!(buf.len() >= 10);
unsafe {
let mut i = 0;
while (value & !0x7F) > 0 {
- *buf.get_unchecked_mut(i) = ((value & 0x7F) | 0x80) as u8;
+ maybe_uninit_write(buf.get_unchecked_mut(i), ((value & 0x7F) | 0x80) as u8);
value >>= 7;
i += 1;
}
- *buf.get_unchecked_mut(i) = value as u8;
+ maybe_uninit_write(buf.get_unchecked_mut(i), value as u8);
i + 1
}
}
@@ -19,17 +23,17 @@ pub fn encode_varint64(mut value: u64, buf: &mut [u8]) -> usize {
/// Encode u32 value as varint.
/// Panics if buffer length is less than 5.
#[inline]
-pub fn encode_varint32(mut value: u32, buf: &mut [u8]) -> usize {
+pub fn encode_varint32(mut value: u32, buf: &mut [MaybeUninit<u8>]) -> usize {
assert!(buf.len() >= 5);
unsafe {
let mut i = 0;
while (value & !0x7F) > 0 {
- *buf.get_unchecked_mut(i) = ((value & 0x7F) | 0x80) as u8;
+ maybe_uninit_write(buf.get_unchecked_mut(i), ((value & 0x7F) | 0x80) as u8);
value >>= 7;
i += 1;
}
- *buf.get_unchecked_mut(i) = value as u8;
+ maybe_uninit_write(buf.get_unchecked_mut(i), value as u8);
i + 1
}
}