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

expose 'reserve'

This commit is contained in:
Robin Appelman 2021-07-20 13:54:07 +02:00
commit e7617dea76
2 changed files with 20 additions and 8 deletions

View file

@ -171,7 +171,7 @@ impl From<FromUtf8Error> for BitError {
}
/// Either the read bits in the requested format or a [`BitError`]
pub type Result<T> = std::result::Result<T, BitError>;
pub type Result<T, E = BitError> = std::result::Result<T, E>;
/// Get the number of bits required to read a type from stream
///

View file

@ -291,12 +291,18 @@ where
/// Reserve some bits to be written later by splitting of two parts
///
/// This allows skipping a few bits to write later
fn reserve(&mut self, count: usize) -> (BitWriteStream<E>, BitWriteStream<E>) {
pub fn reserve<
Err,
F: Fn(&mut BitWriteStream<E>, &mut BitWriteStream<E>) -> Result<(), Err>,
>(
&mut self,
count: usize,
body_fn: F,
) -> Result<(), Err> {
let (head, tail) = self.buffer.reserve(count);
(
BitWriteStream { buffer: head },
BitWriteStream { buffer: tail },
)
let mut head = BitWriteStream { buffer: head };
let mut tail = BitWriteStream { buffer: tail };
body_fn(&mut head, &mut tail)
}
/// Write the length of a section before the section
@ -305,7 +311,10 @@ where
length_bit_size: usize,
body_fn: F,
) -> Result<()> {
let (mut head, mut tail) = self.reserve(length_bit_size);
let (head, tail) = self.buffer.reserve(length_bit_size);
let mut head = BitWriteStream { buffer: head };
let mut tail = BitWriteStream { buffer: tail };
let start = tail.bit_len();
body_fn(&mut tail)?;
let end = tail.bit_len();
@ -319,7 +328,10 @@ where
length_bit_size: usize,
body_fn: F,
) -> Result<()> {
let (mut head, mut tail) = self.reserve(length_bit_size);
let (head, tail) = self.buffer.reserve(length_bit_size);
let mut head = BitWriteStream { buffer: head };
let mut tail = BitWriteStream { buffer: tail };
let start = tail.bit_len();
body_fn(&mut tail)?;
let end = tail.bit_len();