commit 0100f925047cf052ad4d8869c2817618c58d391a Author: mehbark Date: Thu Oct 2 14:33:54 2025 -0400 rle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..3e9f65d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "text-compression" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..bfe2552 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "text-compression" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..669c29b --- /dev/null +++ b/src/main.rs @@ -0,0 +1,15 @@ +use std::io::{self, Read}; + +mod rle; + +fn main() -> Result<(), io::Error> { + let mut buf = Vec::new(); + let len_src = io::stdin().read_to_end(&mut buf)?; + + println!("Original size: {len_src}"); + + let len_rle = rle::Encoder::new(&buf).count() * 2; + println!("Rle'd size: {len_rle}"); + + Ok(()) +} diff --git a/src/rle.rs b/src/rle.rs new file mode 100644 index 0000000..47de42a --- /dev/null +++ b/src/rle.rs @@ -0,0 +1,40 @@ +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct Run { + pub count: u8, + pub byte: u8, +} + +#[derive(Debug, Clone)] +pub struct Encoder<'src> { + src: &'src [u8], +} + +impl<'src> Encoder<'src> { + pub fn new(src: &'src [u8]) -> Self { + Self { src } + } +} + +impl Iterator for Encoder<'_> { + type Item = Run; + + fn next(&mut self) -> Option { + let &byte = self.src.first()?; + + let (count, _) = self + .src + .iter() + .copied() + .take(256) + .enumerate() + .find(|&(_i, c)| c != byte) + .unwrap_or((self.src.len(), 0)); + + self.src = &self.src[count..]; + + Some(Run { + count: count.try_into().unwrap(), + byte, + }) + } +}