diff --git a/Cargo.toml b/Cargo.toml index 821f53b..40b3e3d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,4 @@ bitvec = "1.0.1" [dev-dependencies] quickcheck = "1" -quickcheck_macros = "1" \ No newline at end of file +quickcheck_macros = "1" diff --git a/src/id.rs b/src/id.rs new file mode 100644 index 0000000..b3e8b34 --- /dev/null +++ b/src/id.rs @@ -0,0 +1,28 @@ +use std::io::Read; + +use bitvec::prelude::{BitSlice, BitVec}; + +use crate::CompressionScheme; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct Id; + +impl CompressionScheme for Id { + type Header = (); + + fn encode(src: &[u8], buf: &mut BitVec) -> Self::Header { + buf.extend_from_bitslice(BitSlice::::from_slice(src)); + } + + fn decode(src: &BitSlice, (): &Self::Header, buf: &mut Vec) { + // TODO: is this actually fine + #[allow(clippy::unbuffered_bytes)] + for byte in src.bytes() { + buf.push(byte.unwrap()); + } + } + + fn header_size((): &Self::Header) -> usize { + 0 + } +} diff --git a/src/main.rs b/src/main.rs index 1f0d4a7..277f716 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ use std::{ mod compression_scheme; mod freq; mod huffman; +mod id; mod rle; #[cfg(test)] mod test; @@ -15,18 +16,18 @@ use bitvec::vec::BitVec; pub use compression_scheme::CompressionScheme; pub use freq::Freq; pub use huffman::Huffman; +pub use id::Id; pub use rle::Rle; fn main() -> Result<(), io::Error> { let debug = env::args().any(|arg| arg == "--debug" || arg == "-d"); let mut buf = Vec::new(); - let len_src = io::stdin().read_to_end(&mut buf)?; - - println!("Original: {len_src}"); + io::stdin().read_to_end(&mut buf)?; let mut bitbuf = BitVec::new(); + run::(&buf, &mut bitbuf, "Original", debug); run::(&buf, &mut bitbuf, "rle", debug); run::(&buf, &mut bitbuf, "freq", debug); run::(&buf, &mut bitbuf, "Huffman", debug); @@ -42,7 +43,7 @@ where bitbuf.clear(); let header = Scheme::encode(buf, bitbuf); let len_freq = Scheme::header_size(&header) + bitbuf.len().div_ceil(8); - println!("{name}'d: {len_freq}"); + println!("{name:>10}: {len_freq:>10}"); if debug { eprintln!("{name} header: {header:#?}\n"); } diff --git a/src/test.rs b/src/test.rs index bdb8643..a8fd10d 100644 --- a/src/test.rs +++ b/src/test.rs @@ -1,6 +1,6 @@ #![allow(clippy::needless_pass_by_value)] -use crate::{CompressionScheme, Freq, Huffman, Rle}; +use crate::{CompressionScheme, Freq, Huffman, Id, Rle}; use quickcheck_macros::quickcheck; #[quickcheck] @@ -17,3 +17,8 @@ fn roundtrip_rle(src: Vec) -> bool { fn roundtrip_huffman(src: Vec) -> bool { Huffman::idempotent_on(&src) } + +#[quickcheck] +fn roundtrip_id(src: Vec) -> bool { + Id::idempotent_on(&src) +}