#![forbid(unsafe_code)]
use super::errors::EncodeError;
pub struct SliceWriter<'a> {
buf: &'a mut [bool],
pos: usize,
}
impl<'a> SliceWriter<'a> {
#[inline]
pub fn new(buf: &'a mut [bool]) -> Self {
Self { buf, pos: 0 }
}
#[inline]
pub fn len(&self) -> usize {
self.pos
}
#[inline]
pub fn is_empty(&self) -> bool {
self.pos == 0
}
#[inline]
pub fn push(&mut self, value: bool) -> Result<(), EncodeError> {
let slot = self
.buf
.get_mut(self.pos)
.ok_or(EncodeError::BufferTooSmall)?;
*slot = value;
self.pos += 1;
Ok(())
}
#[inline]
pub fn push_run(&mut self, value: bool, count: usize) -> Result<(), EncodeError> {
let end = self
.pos
.checked_add(count)
.ok_or(EncodeError::BufferTooSmall)?;
let slice = self
.buf
.get_mut(self.pos..end)
.ok_or(EncodeError::BufferTooSmall)?;
slice.fill(value);
self.pos = end;
Ok(())
}
#[inline]
pub fn extend<I: IntoIterator<Item = bool>>(&mut self, iter: I) -> Result<(), EncodeError> {
for value in iter {
self.push(value)?;
}
Ok(())
}
}