struct BitWriter {
bytes: Vec<u8>,
last: u8,
w: u32,
}Fields§
§bytes: Vec<u8>§last: u8§w: u32Implementations§
Source§impl BitWriter
impl BitWriter
Sourcefn push_bit(&mut self, b: bool)
fn push_bit(&mut self, b: bool)
Examples found in repository?
crates/competitive/src/tools/coding.rs (line 259)
256 fn output_tree(t: &HuffmanTree, buf: &mut BitWriter) {
257 match t {
258 HuffmanTree::Leaf(i) => {
259 buf.push_bit(false);
260 buf.push_u8(*i);
261 }
262 HuffmanTree::Node(l, r) => {
263 buf.push_bit(true);
264 output_tree(l, buf);
265 output_tree(r, buf);
266 }
267 }
268 }Sourcefn push_u8(&mut self, b: u8)
fn push_u8(&mut self, b: u8)
Examples found in repository?
crates/competitive/src/tools/coding.rs (line 260)
256 fn output_tree(t: &HuffmanTree, buf: &mut BitWriter) {
257 match t {
258 HuffmanTree::Leaf(i) => {
259 buf.push_bit(false);
260 buf.push_u8(*i);
261 }
262 HuffmanTree::Node(l, r) => {
263 buf.push_bit(true);
264 output_tree(l, buf);
265 output_tree(r, buf);
266 }
267 }
268 }Sourcefn push_u64(&mut self, b: u64, c: u32)
fn push_u64(&mut self, b: u64, c: u32)
Examples found in repository?
crates/competitive/src/tools/coding.rs (line 309)
244fn huffman_coding(bytes: &[u8]) -> Vec<u8> {
245 fn make_table(t: &HuffmanTree, code: u64, len: u32, table: &mut [(u64, u32)]) {
246 match t {
247 HuffmanTree::Leaf(i) => {
248 table[*i as usize] = (code, len.max(1));
249 }
250 HuffmanTree::Node(l, r) => {
251 make_table(l, code << 1, len + 1, table);
252 make_table(r, (code << 1) | 1, len + 1, table);
253 }
254 }
255 }
256 fn output_tree(t: &HuffmanTree, buf: &mut BitWriter) {
257 match t {
258 HuffmanTree::Leaf(i) => {
259 buf.push_bit(false);
260 buf.push_u8(*i);
261 }
262 HuffmanTree::Node(l, r) => {
263 buf.push_bit(true);
264 output_tree(l, buf);
265 output_tree(r, buf);
266 }
267 }
268 }
269
270 let mut freq = [0usize; 256];
271 for &b in &bytes.len().to_le_bytes() {
272 freq[b as usize] += 1;
273 }
274 for &b in bytes {
275 freq[b as usize] += 1;
276 }
277 let mut heap = BinaryHeap::new();
278 for (i, &f) in freq.iter().enumerate() {
279 if f > 0 {
280 heap.push(Reverse((f, 0usize, HuffmanTree::Leaf(i as _))));
281 }
282 }
283 let t = if heap.is_empty() {
284 HuffmanTree::Node(
285 Box::new(HuffmanTree::Leaf(0)),
286 Box::new(HuffmanTree::Leaf(0)),
287 )
288 } else {
289 loop {
290 let Reverse((f, c, t)) = heap.pop().unwrap();
291 if let Some(Reverse((ff, cc, tt))) = heap.pop() {
292 heap.push(Reverse((
293 f + ff,
294 c.max(cc) + 1,
295 HuffmanTree::Node(Box::new(t), Box::new(tt)),
296 )));
297 } else {
298 break t;
299 }
300 }
301 };
302
303 let mut table = vec![(0u64, 0u32); 256];
304 make_table(&t, 0, 0, &mut table);
305 let mut buf = BitWriter::default();
306 output_tree(&t, &mut buf);
307 for &b in &bytes.len().to_le_bytes() {
308 let (x, y) = table[b as usize];
309 buf.push_u64(x, y);
310 }
311 for &b in bytes {
312 let (x, y) = table[b as usize];
313 buf.push_u64(x, y);
314 }
315 buf.into_inner()
316}Sourcefn into_inner(self) -> Vec<u8> ⓘ
fn into_inner(self) -> Vec<u8> ⓘ
Examples found in repository?
crates/competitive/src/tools/coding.rs (line 315)
244fn huffman_coding(bytes: &[u8]) -> Vec<u8> {
245 fn make_table(t: &HuffmanTree, code: u64, len: u32, table: &mut [(u64, u32)]) {
246 match t {
247 HuffmanTree::Leaf(i) => {
248 table[*i as usize] = (code, len.max(1));
249 }
250 HuffmanTree::Node(l, r) => {
251 make_table(l, code << 1, len + 1, table);
252 make_table(r, (code << 1) | 1, len + 1, table);
253 }
254 }
255 }
256 fn output_tree(t: &HuffmanTree, buf: &mut BitWriter) {
257 match t {
258 HuffmanTree::Leaf(i) => {
259 buf.push_bit(false);
260 buf.push_u8(*i);
261 }
262 HuffmanTree::Node(l, r) => {
263 buf.push_bit(true);
264 output_tree(l, buf);
265 output_tree(r, buf);
266 }
267 }
268 }
269
270 let mut freq = [0usize; 256];
271 for &b in &bytes.len().to_le_bytes() {
272 freq[b as usize] += 1;
273 }
274 for &b in bytes {
275 freq[b as usize] += 1;
276 }
277 let mut heap = BinaryHeap::new();
278 for (i, &f) in freq.iter().enumerate() {
279 if f > 0 {
280 heap.push(Reverse((f, 0usize, HuffmanTree::Leaf(i as _))));
281 }
282 }
283 let t = if heap.is_empty() {
284 HuffmanTree::Node(
285 Box::new(HuffmanTree::Leaf(0)),
286 Box::new(HuffmanTree::Leaf(0)),
287 )
288 } else {
289 loop {
290 let Reverse((f, c, t)) = heap.pop().unwrap();
291 if let Some(Reverse((ff, cc, tt))) = heap.pop() {
292 heap.push(Reverse((
293 f + ff,
294 c.max(cc) + 1,
295 HuffmanTree::Node(Box::new(t), Box::new(tt)),
296 )));
297 } else {
298 break t;
299 }
300 }
301 };
302
303 let mut table = vec![(0u64, 0u32); 256];
304 make_table(&t, 0, 0, &mut table);
305 let mut buf = BitWriter::default();
306 output_tree(&t, &mut buf);
307 for &b in &bytes.len().to_le_bytes() {
308 let (x, y) = table[b as usize];
309 buf.push_u64(x, y);
310 }
311 for &b in bytes {
312 let (x, y) = table[b as usize];
313 buf.push_u64(x, y);
314 }
315 buf.into_inner()
316}Trait Implementations§
Auto Trait Implementations§
impl Freeze for BitWriter
impl RefUnwindSafe for BitWriter
impl Send for BitWriter
impl Sync for BitWriter
impl Unpin for BitWriter
impl UnwindSafe for BitWriter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more