use crate::{bits::{get_bit, set_bit}, builder::ByteBuilder, traits::Builder};
pub struct BitBuilder {
pub bytes: Vec<u8>,
pub bit_offset: usize,
}
impl BitBuilder {
pub fn new() -> Self {
Self {
bytes: Vec::new(),
bit_offset: 0,
}
}
pub fn with_capacity(capacity: usize) -> Self {
Self {
bytes: Vec::with_capacity(capacity),
bit_offset: 0,
}
}
pub fn from_bytes(bytes: Vec<u8>) -> Self {
Self {
bytes,
bit_offset: 0, }
}
pub fn push_bit(&mut self, value: bool) {
if self.bytes.is_empty() {
self.bytes.push(0);
self.bit_offset = 0;
} else if self.bit_offset == 8 {
self.bytes.push(0);
self.bit_offset = 0;
}
set_bit(&mut self.bytes.last_mut().unwrap(), self.bit_offset, value);
self.bit_offset += 1;
}
}
impl Builder for BitBuilder {
fn push_u8(&mut self, value: u8) {
for i in 0..8 {
let bit = get_bit(value, i);
self.push_bit(bit);
}
}
fn as_slice(&self) -> &[u8] {
&self.bytes
}
fn build(self) -> Vec<u8> {
self.bytes
}
}
impl From<ByteBuilder> for BitBuilder {
fn from(builder: ByteBuilder) -> Self {
BitBuilder {
bytes: builder.bytes,
bit_offset: 0,
}
}
}