1
0
Fork 0
mirror of https://codeberg.org/icewind/bitbuffer.git synced 2026-06-03 16:44:06 +02:00

add reserve_byte_length

This commit is contained in:
Robin Appelman 2021-07-18 16:37:35 +02:00
commit c090180a14
3 changed files with 26 additions and 2 deletions

View file

@ -329,6 +329,9 @@ impl<'a, E: Endianness> FixedWriteBuffer<'a, E> {
/// Push up to an usize worth of bits
fn push_bits(&mut self, bits: usize, count: usize) {
if count == 0 {
return;
}
debug_assert!(count < USIZE_BITS - 8);
assert!(self.bit_len + count <= self.bit_size);

View file

@ -305,6 +305,27 @@ where
let start = tail.bit_len();
body_fn(&mut tail)?;
let end = tail.bit_len();
head.write_sized(&(end - start), length_bit_size)
let bit_len = end - start;
head.write_sized(&bit_len, length_bit_size)
}
/// Write the length in bytes of a section before the section, the section will be 0 padded to an even byte length
pub fn reserve_byte_length<F: Fn(&mut BitWriteStream<E>) -> Result<()>>(
&mut self,
length_bit_size: usize,
body_fn: F,
) -> Result<()> {
let (mut head, mut tail) = self.reserve(length_bit_size);
let start = tail.bit_len();
body_fn(&mut tail)?;
let end = tail.bit_len();
let bit_len = end - start;
let pad_len = (8 - (bit_len & 7)) & 7;
tail.push_bits(0, pad_len);
let byte_len = (bit_len + pad_len) / 8;
head.write_sized(&byte_len, length_bit_size)
}
}