#![allow(dead_code)]
#[derive(Default)]
pub(crate) struct BitWriter {
bits: Vec<u8>,
}
impl BitWriter {
pub fn bit(&mut self, b: u8) {
self.bits.push(b & 1);
}
pub fn bits(&mut self, v: u32, n: u32) {
for i in (0..n).rev() {
self.bit(((v >> i) & 1) as u8);
}
}
pub fn ue(&mut self, v: u32) {
let n = v + 1;
let len = 32 - n.leading_zeros();
for _ in 0..(len - 1) {
self.bit(0);
}
self.bits(n, len);
}
#[allow(dead_code)]
pub fn uvlc(&mut self, v: u32) {
let n = v + 1;
let len = 32 - n.leading_zeros();
for _ in 0..(len - 1) {
self.bit(0);
}
self.bit(1);
if len > 1 {
self.bits(v + 1 - (1 << (len - 1)), len - 1);
}
}
pub fn align(&mut self) {
while self.bits.len() % 8 != 0 {
self.bit(0);
}
}
pub fn bytes(&self) -> Vec<u8> {
let mut out = vec![0u8; self.bits.len().div_ceil(8)];
for (i, &b) in self.bits.iter().enumerate() {
if b == 1 {
out[i / 8] |= 1 << (7 - (i % 8));
}
}
out
}
}