rle
This commit is contained in:
commit
0100f92504
5 changed files with 69 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
|
@ -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"
|
||||||
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "text-compression"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
15
src/main.rs
Normal file
15
src/main.rs
Normal file
|
|
@ -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(())
|
||||||
|
}
|
||||||
40
src/rle.rs
Normal file
40
src/rle.rs
Normal file
|
|
@ -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<Self::Item> {
|
||||||
|
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,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue