use bit_vec::BitVec;
use std::io::{Read, Seek, SeekFrom, Write};
pub struct AdaptiveHuffmanTree {
max_freq: usize,
num_symb: usize,
node_count: usize,
root: usize,
freq: Vec<usize>,
parent: Vec<usize>,
son: Vec<usize>,
symb_map: Vec<usize>,
}
pub struct AdaptiveHuffmanCoder {
tree: AdaptiveHuffmanTree,
bits: BitVec,
ptr: usize,
}
pub struct AdaptiveHuffmanDecoder {
tree: AdaptiveHuffmanTree,
bits: BitVec,
ptr: usize,
}
const P_LEN: [u8; 64] = [
0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
];
const P_CODE: [u8; 64] = [
0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C, 0xA0, 0xA4, 0xA8,
0xAC, 0xB0, 0xB4, 0xB8, 0xBC, 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA,
0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
];
const D_LEN: [u8; 256] = [
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
];
const D_CODE: [u8; 256] = [
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D,
0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12,
0x12, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17,
0x17, 0x17, 0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, 0x20,
0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29,
0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
];
impl AdaptiveHuffmanTree {
pub fn create(num_symbols: usize) -> Self {
let mut ans = Self {
max_freq: 0x8000,
num_symb: num_symbols,
node_count: 2 * num_symbols - 1,
root: 2 * num_symbols - 2,
freq: vec![0; 2 * num_symbols],
parent: vec![0; 2 * num_symbols - 1],
son: vec![0; 2 * num_symbols - 1],
symb_map: vec![0; num_symbols],
};
for i in 0..ans.num_symb {
ans.freq[i] = 1;
ans.son[i] = i + ans.node_count;
ans.symb_map[i] = i;
}
let mut i = 0;
let mut j = ans.num_symb;
while j <= ans.root {
ans.freq[j] = ans.freq[i] + ans.freq[i + 1];
ans.son[j] = i;
ans.parent[i] = j;
ans.parent[i + 1] = j;
i += 2;
j += 1;
}
ans.freq[ans.node_count] = 0xffff;
ans.parent[ans.root] = 0;
ans
}
fn rebuild_huff(&mut self) {
let mut j = 0;
for i in 0..self.node_count {
if self.son[i] >= self.node_count {
self.freq[j] = (self.freq[i] + 1) / 2;
self.son[j] = self.son[i];
j += 1;
}
}
let mut i: usize = 0; j = self.num_symb; let mut k: usize; let mut f: usize; let mut l: usize; while j < self.node_count {
k = i + 1;
f = self.freq[i] + self.freq[k];
self.freq[j] = f;
k = j - 1;
while f < self.freq[k] {
k -= 1;
}
k += 1;
l = (j - k) * 2;
for kp in (k..k + l).rev() {
self.freq[kp + 1] = self.freq[kp]
}
self.freq[k] = f;
for kp in (k..k + l).rev() {
self.son[kp + 1] = self.son[kp]
}
self.son[k] = i;
i += 2; j += 1; }
for i in 0..self.node_count {
k = self.son[i];
if k >= self.node_count {
self.symb_map[k - self.node_count] = i;
} else {
self.parent[k] = i;
self.parent[k + 1] = i;
}
}
}
fn update(&mut self, c0: i16) {
let mut i: usize;
let mut j: usize;
let mut k: usize;
let mut l: usize;
if self.freq[self.root] == self.max_freq {
self.rebuild_huff()
}
let mut c = self.symb_map[c0 as usize];
loop {
self.freq[c] += 1;
k = self.freq[c];
l = c + 1;
if k > self.freq[l] {
while k > self.freq[l] {
l += 1;
}
l -= 1;
self.freq[c] = self.freq[l];
self.freq[l] = k;
i = self.son[c];
if i < self.node_count {
self.parent[i] = l;
self.parent[i + 1] = l;
} else {
self.symb_map[i - self.node_count] = l;
}
j = self.son[l];
self.son[l] = i;
if j < self.node_count {
self.parent[j] = c;
self.parent[j + 1] = c;
} else {
self.symb_map[j - self.node_count] = c;
}
self.son[c] = j;
c = l;
}
c = self.parent[c];
if c == 0 {
break; }
}
}
}
#[allow(dead_code)]
impl AdaptiveHuffmanCoder {
pub fn create(num_symbols: usize) -> Self {
Self {
tree: AdaptiveHuffmanTree::create(num_symbols),
bits: BitVec::new(),
ptr: 0,
}
}
fn drop_leading_bits(&mut self) {
let cpy = self.bits.clone();
self.bits = BitVec::new();
for i in self.ptr..cpy.len() {
self.bits.push(cpy.get(i).unwrap());
}
self.ptr = 0;
}
fn put_code<W: Write + Seek>(&mut self, num_bits: u16, mut code: u16, writer: &mut W) {
for _i in 0..num_bits {
self.bits.push(code & 0x8000 > 0);
code <<= 1;
self.ptr += 1;
}
let bytes = self.bits.to_bytes();
writer.write(bytes.as_slice()).expect("write err");
if self.bits.len() % 8 > 0 {
writer.seek(SeekFrom::Current(-1)).expect("seek err");
self.ptr = 8 * (self.bits.len() / 8);
self.drop_leading_bits();
} else {
self.bits = BitVec::new();
self.ptr = 0;
}
}
pub fn encode_char<W: Write + Seek>(&mut self, c: u16, writer: &mut W) {
let mut code: u16 = 0;
let mut num_bits: u16 = 0;
let mut curr_node: usize = self.tree.symb_map[c as usize];
loop {
code >>= 1;
code += (curr_node as u16 & 1) << 15;
num_bits += 1;
curr_node = self.tree.parent[curr_node];
if curr_node == self.tree.root {
break;
}
}
self.put_code(num_bits, code, writer);
self.tree.update(c as i16); }
pub fn encode_position<W: Write + Seek>(&mut self, c: u16, writer: &mut W) {
let i = (c >> 6) as usize;
self.put_code(P_LEN[i] as u16, (P_CODE[i] as u16) << 8, writer);
self.put_code(6, (c & 0x3f) << 10, writer);
}
}
impl AdaptiveHuffmanDecoder {
pub fn create(num_symbols: usize) -> Self {
Self {
tree: AdaptiveHuffmanTree::create(num_symbols),
bits: BitVec::new(),
ptr: 0,
}
}
fn drop_leading_bits(&mut self) {
let cpy = self.bits.clone();
self.bits = BitVec::new();
for i in self.ptr..cpy.len() {
self.bits.push(cpy.get(i).unwrap());
}
self.ptr = 0;
}
fn get_bit<R: Read>(&mut self, reader: &mut R) -> Result<u8, std::io::Error> {
match self.bits.get(self.ptr) {
Some(bit) => {
self.ptr += 1;
Ok(bit as u8)
}
None => {
let mut by: [u8; 1] = [0];
match reader.read_exact(&mut by) {
Ok(()) => {
if self.bits.len() > 512 {
self.drop_leading_bits();
}
self.bits.append(&mut BitVec::from_bytes(&by));
self.get_bit(reader)
}
Err(e) => Err(e),
}
}
}
}
fn get_byte<R: Read>(&mut self, bytes: &mut R) -> Result<u8, std::io::Error> {
let mut ans: u8 = 0;
for _i in 0..8 {
ans <<= 1;
ans |= self.get_bit(bytes)?;
}
Ok(ans)
}
pub fn decode_char<R: Read>(&mut self, reader: &mut R) -> Result<i16, std::io::Error> {
let mut c: usize = self.tree.son[self.tree.root];
while c < self.tree.node_count {
c += self.get_bit(reader)? as usize;
c = self.tree.son[c];
}
c -= self.tree.node_count;
self.tree.update(c as i16); Ok(c as i16)
}
pub fn decode_position<R: Read>(&mut self, reader: &mut R) -> Result<u16, std::io::Error> {
let mut first8 = self.get_byte(reader)? as u16;
let upper6 = (D_CODE[first8 as usize] as u16) << 6;
let coded_bits = D_LEN[first8 as usize] as u16;
for _i in 0..coded_bits - 2 {
first8 <<= 1;
first8 += self.get_bit(reader)? as u16;
}
Ok(upper6 | (first8 & 0x3f))
}
}