boytacean_encoding/
rle.rs

1use boytacean_common::error::Error;
2
3use crate::codec::Codec;
4
5pub struct Rle;
6
7impl Codec for Rle {
8    type EncodeOptions = ();
9    type DecodeOptions = ();
10
11    fn encode(data: &[u8], _options: &Self::EncodeOptions) -> Result<Vec<u8>, Error> {
12        if data.is_empty() {
13            return Ok(Vec::new());
14        }
15
16        let mut encoded = Vec::new();
17        let mut prev_byte = data[0];
18        let mut count = 1;
19
20        for &byte in data.iter().skip(1) {
21            if count != 255 && byte == prev_byte {
22                count += 1;
23            } else {
24                encoded.push(prev_byte);
25                encoded.push(count);
26                prev_byte = byte;
27                count = 1;
28            }
29        }
30        encoded.push(prev_byte);
31        encoded.push(count);
32
33        Ok(encoded)
34    }
35
36    fn decode(data: &[u8], _options: &Self::DecodeOptions) -> Result<Vec<u8>, Error> {
37        let mut decoded = Vec::new();
38
39        let mut iter = data.iter();
40        while let Some(&byte) = iter.next() {
41            if let Some(&count) = iter.next() {
42                decoded.extend(std::iter::repeat(byte).take(count as usize));
43            }
44        }
45
46        Ok(decoded)
47    }
48}
49
50pub fn encode_rle(data: &[u8]) -> Result<Vec<u8>, Error> {
51    Rle::encode(data, &())
52}
53
54pub fn decode_rle(data: &[u8]) -> Result<Vec<u8>, Error> {
55    Rle::decode(data, &())
56}