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

fix reserve not setting bit len correctly

This commit is contained in:
Robin Appelman 2021-07-16 21:04:07 +02:00
commit 9587c7b872
3 changed files with 117 additions and 75 deletions

View file

@ -101,6 +101,15 @@ struct ExpandWriteBuffer<'a, E: Endianness> {
bytes: *mut Vec<u8>,
endianness: PhantomData<E>,
lifetime: PhantomData<&'a u8>,
parent_bit_len: Option<&'a mut usize>,
}
impl<'a, E: Endianness> Drop for ExpandWriteBuffer<'a, E> {
fn drop(&mut self) {
if let Some(parent_bit_len) = self.parent_bit_len.take() {
*parent_bit_len = self.bit_len;
}
}
}
impl<'a, E: Endianness> ExpandWriteBuffer<'a, E> {
@ -110,6 +119,7 @@ impl<'a, E: Endianness> ExpandWriteBuffer<'a, E> {
bytes: bytes as *mut _,
endianness: PhantomData,
lifetime: PhantomData,
parent_bit_len: None,
}
}
@ -177,6 +187,7 @@ impl<'a, E: Endianness> ExpandWriteBuffer<'a, E> {
bytes: self.bytes,
endianness: PhantomData,
lifetime: PhantomData,
parent_bit_len: Some(&mut self.bit_len),
},
)
}
@ -187,11 +198,13 @@ fn test_push_expand_be() {
use crate::BigEndian;
let mut buffer = vec![];
let mut write = ExpandWriteBuffer::new(&mut buffer, BigEndian);
write.push_bits(0b1101, 4);
write.push_bits(0b1, 1);
write.push_bits(0b0, 1);
write.push_bits(0b101_01010, 8);
{
let mut write = ExpandWriteBuffer::new(&mut buffer, BigEndian);
write.push_bits(0b1101, 4);
write.push_bits(0b1, 1);
write.push_bits(0b0, 1);
write.push_bits(0b101_01010, 8);
}
assert_eq!(vec![0b1101_1_0_10, 0b101010_00], buffer)
}
@ -201,11 +214,13 @@ fn test_push_expand_le() {
use crate::LittleEndian;
let mut buffer = vec![];
let mut write = ExpandWriteBuffer::new(&mut buffer, LittleEndian);
write.push_bits(0b1101, 4);
write.push_bits(0b1, 1);
write.push_bits(0b0, 1);
write.push_bits(0b101_01010, 8);
{
let mut write = ExpandWriteBuffer::new(&mut buffer, LittleEndian);
write.push_bits(0b1101, 4);
write.push_bits(0b1, 1);
write.push_bits(0b0, 1);
write.push_bits(0b101_01010, 8);
}
assert_eq!(vec![0b10_0_1_1101, 0b00101010], buffer)
}
@ -215,14 +230,16 @@ fn test_push_expand_reserve_be() {
use crate::BigEndian;
let mut buffer = vec![];
let mut write = ExpandWriteBuffer::new(&mut buffer, BigEndian);
write.push_bits(0b1101, 4);
{
let mut write = ExpandWriteBuffer::new(&mut buffer, BigEndian);
write.push_bits(0b1101, 4);
let (mut reserved, mut rest) = write.reserve(2);
rest.push_bits(0b101_01010, 8);
let (mut reserved, mut rest) = write.reserve(2);
rest.push_bits(0b101_01010, 8);
reserved.push_bits(0b1, 1);
reserved.push_bits(0b0, 1);
reserved.push_bits(0b1, 1);
reserved.push_bits(0b0, 1);
}
assert_eq!(vec![0b1101_1_0_10, 0b101010_00], buffer)
}
@ -232,14 +249,16 @@ fn test_push_expand_reserve_le() {
use crate::LittleEndian;
let mut buffer = vec![];
let mut write = ExpandWriteBuffer::new(&mut buffer, LittleEndian);
write.push_bits(0b1101, 4);
{
let mut write = ExpandWriteBuffer::new(&mut buffer, LittleEndian);
write.push_bits(0b1101, 4);
let (mut reserved, mut rest) = write.reserve(2);
rest.push_bits(0b101_01010, 8);
let (mut reserved, mut rest) = write.reserve(2);
rest.push_bits(0b101_01010, 8);
reserved.push_bits(0b1, 1);
reserved.push_bits(0b0, 1);
reserved.push_bits(0b1, 1);
reserved.push_bits(0b0, 1);
}
assert_eq!(vec![0b10_0_1_1101, 0b00101010], buffer)
}
@ -249,21 +268,22 @@ fn test_push_expand_reserve_resize() {
use crate::LittleEndian;
let mut buffer = Vec::with_capacity(1);
{
let mut write = ExpandWriteBuffer::new(&mut buffer, LittleEndian);
write.push_bits(0b1101, 4);
let mut write = ExpandWriteBuffer::new(&mut buffer, LittleEndian);
write.push_bits(0b1101, 4);
let (mut reserved, mut rest) = write.reserve(2);
rest.push_bits(0b10, 2);
let (mut reserved, mut rest) = write.reserve(2);
rest.push_bits(0b10, 2);
// trigger a resize/reallocation
for _ in 0..128 {
rest.push_bits(0x55, 8);
}
// trigger a resize/reallocation
for _ in 0..128 {
rest.push_bits(0x55, 8);
reserved.push_bits(0b1, 1);
reserved.push_bits(0b0, 1);
}
reserved.push_bits(0b1, 1);
reserved.push_bits(0b0, 1);
assert_eq!([0b10_0_1_1101, 0x55], buffer[0..2])
}