use data::*;
use buffer::*;
use std::io::{Read, Write};
use std::mem;
pub trait BitRead: Sized {
fn read_bit(&mut self) -> Result<bool>;
fn read_byte(&mut self) -> Result<u8> {
let mut byte = 0;
for bit in (0..8).rev() {
if self.read_bit()? {
byte |= 1 << bit;
}
}
Ok(byte)
}
fn read<T: BitStore>(&mut self) -> Result<T> {
T::read_from(self)
}
fn read_using<T, C>(&mut self, converter: &C) -> Result<T> where C: BitConvert<T> {
converter.read_value_from(self)
}
fn read_to_buffer<T, B>(&mut self, mut buffer: B) -> usize where T: BitStore, B: AsMut<[T]> {
let mut read = 0;
'read: for item in buffer.as_mut().iter_mut() {
match self.read() {
Ok(value) => *item = value,
Err(_) => break 'read,
}
read += 1;
}
read
}
fn read_to_buffer_using<T, B, C>(&mut self, mut buffer: B, converter: &C) -> usize where B: AsMut<[T]>, C: BitConvert<T> {
let mut read = 0;
'read: for item in buffer.as_mut().iter_mut() {
match self.read_using(converter) {
Ok(value) => *item = value,
Err(_) => break 'read,
}
read += 1;
}
read
}
}
pub trait BitWrite: Sized {
fn write_bit(&mut self, bit: bool) -> Result<()>;
fn write_byte(&mut self, byte: u8) -> Result<()> {
for bit in (0..8).rev() {
self.write_bit((byte >> bit) & 1 == 1)?;
}
Ok(())
}
fn write<T: BitStore>(&mut self, value: &T) -> Result<()> {
value.write_to(self)
}
fn write_using<T, C>(&mut self, value: &T, converter: &C) -> Result<()> where C: BitConvert<T> {
converter.write_value_to(value, self)
}
fn write_buffer<T, B>(&mut self, buffer: B) -> usize where T: BitStore, B: AsRef<[T]> {
let mut written = 0;
'write: for item in buffer.as_ref().iter() {
match self.write(item) {
Ok(()) => written += 1,
Err(_) => break 'write,
}
}
written
}
fn write_buffer_using<T, B, C>(&mut self, buffer: B, converter: &C) -> usize where B: AsRef<[T]>, C: BitConvert<T> {
let mut written = 0;
'write: for item in buffer.as_ref().iter() {
match self.write_using(item, converter) {
Ok(()) => written += 1,
Err(_) => break 'write,
}
}
written
}
}
pub struct BitReader<T: Read> {
input: T,
buffer: BitBuffer,
precision: Precision,
closed: bool,
}
impl<T: Read> BitReader<T> {
pub fn new(reader: T) -> BitReader<T> {
BitReader::new_with_precision(reader, Precision::Byte)
}
pub fn new_with_precision(reader: T, precision: Precision) -> BitReader<T> {
BitReader {
input: reader,
buffer: BitBuffer::new(),
precision,
closed: false,
}
}
pub fn is_aligned(&self) -> bool {
self.buffer.is_aligned()
}
pub fn align(&mut self) -> Result<()> {
while !self.is_aligned() {
self.read_bit()?;
}
Ok(())
}
fn update(&mut self) {
if !self.closed && self.buffer.can_take_byte() {
let mut buf: Vec<u8> = Vec::new();
for _ in 0..self.buffer.byte_space() {
buf.push(0);
}
if let Ok(n) = self.input.read(&mut buf) {
if n > 0 {
for i in 0..n {
self.buffer.push_right(buf[i]).unwrap();
}
return;
}
}
self.close();
}
}
fn close(&mut self) {
self.closed = true;
if let Precision::Bit = self.precision {
loop {
if self.buffer.pop_bit_right().unwrap_or(true) {
break;
}
}
self.precision = Precision::Byte;
}
}
}
impl<T: Read> BitRead for BitReader<T> {
fn read_bit(&mut self) -> Result<bool> {
self.update();
self.buffer.pop_bit_left()
}
fn read_byte(&mut self) -> Result<u8> {
self.update();
self.buffer.pop_left()
}
}
pub struct BitWriter<T: Write> {
output: Option<T>,
buffer: BitBuffer,
precision: Precision,
}
impl<T: Write> BitWriter<T> {
pub fn new(writer: T) -> BitWriter<T> {
BitWriter::new_with_precision(writer, Precision::Byte)
}
pub fn new_with_precision(writer: T, precision: Precision) -> BitWriter<T> {
BitWriter {
output: Some(writer),
buffer: BitBuffer::new(),
precision,
}
}
pub fn is_aligned(&self) -> bool {
self.buffer.is_aligned()
}
pub fn align(&mut self) -> Result<()> {
while !self.is_aligned() {
self.write_bit(false)?;
}
Ok(())
}
pub fn flush(&mut self) -> Result<usize> {
if self.output.is_some() {
let mut buf: Vec<u8> = Vec::new();
while let Ok(byte) = self.buffer.pop_left() {
buf.push(byte);
}
match self.output.as_mut().unwrap().write(&buf) {
Ok(n) if n == buf.len() => Ok(self.buffer.bits() as usize),
_ => {
self.output = None;
Err(Error::BufferClosed)
},
}
} else {
Err(Error::BufferClosed)
}
}
pub fn into_inner(mut self) -> Result<T> {
if let Err(e) = self.close_mut() {
return Err(e);
}
match mem::replace(&mut self.output, None) {
Some(v) => Ok(v),
None => Err(Error::BufferClosed),
}
}
pub fn close(mut self) -> Result<()> {
self.close_mut()?;
self.output = None;
Ok(())
}
fn close_mut(&mut self) -> Result<()> {
if self.output.is_some() {
if let Precision::Bit = self.precision {
self.buffer.push_bit_right(true)?;
self.precision = Precision::Byte;
}
while self.buffer.bits() & 7 != 0 {
self.buffer.push_bit_right(false)?;
}
self.flush().and(Ok(()))
} else {
Err(Error::BufferClosed)
}
}
}
impl<T: Write> BitWrite for BitWriter<T> {
fn write_bit(&mut self, bit: bool) -> Result<()> {
self.buffer.push_bit_right(bit)?;
self.flush()?;
Ok(())
}
fn write_byte(&mut self, byte: u8) -> Result<()> {
self.buffer.push_right(byte)?;
self.flush()?;
Ok(())
}
}
impl<T: Write> Drop for BitWriter<T> {
#[allow(unused_must_use)]
fn drop(&mut self) {
self.close_mut();
}
}